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

Python实现含非公共标签的XML文件转CSV文件的方法咨询

实现方案

核心处理逻辑如下:

  • 针对XML节点不统一的问题,采用固定目标字段取值的方式,节点不存在时默认填充空值,确保CSV列结构统一
  • 示例XML本身没有唯一根节点,解析前先手动包裹根标签避免解析报错
  • address字段默认取其子节点houseno的文本内容,所有文本自动去除首尾空白字符
完整实现代码
import xml.etree.ElementTree as ET
import csv

# 此处可替换为从本地XML文件读取内容的逻辑
xml_content = """
<message>
<mail>raj@gmail.com</mail>
<address>
<houseno> 123 </houseno>
</address>
</message>

<message>
<mail>raj@gmail.com</mail>
<contact> 23278378</contact>
<address>
<houseno> 123 </houseno>
</address>
</message>

<message>
<mail>raj@gmail.com</mail>
<address>
<houseno> 123 </houseno>
</address>
<place> Mumbai </place>
</message>
"""

# 为无统一根节点的XML添加根标签,完成解析
root_xml = f"<root>{xml_content}</root>"
root = ET.fromstring(root_xml)

# 定义目标字段列表,可根据实际需求扩展
fieldnames = ["mail", "contact", "address", "place"]

# 写入CSV文件
with open("output.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    # 遍历所有message节点
    for message in root.findall("message"):
        row = {}
        row["mail"] = message.findtext("mail", default="").strip()
        row["contact"] = message.findtext("contact", default="").strip()
        address_node = message.find("address")
        row["address"] = address_node.findtext("houseno", default="").strip() if address_node else ""
        row["place"] = message.findtext("place", default="").strip()
        writer.writerow(row)
输出结果示例
mail,contact,address,place
raj@gmail.com,,123,
raj@gmail.com,23278378,123,
raj@gmail.com,,123,Mumbai

如果需要适配不确定字段的场景,可以先遍历所有message节点,自动收集所有出现过的一级子标签作为字段名,再写入CSV即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:36:05