子项包含父项的一个实例 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必须恰好包含一个fooagility

例如,根据该 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>