如何使用Python的xml.etree模块修改XML文件中子节点文本并覆盖原文件
解决Python修改XML子节点文本并覆盖原文件的问题
我来帮你修正代码里的问题,让你顺利完成修改:
你的代码存在两个关键问题:
- 修改对象错误:你现在用
o.text = "ERJ"修改的是<object>节点的文本内容,而不是它下面的<name>子节点的文本。这会直接清空<object>里的所有子节点,完全不符合你的需求。 - 缺少写入文件步骤:修改只停留在内存中,没有将修改后的XML内容写回原文件,所以原文件不会有任何变化。
正确的完整代码
import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse("C:/Users/PC/Desktop/185.xml") root = tree.getroot() # 找到所有<object>节点 objects = root.findall(".//object") for o in objects: # 定位到当前<object>下的<name>子节点 name_node = o.find("name") # 判断文本是否为目标内容,是的话修改 if name_node.text == "ENERGY-TAG": name_node.text = "ERJ" # 将修改后的内容覆盖写入原文件 tree.write("C:/Users/PC/Desktop/185.xml", encoding='utf-8', xml_declaration=True)
代码说明:
- 用
name_node = o.find("name")精准定位到<object>下的<name>子节点,再修改它的text属性,这才是你要修改的目标内容。 - 最后调用
tree.write()方法,指定原文件路径、编码格式,加上xml_declaration=True可以保证生成的XML文件包含正确的XML声明头(比如<?xml version='1.0' encoding='utf-8'?>)。
验证效果
修改后你的XML会变成:
<?xml version='1.0' encoding='utf-8'?> <annotation> <object> <name>ERJ</name> <pose>Unspecified</pose> <truncated>1</truncated> <difficult>0</difficult> <bndbox> <xmin>397</xmin> <ymin>470</ymin> <xmax>1500</xmax> <ymax>1816</ymax> </bndbox> </object> </annotation>
内容的提问来源于stack exchange,提问作者hanbb
相关产品推荐
相关产品推荐

