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)
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)
请注意,虽然纯 Python 实现Element.getiterator()
返回一个列表对象,但在 ElementTree 模块的 C 实现中(Python 2 上的单独导入,如果可用,则在 Python 3 上透明地导入)该getiterator()
方法返回一个需要复制的实时生成器制成。
最重要的是,该Element.getiterator()
方法在 Python 3.2 中已被弃用,并将在 Python 3.9 中完全删除。node.iter()
我在外部循环和内部循环中替换了它的使用list(node.iter())
。