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

Python XML转CSV新手求助:仅提取COLLECTION-ITEM类型row及字段取值

XML转CSV问题解决方案

核心问题修复

问题1:过滤非COLLECTION-ITEM类型的行

循环遍历所有<row>节点时,先判断type字段的取值,非目标类型直接跳过即可。

问题2:字段取值错误修复

原代码存在2个取值逻辑错误:

  1. xml.etree.ElementTree的find方法不支持点分格式的节点路径,需要使用XPath斜杠路径查找嵌套节点
  2. 关联ID需要先建立全局ID映射,再匹配对应THING-ID取值,原代码错误查找不存在的country节点

修改后完整可运行代码

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as Xet
import pandas as pd

# 辅助函数:避免节点不存在时报错
def get_node_text(elem, xpath, default=''):
    target = elem.find(xpath)
    return target.text if target is not None else default

cols = ["Collection item", "ITEM-ID", "ATTRIB-1", "PERSON-TYPE-1-NAME" ,
        "ATTRIB-2", "PERSON-TYPE-2-NAME", "RELATED-THING-1 id",
        "RELATED-THING-2 IDs"]
rows = []

# 解析XML
xmlparse = Xet.parse('sample.xml')
root = xmlparse.getroot()

# 第一步:先构建全局ID映射表,存储所有row的id对应的THING-ID,方便后续关联查询
id_to_thing_id = {}
for row in root.findall('row'):
    row_id = get_node_text(row, './id')
    thing_id = get_node_text(row, './THING-ID')
    if thing_id:
        id_to_thing_id[row_id] = thing_id

# 第二步:遍历过滤COLLECTION-ITEM类型的行,提取字段
for row in root.findall('row'):
    # 过滤非目标类型
    row_type = get_node_text(row, './type')
    if row_type != 'COLLECTION-ITEM':
        continue
    
    # 提取基础字段
    name = get_node_text(row, './name')
    item_id = get_node_text(row, './ITEM-ID')
    attrib_1 = get_node_text(row, './ATTRIB-1')
    p1_name = get_node_text(row, './PERSON-TYPE-1-NAME/result/row/name')
    attrib_2 = get_node_text(row, './ATTRIB-2')
    p2_name = get_node_text(row, './PERSON-TYPE-2-NAME/result/row/name')
    
    # 提取关联ID
    rel1_row_id = get_node_text(row, './RELATED-THING-1/result/row/id')
    relat_thing1_id = id_to_thing_id.get(rel1_row_id, '')
    
    rel2_row_ids = [get_node_text(r, './id') for r in row.findall('./RELATED-THING-2/result/row')]
    relat_thing2_ids = ', '.join([id_to_thing_id.get(rid, '') for rid in rel2_row_ids])
    
    rows.append({
        "Collection item": name,
        "ITEM-ID": item_id,
        "ATTRIB-1": attrib_1,
        "PERSON-TYPE-1-NAME": p1_name,
        "ATTRIB-2": attrib_2,
        "PERSON-TYPE-2-NAME": p2_name,
        "RELATED-THING-1 id": relat_thing1_id,
        "RELATED-THING-2 IDs": relat_thing2_ids
    })

df = pd.DataFrame(rows, columns=cols)
# 写入CSV时关闭索引输出,避免多余列
df.to_csv('output.csv', index=False, encoding='utf-8-sig')

快速学习建议(一周完成需求适配)

  1. 花1天时间熟悉xml.etree.ElementTree的核心API,重点掌握find/findall方法、基础XPath路径语法,足够应对所有节点查找、属性读取需求
  2. 花半天时间熟悉Pandas DataFrame的基础操作、CSV写入的常用参数,处理输出格式问题
  3. 开发复杂匹配逻辑时,先拿单条测试数据调试取值逻辑,验证正确后再跑全量数据,大幅提升调试效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:30:04