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

2024-06-26 17:39:27 发布

您现在位置:Python中文网/ 问答频道 /正文

使用lxml,我如何在根元素之前预先发送处理指令,或者在使用lxml删除根元素之后追加PIs

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

from lxml import etree

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

我得到:

<ROOT/>

而不是:

<?foo?><ROOT/>

Tags: fromimport元素示例foo指令rootxml
2条回答

您需要在tounicode()中使用ElementTree,而不仅仅是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

实际上,一个^{}总是附加到一个^{}上,即使它看起来是“分离的”:

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

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

因此,问题在于^{}(或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 ?>"

相关问题 更多 >