使用Python+pandas/NumPy将XML转CSV时如何处理动态列
Python+pandas实现动态列适配的XML转CSV方案
动态列适配的核心逻辑是先遍历所有目标节点收集全量出现过的字段名作为列集合,节点缺失对应字段时自动填充空值,不需要提前固定列结构。
实现流程
- 用Python标准库
xml.etree.ElementTree解析XML,无需额外安装第三方解析依赖 - 第一轮遍历所有
<Dab>节点,汇总所有子标签名称,生成动态列集合 - 第二轮遍历逐行提取字段:标签带
id属性则取id属性值,无id属性则取标签内文本内容,当前节点不存在的字段留空 - 提取完成的结构化数据直接转pandas DataFrame,导出为CSV格式即可
完整实现代码
import xml.etree.ElementTree as ET import pandas as pd # -------------------------- 加载XML数据 -------------------------- # 方式1:直接解析XML字符串,测试时可以用这个 xml_content = """ <root> <Dab action="A" id="94730"> <A id="18953"/> <B id="2112"/> <No>1</No> <D id="8920"/> <E id="1"/> <Num>000-000</Num> </Dab> <Dab action="A" id="94731"> <A id="18958"/> <B id="269"/> <C id="2112"/> <No>1</No> <D id="8920"/> <E id="1"/> <Num>419-000</Num> </Dab> </root> """ root = ET.fromstring(xml_content) # 方式2:读取本地XML文件,正式使用时替换成你的文件路径 # tree = ET.parse("your_input.xml") # root = tree.getroot() # -------------------------- 收集动态列 -------------------------- dab_nodes = root.findall(".//Dab") all_columns = set() for dab in dab_nodes: all_columns.add("Dab_id") # 存入<Dab>标签自身的id属性 for child in dab: all_columns.add(child.tag) all_columns = sorted(list(all_columns)) # 列名排序,可自行调整顺序规则 # -------------------------- 逐行提取数据 -------------------------- result_rows = [] for dab in dab_nodes: current_row = {col: "" for col in all_columns} # 提取<Dab>自身的id current_row["Dab_id"] = dab.attrib.get("id", "") # 遍历子标签按规则取值 for child in dab: if "id" in child.attrib: current_row[child.tag] = child.attrib["id"] else: current_row[child.tag] = child.text.strip() if child.text else "" result_rows.append(current_row) # -------------------------- 导出CSV -------------------------- df = pd.DataFrame(result_rows) # 用utf-8-sig编码避免Windows下Excel打开乱码,index=False去掉默认行号列 df.to_csv("xml_convert_result.csv", index=False, encoding="utf-8-sig") # 打印预览结果 print(df)
输出效果
代码运行后会自动补全第一个<Dab>节点缺失的C列,对应位置填充空值,输出结构如下:
| Dab_id | A | B | C | No | D | E | Num |
|---|---|---|---|---|---|---|---|
| 94730 | 18953 | 2112 | 1 | 8920 | 1 | 000-000 | |
| 94731 | 18958 | 269 | 2112 | 1 | 8920 | 1 | 419-000 |
补充说明
- 如果XML存在多层嵌套,只需要调整子节点遍历逻辑即可,动态列收集逻辑通用
- 如果需要自定义列顺序,直接修改
all_columns列表的元素排列顺序即可 - 不需要依赖NumPy做额外处理,pandas本身已经可以完美支持缺失值的自动填充
内容的提问来源于stack exchange,提问作者Fustavo Gringe
相关产品推荐
相关产品推荐

