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

如何基于关键词从XML中提取指定汽车数据?

提取XML中Honda车型指定字段的解决方案

问题描述

我有一份汽车数据XML文件,想要提取其中包含“Honda”关键词的条目,并且只获取Car_id、Car Name、Price at location 98134、Mpg这几个字段。用Python的xml.etree.ElementTree写了代码,但得不到预期结果,刚接触Python和XML,求帮忙修正代码。

XML示例数据

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Catalog>
   <CatalogItemLine>
     <NameValue name="Car_id">111-2020-3</NameValue>
     <NameValue name="Car Name">Honda Accord</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">blue</NameValue>
     <NameValue name="door">4</NameValue>
     
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">121-2020-3</NameValue>
     <NameValue name="Car Name">Honda Civic</NameValue>
     <NameValue name="Price at location 98134">30000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">35</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">2</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">131-2020-3</NameValue>
     <NameValue name="Car Name">Toyota Camry</NameValue>
     <NameValue name="Price at location 98134">45000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">32</NameValue>
     <NameValue name="color">black</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">151-2020-3</NameValue>
     <NameValue name="Car Name">Honda Pilot</NameValue>
     <NameValue name="Price at location 98134">50000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">gray</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
   <CatalogItemLine>
     <NameValue name="Car_id">101-2020-3</NameValue>
     <NameValue name="Car Name">Chevy Malibu</NameValue>
     <NameValue name="Price at location 98134">40000</NameValue>
     <NameValue name="type">Gas</NameValue>
     <NameValue name="Mpg">30</NameValue>
     <NameValue name="color">white</NameValue>
     <NameValue name="door">4</NameValue>
   </CatalogItemLine>
</Catalog>  

预期输出

Car_id
111-2020-3
Car Name
Honda Accord
Price at location 98134
40000
Mpg
30

Car_id
121-2020-3
Car Name
Honda Civic
Price at location 98134
30000
Mpg
35

Car_id
151-2020-3
Car Name
Honda Pilot
Price at location 98134
50000
Mpg
30

现有代码问题分析

你写的代码存在几个问题:

  1. 缩进错误:for循环前多了缩进,会触发语法错误
  2. 判断逻辑偏差:CatalogItemLine.find('NameValue')只会匹配第一个NameValue节点,无法定位到“Car Name”字段,没法准确判断是否包含“Honda”
  3. 输出不符合要求:仅打印了单个节点文本,没有提取指定的四个字段内容

修正后的代码

import xml.etree.ElementTree as ET

xmlfile = 'cardata.xml'

tree = ET.parse(xmlfile)
root = tree.getroot()

# 定义需要提取的目标字段
target_fields = ['Car_id', 'Car Name', 'Price at location 98134', 'Mpg']

for item in root.findall('.//CatalogItemLine'):
    # 先获取当前条目的Car Name值,判断是否为Honda车型
    car_name = None
    for nv in item.findall('NameValue'):
        if nv.get('name') == 'Car Name' and nv.text:
            car_name = nv.text
            break
    if car_name and 'Honda' in car_name:
        # 遍历目标字段,提取并打印对应内容
        for field in target_fields:
            for nv in item.findall('NameValue'):
                if nv.get('name') == field and nv.text:
                    print(field)
                    print(nv.text)
                    break
        # 条目之间空行分隔
        print()

代码说明

  1. 先定义target_fields列表,明确要提取的字段范围
  2. 遍历每个CatalogItemLine条目,优先定位“Car Name”字段,判断是否包含“Honda”关键词
  3. 确认是Honda车型后,逐个匹配目标字段,打印字段名和对应文本内容
  4. 每个条目输出结束后打印空行,和预期输出格式保持一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:25:33