2024-06-26 17:39:27 发布
网友
使用lxml,我如何在根元素之前预先发送处理指令,或者在使用lxml删除根元素之后追加PIs
目前,以下示例不起作用:
from lxml import etree root = etree.XML("<ROOT/>") root.addprevious(etree.ProcessingInstruction("foo")) print(etree.tounicode(root))
我得到:
<ROOT/>
而不是:
<?foo?><ROOT/>
您需要在tounicode()中使用ElementTree,而不仅仅是Element:
tounicode()
ElementTree
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
foo
lxml
PI
pi.target + " " + pi.text
实际上,一个^{}总是附加到一个^{}上,即使它看起来是“分离的”:
root = etree.XML("<ROOT/>") assert root.getroottree() is not None
当我们使用addprevious/addnext在根元素之前/之后插入一条处理指令时,PI不会附加到父元素(没有),而是附加到根树
addprevious
addnext
因此,问题在于^{}(或tostring)的用法。最佳实践是打印根树的XML,而不是根元素
tostring
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 ?>"
您需要在
tounicode()
中使用ElementTree
,而不仅仅是Element
:输出几乎就是您想要的:
显示
foo
之后的额外空格字符,因为lxml
将PI
呈现为pi.target + " " + pi.text
实际上,一个^{} 总是附加到一个^{} 上,即使它看起来是“分离的”:
当我们使用
addprevious
/addnext
在根元素之前/之后插入一条处理指令时,PI不会附加到父元素(没有),而是附加到根树因此,问题在于^{} (或
tostring
)的用法。最佳实践是打印根树的XML,而不是根元素相关问题 更多 >
编程相关推荐