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)
错误分析
- 修改逻辑错误:找到DE2115的注册号后,使用
root.iter('make')和root.iter('model')会遍历XML中所有的品牌和车型标签,导致所有车辆的品牌都被改成Nissan,车型都被改成Skyline,而不是仅修改目标车辆。 - 输出逻辑错误:找到品牌为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
相关产品推荐
相关产品推荐

