使用SubElement向XML文件添加元素失败求助
解决XML修改后无变化的问题
嘿,我看到你折腾两天这个XML修改的问题了,核心问题其实出在你修改了树结构,但最后保存的是修改前生成的字符串,咱们一步步拆解问题并修复:
核心问题所在
你在代码最开头就把原始XML转换成了xmlstr,但后续对tree和root的所有修改都没有同步到这个提前生成的字符串里,最后写入文件的还是修改前的内容,这就是为什么文件完全没变化。
另外还有两个小问题:
- 你原代码里用
SubElement新增了一个val元素,但你的需求是修改已有val的文本(原XML里ابْتهَج对应的mot已经有val标签了),新增会导致出现两个val,不符合预期 - 编码处理有些冗余,在Python2里直接用Unicode字符串会更稳妥
修正后的完整代码
from xml.etree import ElementTree as ET from xml.dom import minidom # 解析XML文件,获取树和根节点 tree = ET.parse('Matching_Result.xml') root = tree.getroot() # 遍历所有mot元素,找到目标项并修改 for mot in root.findall('mot'): name = mot.get('id') rank = mot.find('val').text print name, rank # 直接用Unicode字符串比较,避免编码问题 if name == u'ابْتهَج': # 获取已存在的val元素,而不是新增 val_element = mot.find('val') # 设置新的文本内容(用Unicode字符串) val_element.text = u'ابتهج' # 封装一个格式化XML的函数,让输出更美观 def prettify_xml(elem): rough_string = ET.tostring(elem, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ", newl="\n") # 等所有修改完成后,再生成格式化的XML字符串 formatted_xml = prettify_xml(root) # 写入文件 with open("Matching_Result.xml", "w") as f: f.write(formatted_xml.encode('utf-8'))
关键修改点说明
- 调整了执行顺序:把XML字符串的生成移到所有修改操作之后,这样生成的字符串包含最新的修改内容
- 修改而非新增元素:用
mot.find('val')获取已有的val标签,直接修改它的text属性,符合你期望的输出格式 - 简化编码处理:全程用Unicode字符串进行比较和赋值,避免Python2中容易出现的编码混乱问题
- 封装格式化函数:把XML格式化的逻辑封装成函数,让代码更清晰易维护
执行这段代码后,你的XML文件就会变成你期望的样子啦!
内容的提问来源于stack exchange,提问作者rim
相关产品推荐
相关产品推荐

