Python-XML:查找并移除所有id节点失败,请求技术帮助
解决XML中移除所有id节点的问题
原代码的两个核心问题
遍历并修改原列表导致节点遗漏
root.findall(".//id")返回的是一个动态列表,你在循环中直接执行ids.remove(item)会打乱遍历顺序。比如列表包含[节点A,节点B,节点C],删除节点A后列表变为[节点B,节点C],下一次循环会直接取到节点C,跳过节点B,因此无法找到全部id节点。错误的节点移除逻辑
你只是从ids列表中移除了节点对象,但没有修改XML树的实际结构。要真正删除XML中的节点,必须通过该节点的父节点执行移除操作。
修正后的代码
import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() # 将找到的id节点转为新列表,避免遍历原列表时修改导致的遗漏 id_nodes = list(root.findall(".//id")) for node in id_nodes: # 获取父节点并从XML树中移除当前id节点 parent = node.getparent() if parent is not None: parent.remove(node) print(ET.tostring(node)) tree.write("output.xml")
关键修正点
- 用
list(root.findall(".//id"))生成独立的节点列表,确保遍历过程不受删除操作影响,能覆盖所有id节点。 - 通过
node.getparent().remove(node)让父节点从XML树结构中删除目标节点,修改会直接作用于树对象,最终写入文件时生效。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

