如何删除作为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'
这是由于处理指令是在根 XML 树之外生成的。这是多年前在LXML的网站上作为错误提出的,但不幸的是,它看起来没有实施过适当的修复。
线程上的一个用户提供了一种(hackyish(方法来删除以这种方式生成的处理指令。只需获取标记,将其附加到根元素,然后将其删除即可。
与其他一些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/>