7

是否可以使用 lxml(或内置的 etree 库)创建一个表示 xml 片段的对象,但包含两个(或更多)不相交的树(即每棵树都有自己独立的根,但它们没有共同的祖先)?

也就是说,是否有任何东西可以代表以下内容而无需创建另一个元素来容纳它们:

<tree id="A"><anotherelement/></tree>
<tree id="B"><yetanotherelement/></tree>

我在 lxml 文档中看不到任何允许这样做的内容,并且 stackoverflow 似乎没有任何直接的内容。

这里的用例是我以编程方式生成 xml,片段将被组装到一个文档中以供输出。我想要一个不需要迭代/特殊情况的对象,只需传递给 lxml 方法,就好像它是一棵正确的树一样。

(我知道这样的片段本身不会是一个完整和正确的 xml 文档;我想在组装成这样的文档之前存储中间产品)。

4

1 回答 1

6

是的,lxml.html包中有这样一个功能,它被称为fragment_fromstringor fragments_fromstring,但在大多数情况下,html 解析器也可以很好地处理 xml:

from lxml import etree, html

xml = """
    <tree id="A"><anotherelement/></tree>
    <tree id="B"><yetanotherelement/></tree>
"""

fragments = html.fragments_fromstring(xml)

root = etree.Element("root")
for f in fragments:
    root.append(f)

print etree.tostring(root, pretty_print=True)

输出:

<root>
  <tree id="A">
    <anotherelement/>
  </tree>
  <tree id="B">
    <yetanotherelement/>
  </tree>
</root>

如果您查看幕后发生的事情,如果您对其他结果不满意,使用 xml 解析器执行相同操作可能不会太难。

于 2012-05-12T18:57:06.993 回答