如何使用Python修改XML子节点内容,替换用户名密码并保留原有结构
解决方案
你现有的代码只完成了节点查找,缺少给节点文本赋值的逻辑,同时ElementTree默认写入参数会破坏原XML结构,按以下内容修正即可:
核心修改点
- 找到目标节点后直接给
.text属性赋值完成内容替换 - 写入文件时配置对应参数保留原XML的声明、编码、缩进结构
完整修正代码
import xml.etree.ElementTree as ET mytree = ET.parse('project/config.xml') myroot = mytree.getroot() # ... 你的其他业务逻辑 username = self.username.text() password = self.password.text() if self.rmbCheckBox.checkState() == Qt.Checked: # 遍历所有User节点(如果只有单个User节点可以直接用myroot.find('User'),不需要循环) for user_node in myroot.findall('User'): # 修改用户名 un_node = user_node.find('Username') if un_node is not None: un_node.text = username # 修改密码 pwd_node = user_node.find('Password') if pwd_node is not None: pwd_node.text = password # 可选:同步修改Remember节点存储勾选状态 remember_node = user_node.find('Remember') if remember_node is not None: remember_node.text = "1" # Python 3.9及以上版本内置indent方法,保留原有缩进格式 ET.indent(mytree, space=" ", level=0) # 写入文件,指定编码、开启XML声明匹配原文件格式 # 要覆盖原config.xml就把路径改回'project/config.xml',你原代码默认是输出到新的user.xml文件 mytree.write('project/config.xml', encoding='UTF-8', xml_declaration=True, short_empty_elements=False)
注意事项
- XML标签大小写敏感,查找节点时标签名要和原文件完全一致
- 如果你使用的Python版本低于3.9,没有
ET.indent方法,可以安装第三方库lxml替换标准库的ElementTree,lxml默认会保留原有缩进结构 - 原文件是XML 1.1版本,标准库
ElementTree默认输出XML 1.0声明,如果必须保留1.1版本,可以在写入后手动替换声明行,或者直接使用lxml库处理
内容的提问来源于stack exchange,提问作者Stefan Moser
相关产品推荐
相关产品推荐

