我目前正在学习xml和DTD,我遇到了一个DTD,这有点令人费解。
<!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的代码由这个伪代码表示。
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我有没有漏掉什么??
发布于 2017-10-17 17:01:25
首先,这是合法的吗?
是的,部分DTD是合法的。(我说“部分”是因为agility没有元素声明。)
这意味着foo可以包含零或多个superpowers,而superpowers必须包含一个foo或agility。
例如,根据DTD,这是有效的.
<foo>
<superpowers>
<foo/>
</superpowers>
<superpowers>
<foo>
<superpowers>
<foo/>
</superpowers>
</foo>
</superpowers>
</foo>您所得到的错误是有意义的;您不能foo.append(superpowers),因为superpowers已经是foo的父级。(就像哈里·邓恩( Harry )说的那样,“劳埃德,你不能把两枚邮票盖上三倍!”)
您需要做的是创建一个全新的foo并将superpowers附加到其中。
例如..。
if x :
foo = xml.Element("foo")
superpowers.append(foo)
foo2 = xml.Element("foo")
foo2.append(superpowers)你最终会得到的是(添加评论试图帮助澄清).
<foo><!--foo2-->
<superpowers>
<foo><!--original foo--></foo>
</superpowers>
</foo>https://stackoverflow.com/questions/46782989
复制相似问题