1

如何删除作为 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'
4

1 回答 1

1

这是因为处理指令是在根 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/>
于 2020-02-14T19:21:33.643 回答