使用Python修改XML文件时删除空节点遇ValueError问题求助
解决XML删除空childTopics节点的报错问题
报错原因
你碰到的 ValueError: list.remove(x): x not in list 是因为调用了错误的父节点执行删除操作:你用root.remove(node),但要删除的空childTopics是嵌套在topic节点里的,并非root(即<toc>)的直接子节点,root找不到这个元素,自然报错。
另外你的代码还缺少「判断childTopics是否为空」的逻辑,当前写法会删掉所有嵌套的childTopics,不管它有没有内容。
修正后的代码
import xml.etree.ElementTree as ET tree = ET.parse("toc2 - Copy.xml") root = tree.getroot() # 递归查找所有层级的childTopics节点 all_child_topics = root.findall('.//childTopics') # 遍历节点,只删除空的childTopics for node in all_child_topics: # 判断节点是否为空(无任何子元素) if len(node) == 0: # 获取节点的父节点,由父节点执行删除操作 node_parent = node.getparent() node_parent.remove(node) # 保存修改后的XML文件 tree.write("modified_toc.xml", encoding="utf-8", xml_declaration=True)
代码说明
.//childTopics:递归查找XML中所有层级的childTopics节点,不管嵌套深度len(node) == 0:精准判断该childTopics是否为空节点(没有子元素)node.getparent():获取当前节点的父节点,只有父节点才能删除自己的子元素tree.write():将内存中的修改写入文件,避免修改只停留在内存中
用这段代码处理你提供的示例XML后,空的<childTopics></childTopics>会被正确删除,不会再出现报错。
内容的提问来源于stack exchange,提问作者Prog 14936
相关产品推荐
相关产品推荐

