You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python修改XML遇逻辑错误,求修正:仅输出日产车辆注册号

问题:修改XML并筛选输出日产车辆注册号

需要用Python修改XML文件,将注册号为DE2115的车辆品牌改为Nissan、车型改为Skyline,最终仅输出所有日产车辆的注册号,但当前代码会输出所有车辆的注册号,请求解决。

原始XML内容

<motorvehicles>
    <vehicle>
        <registration_no>CBB1456</registration_no>
        <make>Toyota</make>
        <model>Premio</model>
    </vehicle>
    <vehicle>
        <registration_no>PR2245</registration_no>
        <make>Mazda</make>
        <model>Bongo</model>
    </vehicle>
    <vehicle>
        <registration_no>DE2115</registration_no>
        <make>TATA</make>
        <model>Sumo</model>
    </vehicle>
    <vehicle>
        <registration_no>Car7785</registration_no>
        <make>Kia</make>
        <model>Optimas</model>
    </vehicle>
</motorvehicles>

修改要求

将注册号DE2115的车辆信息修改为:

<registration_no>DE2115</registration_no>
 <make>Nissan</make>
 <model>Skyline</model>

错误代码

import xml.etree.ElementTree as ET
vehicle_xml_data_as_string = "<motorvehicles><vehicle><registration_no>CBB1456</registration_no><make>Toyota</make><model>Premio</model></vehicle><vehicle><registration_no>PR2245</registration_no><make>Mazda</make><model>Bongo</model></vehicle><vehicle><registration_no>DE2115</registration_no><make>TATA</make><model>Sumo</model></vehicle><vehicle><registration_no>CAR7785</registration_no><make>Kia</make><model>Optima</model></vehicle></motorvehicles>"
root=ET.fromstring(vehicle_xml_data_as_string)

for registration_no in root.iter('registration_no'):
    if registration_no.text=="DE2115":
        for element in root.iter(tag="make"):
            newmake="Nissan"
            element.text=newmake
        for element in root.iter(tag="model"):
            newmodel="Skyline"
            element.text=newmodel
            
for element in root.iter('make'):
    if element.text=="Nissan":
        for element in root.iter('vehicle'):
            regno=element.find('registration_no').text
            print(regno)

错误分析

  1. 修改逻辑错误:找到DE2115的注册号后,使用root.iter('make')和root.iter('model')会遍历XML中所有的品牌和车型标签,导致所有车辆的品牌都被改成Nissan,车型都被改成Skyline,而不是仅修改目标车辆。
  2. 输出逻辑错误:找到品牌为Nissan的元素后,又用root.iter('vehicle')遍历所有车辆,因此会输出全部车辆的注册号,而非仅日产车辆。

修正后的代码

import xml.etree.ElementTree as ET

vehicle_xml_data_as_string = "<motorvehicles><vehicle><registration_no>CBB1456</registration_no><make>Toyota</make><model>Premio</model></vehicle><vehicle><registration_no>PR2245</registration_no><make>Mazda</make><model>Bongo</model></vehicle><vehicle><registration_no>DE2115</registration_no><make>TATA</make><model>Sumo</model></vehicle><vehicle><registration_no>CAR7785</registration_no><make>Kia</make><model>Optima</model></vehicle></motorvehicles>"
root = ET.fromstring(vehicle_xml_data_as_string)

# 修改目标车辆信息
for vehicle in root.iter('vehicle'):
    reg_no = vehicle.find('registration_no').text
    if reg_no == "DE2115":
        # 仅修改当前车辆的品牌和车型
        make_elem = vehicle.find('make')
        make_elem.text = "Nissan"
        model_elem = vehicle.find('model')
        model_elem.text = "Skyline"

# 输出所有日产车辆的注册号
for vehicle in root.iter('vehicle'):
    make = vehicle.find('make').text
    if make == "Nissan":
        print(vehicle.find('registration_no').text)

代码说明

  • 修改部分:遍历每个vehicle元素,找到注册号为DE2115的车辆后,直接修改其下的make和model子元素,避免影响其他车辆。
  • 输出部分:遍历每个vehicle元素,检查其品牌是否为Nissan,是则输出对应的注册号,确保仅输出目标车辆。

内容的提问来源于stack exchange,提问作者kavi_02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:15:37