首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子包含父DTD/xml的实例

子包含父DTD/xml的实例
EN

Stack Overflow用户
提问于 2017-10-17 05:22:13
回答 1查看 151关注 0票数 0

我目前正在学习xml和DTD,我遇到了一个DTD,这有点令人费解。

代码语言:javascript
复制
<!ELEMENT foo (superpowers*)>
<!ELEMENT superpowers ( foo | agility )>

首先,这是合法的吗?

每当我试图生成相应的xml文件时,都会得到以下错误:

追溯(最近一次调用):文件"test.py",第12行,在foo.append(超能力)\n文件"src/lxml/etree.pyx“中,第832行,在lxml.etree._Element.append文件”src/lxml/aphelpers.pxi“中,第1283行,在lxml.etree._appendChild ValueError:无法将父节点追加到自身

我在python中用于生成xml的代码由这个伪代码表示。

代码语言:javascript
复制
from lxml import etree as xml
import pprint

foo = xml.Element("foo")
superpowers = xml.Element("superpowers")

x = True

if x :
  foo = xml.Element("foo")
  superpowers.append(foo)
  foo.append(superpowers)

else :
  agility = xml.Element("agility")
  superpowers.append(agility)
  foo.append(superpowers)

tree = xml.ElementTree(foo)
print (xml.tostring(tree, pretty_print=True))

with open("foo.xml", "wb") as op:
  tree.write(op, pretty_print=True) #pretty_print used for indentation

我有没有漏掉什么??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 17:01:25

首先,这是合法的吗?

是的,部分DTD是合法的。(我说“部分”是因为agility没有元素声明。)

这意味着foo可以包含零或多个superpowers,而superpowers必须包含一个fooagility

例如,根据DTD,这是有效的.

代码语言:javascript
复制
<foo>
    <superpowers>
        <foo/>
    </superpowers>
    <superpowers>
        <foo>
            <superpowers>
                <foo/>
            </superpowers>
        </foo>
    </superpowers>
</foo>

您所得到的错误是有意义的;您不能foo.append(superpowers),因为superpowers已经是foo的父级。(就像哈里·邓恩( Harry )说的那样,“劳埃德,你不能把两枚邮票盖上三倍!”)

您需要做的是创建一个全新的foo并将superpowers附加到其中。

例如..。

代码语言:javascript
复制
if x :
  foo = xml.Element("foo")
  superpowers.append(foo)
  foo2 = xml.Element("foo")
  foo2.append(superpowers)

你最终会得到的是(添加评论试图帮助澄清).

代码语言:javascript
复制
<foo><!--foo2-->
    <superpowers>
        <foo><!--original foo--></foo>
    </superpowers>    
</foo>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46782989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档