在根元素之前/之后使用 lxml 在 PI 前面或之后附加



使用 lxml,如何在根元素之前预置处理指令或使用 lxml 在 de 根元素之后附加 PI。

目前,以下示例不起作用:

from lxml import etree
root = etree.XML("<ROOT/>")
root.addprevious(etree.ProcessingInstruction("foo"))
print(etree.tounicode(root))

我得到:

<ROOT/>

而不是:

<?foo?><ROOT/>

实际上,即使Element看起来"分离",它也总是附加到ElementTree上:

root = etree.XML("<ROOT/>")
assert root.getroottree() is not None

当我们使用addprevious/addnext在根元素之前/之后插入处理指令时,PI 不会附加到父元素(没有任何(,而是附加到根树。

因此,问题在于tounicode(或tostring(的使用。最佳做法是打印根树的 XML,而不是根元素。

from lxml import etree
root = etree.XML("<ROOT/>")
root.addprevious(etree.ProcessingInstruction("foo"))
root.addnext(etree.ProcessingInstruction("bar"))
print(etree.tounicode(root))
# => "<ROOT/>"
print(etree.tounicode(root.getroottree()))
# => "<?foo ?><ROOT/><?bar ?>"

你需要使用ElementTree,而不仅仅是tounicode()中的Element

from lxml import etree
root = etree.XML("<ROOT/>")
root.addprevious(etree.ProcessingInstruction("foo"))
print(etree.tounicode(root.getroottree()))

输出几乎是您想要的:

<?foo ?><ROOT/>

foo出现后的额外空格字符lxmlPI渲染为pi.target + " " + pi.text

相关内容

  • 没有找到相关文章

最新更新