如何在python xml.etree.ElementTree中删除迭代器中的节点



如何删除当前节点,同时通过getiterator()函数从根循环访问所有节点?

import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()
for node in root.getiterator():
     #if some condition:
        #remove(node)

在不知道父节点的情况下,您无法删除节点,但xml.etree包不提供从给定节点访问父节点的任何方法。

解决此问题的唯一方法是匹配父节点:

for node in root.iter():
    if some_condition_matches_parent:
        for child in list(node.iter()):
            if some_condition_matches_child:
                node.remove(child)

如果切换到lxml库(它实现了相同的 API,但具有其他增强功能),则可以从任何给定节点检索父节点:

node.getparent().remove(node)

请注意,虽然 Element.getiterator() 的纯 Python 实现返回一个列表对象,但在 ElementTree 模块的 C 实现中(Python 2 上的单独导入,如果可用,在 Python 3 上透明导入),getiterator() 方法返回一个需要复制的实时生成器。

最重要的是,Element.getiterator()方法已在Python 3.2中弃用,并将在Python 3.9中完全删除。我用外环的node.iter()代替了它的使用,在内圈list(node.iter())

最新更新