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
相关产品推荐
相关产品推荐

