如何用Python3移除XML中文本为none的subElement节点?
搞定ElementTree移除指定子元素的问题
你碰到的这个坑确实是xml.etree.ElementTree的特性导致的——remove()方法必须从目标节点的直接父节点调用,不能随便从根节点或者其他上层节点操作。我来给你两种简便的解决思路:
方法一:先收集再批量移除(更稳妥)
先把所有需要删掉的subElement节点找出来存成列表,再逐个从它们的父节点移除。这样能避免遍历过程中修改DOM树导致的遗漏问题:
import xml.etree.ElementTree as ET tree = ET.parse('data.xml') root = tree.getroot() # 先把所有文本是"none"的subElement都捞出来 target_nodes = [node for node in root.findall(".//subElement") if node.text == 'none'] # 挨个找父节点删除 for node in target_nodes: parent = node.getparent() if parent: # 保险起见,确认节点有父节点(这里subElement肯定有) parent.remove(node) # 保存的时候记得指定编码和xml声明,避免乱码 tree.write('out.xml', encoding='UTF-8', xml_declaration=True)
方法二:反向遍历直接移除
如果不想额外存列表,也可以反向遍历找到的节点列表——从后往前删,这样前面的节点索引不会因为后面的节点被移除而错乱:
import xml.etree.ElementTree as ET tree = ET.parse('data.xml') root = tree.getroot() # reversed()让我们从最后一个节点开始处理 for node in reversed(root.findall(".//subElement")): if node.text == 'none': parent = node.getparent() if parent: parent.remove(node) tree.write('out.xml', encoding='UTF-8', xml_declaration=True)
为什么你的原代码没效果?
你之前用root.remove(e),但subElement的直接父节点是<block>,不是根节点<doc>。ElementTree的remove()只会删除调用者的直接子节点,所以根节点根本找不到这些subElement,自然删不掉啦。
这两种方法都能完美解决你的需求,选哪个看你习惯就行~
内容的提问来源于stack exchange,提问作者Nikita Glukhov
相关产品推荐
相关产品推荐

