lxml创建没有根元素的XML片段?

时间:2012-05-12 14:02:47

标签: python xml lxml

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

也就是说,有没有什么可以代表以下内容而不创建另一个元素来保存它们:

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

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

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

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

1 个答案:

答案 0 :(得分:5)

是的,lxml.html包中有这样的功能,它被称为fragment_fromstringfragments_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>

如果你看一下what's going on under the hood,如果你对其他结果不满意,使用xml解析器做同样的事情可能不会太困难。