使用 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
出现后的额外空格字符lxml
PI
渲染为pi.target + " " + pi.text
。