如何使用lxml删除标题/尾随处理指令

时间:2020-02-14 13:42:55

标签: python lxml processing-instruction

如何删除XML树中根元素的同级处理指令?

我找不到执行此操作的任何功能,并且经典方法不起作用,因为头/尾处理指令没有父级:

from lxml import etree

root = etree.XML("<ROOT/><?foo?>")
tail = root.getnext()
parent = tail.getparent()  # parent is None
parent.remove(tail)

我得到:

Traceback (most recent call last):
  File "/path/to/demo_remove_tail_pi.py", line 6, in <module>
    parent.remove(tail)
AttributeError: 'NoneType' object has no attribute 'remove'

1 个答案:

答案 0 :(得分:1)

这是由于在根XML树之外生成了处理指令。这是多年前在LXML网站上以bug的形式提出的,但不幸的是,它似乎还没有实施过适当的修复程序。

该线程上的一个用户提供了一种(骇人听闻的)方式来删除以这种方式生成的处理指令。只需将标签添加到根元素上,然后将其删除即可。

与其他XML库不同,lxml允许元素在一个地方出现。也就是说,您不能将元素复制到另一个位置;尝试将其移动到新位置,将其从旧位置删除。

from lxml.etree import XML, tounicode

root = XML("<ROOT/><?foo?>")

print(tounicode(root.getroottree()))
>>> <ROOT/><?foo?>
tail = root.getnext()
root.append(tail)
root.remove(tail)
print(tounicode(root.getroottree()))
>>> <ROOT/>
相关问题