是否可以使用lxml(或内置etree库)创建一个表示xml片段的对象,但包含两个(或更多)不相交的树(即每个树都有自己独立的根,但它们没有共同点祖先)?
也就是说,有没有什么可以代表以下内容而不创建另一个元素来保存它们:
<tree id="A"><anotherelement/></tree>
<tree id="B"><yetanotherelement/></tree>
我在lxml文档中看不到任何允许这样做的内容,而stackoverflow似乎没有任何直接的内容。
这里的用例是我以编程方式生成xml,并将片段组装到一个文档中进行输出。我想要一个我不需要迭代/特殊情况的对象,只需传递给lxml方法就好像它是一棵合适的树。
(我知道这些片段本身并不是一个完整而正确的xml文档;我想在组装之前将中间产品存储到这样的文档中。)
答案 0 :(得分:5)
是的,lxml.html
包中有这样的功能,它被称为fragment_fromstring
或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>
如果你看一下what's going on under the hood,如果你对其他结果不满意,使用xml解析器做同样的事情可能不会太困难。