Python操作XML:更新指定registration_no节点的make和model值
Python修改指定XML节点值问题修复
原有代码失效原因
- 拼写错误:节点名
registration_no被错写为registraion_no,缺失字母t,直接导致匹配失败。 - XPath语法误用:
[@属性名='值']是筛选节点属性的语法,但registration_no是vehicle节点下的子元素,不是vehicle的属性,该写法无法匹配到子元素值符合条件的节点。 - 功能缺失:仅编写了
make节点的更新逻辑,未覆盖model节点的更新需求。 - 匹配鲁棒性不足:示例XML中所有节点的文本内容前后都带有空白字符,直接做精确值匹配容易漏判。
正确实现方案
使用Python标准库xml.etree.ElementTree即可完成需求,无需安装第三方依赖,代码如下:
import xml.etree.ElementTree as ET # 1. 加载目标XML文件,替换为你的实际文件路径 tree = ET.parse("motorvehicles.xml") root = tree.getroot() # 2. 遍历所有vehicle节点定位目标 for vehicle in root.findall("vehicle"): # 获取registration_no的文本,去除前后空白避免空格干扰匹配 reg_no = vehicle.find("registration_no").text.strip() if reg_no == "DE2115": # 更新make和model节点的文本值,可替换为你需要的实际值 vehicle.find("make").text = "Nissan" vehicle.find("model").text = "X-Trail" break # 唯一目标匹配完成后直接退出循环,减少不必要遍历 # 3. 将修改写回原文件 tree.write("motorvehicles.xml", encoding="utf-8", xml_declaration=True)
如果你偏好直接用XPath定位目标节点,注意子元素值筛选的语法和属性筛选不同,且要匹配原XML中带空格的文本内容,写法如下(仅适配Python 3.7及以上版本):
# 注意XPath中DE2115前后的空格和原XML保持一致 target_vehicle = root.find("./vehicle[registration_no=' DE2115 ']") if target_vehicle is not None: target_vehicle.find("make").text = "Nissan" target_vehicle.find("model").text = "X-Trail"
内容的提问来源于stack exchange,提问作者Arunoda Gunawardana
相关产品推荐
相关产品推荐

