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

如何在python xml.etree.ElementTree中删除迭代器中的节点,python,xml,iterator,elementtree,xml.etree,Python,Xml,Iterator,Elementtree,Xml.etree,如何通过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包不提供从给定节点访问父节点的任何

如何通过
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实现返回一个list对象,但在ElementTree模块的C实现中(在Python 2上单独导入,在Python 3上透明导入,如果可用),
getiterator()
方法返回一个需要复制的实时生成器


除此之外,Python3.2中已经弃用了
元素.getiterator()
方法,并将在Python3.9中完全删除该方法。我将其使用替换为外部循环中的
node.iter()
,内部循环中的
list(node.iter())

在将一个节点添加到另一个etree根目录后删除该节点时遇到了一个小问题,因为添加该节点会添加对该节点的引用,并且不会生成新节点。在删除节点之前,我使用copy.deepcopy获取节点的副本,以便将其添加到另一棵树中。希望这能帮助别人。:)