Python移除XML节点遇索引越界,求按属性值删除方法
按属性移除XML节点的Python实现
原索引删除方案报错原因
直接通过索引删除节点时,getElementsByTagName()返回的是实时NodeList——每删除一个节点,列表长度就会缩短,后续再用原索引访问自然会触发IndexError。
按属性删除的实现方案
要移除所有severity属性为NotApplicable的Message节点,可按以下步骤操作:
- 解析XML文件,获取所有
Message节点 - 将NodeList转为普通列表(避免遍历过程中因节点删除导致的遍历异常)
- 遍历每个节点,检查
severity属性值 - 匹配目标属性的节点,调用
parentNode.removeChild()删除 - 保存修改后的XML内容
完整代码示例:
from xml.dom import minidom # 解析XML文件 xmldoc = minidom.parse("your_file.xml") # 获取所有Message节点并转为列表 message_nodes = list(xmldoc.getElementsByTagName("Message")) # 遍历节点,删除符合条件的项 for node in message_nodes: # 获取severity属性值,不存在则返回None severity = node.getAttribute("severity") if severity == "NotApplicable": node.parentNode.removeChild(node) # 保存修改后的XML with open("modified_file.xml", "w", encoding="utf-8") as f: # toprettyxml用于格式化输出,indent参数控制缩进 f.write(xmldoc.toprettyxml(indent=" ", encoding="utf-8").decode("utf-8"))
测试XML示例
<listMessage> <Message msgID="00002" severity="High"> <msg>00002</msg> </Message> <Message msgID="00001" severity="NotApplicable"> <msg> NA</msg> </Message> </listMessage>
执行代码后,modified_file.xml中将只保留severity="High"的Message节点。
内容的提问来源于stack exchange,提问作者Israa El-Sakka
相关产品推荐
相关产品推荐

