Python XML转CSV新手求助:仅提取COLLECTION-ITEM类型row及字段取值
XML转CSV问题解决方案
核心问题修复
问题1:过滤非COLLECTION-ITEM类型的行
循环遍历所有<row>节点时,先判断type字段的取值,非目标类型直接跳过即可。
问题2:字段取值错误修复
原代码存在2个取值逻辑错误:
xml.etree.ElementTree的find方法不支持点分格式的节点路径,需要使用XPath斜杠路径查找嵌套节点- 关联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天时间熟悉
xml.etree.ElementTree的核心API,重点掌握find/findall方法、基础XPath路径语法,足够应对所有节点查找、属性读取需求 - 花半天时间熟悉Pandas DataFrame的基础操作、CSV写入的常用参数,处理输出格式问题
- 开发复杂匹配逻辑时,先拿单条测试数据调试取值逻辑,验证正确后再跑全量数据,大幅提升调试效率
内容的提问来源于stack exchange,提问作者Cathi G
相关产品推荐
相关产品推荐

