
本文详解在 Python 中使用 ElementTree 删除 XML 节点的正确方法,指出直接使用 del root[i][j] 的常见误区,并提供基于 XPath 定位与 remove() 方法的安全删除方案。
本文详解在 python 中使用 elementtree 删除 xml 节点的正确方法,指出直接使用 `del root[i][j]` 的常见误区,并提供基于 xpath 定位与 `remove()` 方法的安全删除方案。
在处理 XML 文档时,许多开发者误以为通过索引(如 del root[1][1])可直接删除某个子元素——但这种做法极易失败,根本原因在于:ElementTree 的索引是动态的、基于当前子节点顺序的视图,而非稳定标识;且 del 操作仅作用于 Python 对象引用,不触发 ElementTree 内部结构更新逻辑,也无法保证目标节点被真正从父节点中解绑。
例如,在您的 XML 结构中:
<date><year>2025</year><day>16.5</day><day>5.3</day></date>
root[1] 确实对应
✅ 正确做法是:先精准定位目标元素,再调用其父节点的 .remove() 方法。推荐使用 XPath 表达式(如 .//date/day[2])精确定位第 2 个
import xml.etree.ElementTree as ET
xml_str = '''<homework name="stam"><subject>math</subject><date><year>2025</year><day>16.5</day><day>5.3</day></date></homework>'''
root = ET.fromstring(xml_str)
# 定位第二个 <day> 元素(XPath 中索引从 1 开始)
target_day = root.find(".//date/day[2]")
if target_day is not None:
parent_date = root.find(".//date")
if parent_date is not None:
parent_date.remove(target_day)
# 验证结果
print(ET.tostring(root, encoding="unicode", method="xml"))</day>
⚠️ 注意事项:
- XPath 中 day[2] 表示第二个
元素 (非编程索引 1),符合人类直觉; - 必须检查 find() 返回值是否为 None,避免 AttributeError;
- remove() 只接受已存在于该父节点中的元素对象,不可跨父节点移除;
- gc.collect() 对 ElementTree 节点无效——内存管理由 Python 引用计数自动处理,无需手动干预。
最终,XML 结构将准确变为仅保留第一个











