子级包含父DTD/xm的实例

2024-05-23 22:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学习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

我忽略了什么吗??你知道吗


Tags: intruetreefoolinexmlelementlxml
1条回答
网友
1楼 · 发布于 2024-05-23 22:32:27
<!ELEMENT foo (superpowers*)>
<!ELEMENT superpowers ( foo | agility )>

Firstly is this DTD legal ?

是的,那部分DTD是合法的。(我之所以说partial是因为agility没有元素声明。)

意思是foo可以包含零个或多个superpowerssuperpowers必须正好包含一个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>

相关问题 更多 >