You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何根据属性值删除XML节点 附问题复现代码

问题原因

当前代码无法删除所有符合条件节点的核心原因是:直接遍历Element对象的子节点序列时,中途执行删除操作会改变子节点序列的长度和索引位置,导致迭代器跳过后续的部分节点,最终只删除了部分item="1"的节点。

修复方案

先把所有需要删除的节点提前筛选出来存入独立列表,再遍历这个列表执行删除操作,避免遍历原序列时修改原序列结构,修改后代码如下:

from xml.etree import ElementTree as ET

groups = ET.fromstring("""<groups>
<group>
<group_components>
<id item="1">14742</id>
<id item="1">121727</id>
<id item="0">541971</id>
</group_components>
</group>
<group>
<group_components>
<id item="1">10186</id>
<id item="1">10553</id>
<id item="1">10644</id>
<id item="0">434639</id>
</group_components>
</group>
</groups>
""")

fnodes = groups.findall('group')
for first in fnodes:
    bnode = first.find("group_components")
    # 先筛选所有需要删除的节点,存入独立列表
    to_remove = [child for child in bnode if child.attrib.get('item') == "1"]
    # 遍历待删除列表执行移除
    for child in to_remove:
        bnode.remove(child)
            
xmlstr = ET.tostring(groups, encoding="utf-8", method="xml")
print(xmlstr.decode("utf-8"))

运行结果

运行后会删除所有item="1"的id节点,输出结果符合预期:

<groups>
<group>
<group_components>
<id item="0">541971</id>
</group_components>
</group>
<group>
<group_components>
<id item="0">434639</id>
</group_components>
</group>
</groups>

内容的提问来源于stack exchange,提问作者Narik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:27:01