如何删除当前节点,同时通过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)
答案 0 :(得分:5)
您不能在不知道父节点的情况下删除节点,但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上透明导入){{1 }}方法返回一个需要复制的实时生成器。
最重要的是,{3}中的getiterator()
方法已被弃用,并将在Python 3.9中完全删除。我将其用法替换为外部循环中的Element.getiterator()
和内部的node.iter()
。