微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在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())替换它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。