子项包含父项的一个实例 DTD/xml
Child contains an instance of the parent DTD/xml
我目前正在学习 xml 和 DTD,我遇到了一个有点令人费解的 DTD。
<!ELEMENT foo (superpowers*)>
<!ELEMENT superpowers ( foo | agility )>
首先这个DTD合法吗?
每当我尝试生成相应的 xml 文件时,我都会收到以下错误,
Traceback (most recent call last): File "test.py", line 12, in
foo.append(superpowers)\n File "src/lxml/etree.pyx", line 832, in lxml.etree._Element.append File "src/lxml/apihelpers.pxi", line
1283, in lxml.etree._appendChild ValueError: cannot append parent to
itself
我在 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
我是不是忽略了什么??
<!ELEMENT foo (superpowers*)>
<!ELEMENT superpowers ( foo | agility )>
Firstly is this DTD legal ?
是的,部分 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
的父级。 (正如哈利·邓恩所说,“你不能在劳埃德的双重印章上盖三重印章!”。)
您需要做的是创建一个全新的 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>
我目前正在学习 xml 和 DTD,我遇到了一个有点令人费解的 DTD。
<!ELEMENT foo (superpowers*)>
<!ELEMENT superpowers ( foo | agility )>
首先这个DTD合法吗?
每当我尝试生成相应的 xml 文件时,我都会收到以下错误,
Traceback (most recent call last): File "test.py", line 12, in foo.append(superpowers)\n File "src/lxml/etree.pyx", line 832, in lxml.etree._Element.append File "src/lxml/apihelpers.pxi", line 1283, in lxml.etree._appendChild ValueError: cannot append parent to itself
我在 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
我是不是忽略了什么??
<!ELEMENT foo (superpowers*)> <!ELEMENT superpowers ( foo | agility )>
Firstly is this DTD legal ?
是的,部分 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
的父级。 (正如哈利·邓恩所说,“你不能在劳埃德的双重印章上盖三重印章!”。)
您需要做的是创建一个全新的 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>