XML 转 CSV:把重复节点变成表格行的完整做法
讲清 XML 转 CSV 的核心,重复节点变行、属性与子元素做列、嵌套扁平化,配老系统导出、电商数据源、银行对账单三类真实场景与一个可照搬的转换例子。
XML 转 CSV:把重复节点变成表格行的完整做法
很多数据明明长得像表格,却被包在 XML 里:成排的 <order>、<product>、<transaction>,每个里面又挂着几个字段。想丢进 Excel 排序筛选,第一步就是把它摊平成 CSV。这件事看着简单,真动手才发现要处理重复节点、属性、嵌套、字段不齐这几个坑。这篇把这几个坑逐个讲透,再给一个可以照着核对的转换例子。
重复节点变成行,子元素变成列
这是整件事的核心规则。一份能转成表格的 XML,一定有一个元素在反复出现,比如 <rows> 里的一串 <row>,或者 <library> 里的一串 <book>。每出现一次,就是表格里的一行。
行确定后,这条记录里的每个子元素就是一列。<row><name>Ada</name><age>36</age></row> 在 name,age 这个表头下,生成一行 Ada,36。整份文档跑下来,就是一行记录配若干列字段的标准表格。
哪个元素当行,通常取同一父节点下重复最多的那个,这正是你要的记录。要是一份文件里有好几组重复元素,比如开头一个 <header> 块,后面一长串 <order>,自动识别可能挑错,这时手动指定记录元素名 order,就只有订单当行。这类细节我整理成了在线工具,直接用 XML 转 CSV 粘进去就能看到识别结果。
属性也能做列,加 @ 前缀区分
子元素之外,XML 标签上还常挂属性,而且关键字段经常就藏在属性里。像 <item sku="A1" qty="3"/>,几乎没有子元素文本,真实数据全在 sku 和 qty 上。
打开「包含属性」,每个属性变成单独一列,列名前加 @ 前缀,这样就算和某个同名子元素撞名也不冲突。<book id="b1"><title>SICP</title></book> 转出来是 @id 和 title 两列,值是 b1 和 SICP。反过来,当属性只是 xmlns 这类记账信息,关掉这个开关让它们被忽略,表格更干净。
嵌套字段怎么扁平化
记录里的子元素不总是纯文本,有时它自己还套着一层。<addr><city>London</city></addr> 这种,处理方式是展开成带点的列名 addr.city,值是 London。一层嵌套能干净地映射成列,深一点的分支若实在没法平铺成一个合理单元格,会把内部文本收集起来,让你至少看到内容而不是空格,需要更细的列就回上游把 XML 改一改。
字段不齐是另一个常见情况。表头取所有记录字段的并集,按首次出现的顺序排。某条记录缺某个字段,该列就留空。前面的 <item> 带了 discount、后面的没带,也能归到同一个 discount 列下,没有的行空着,各行始终对得齐。
一个真实的转换例子
下面这段商品数据源,故意让第二条记录多一个促销字段,看并集表头怎么对齐:
<catalog>
<product sku="A1"><name>耳机</name><price>199</price></product>
<product sku="A2"><name>音箱</name><price>349</price><promo>满300减50</promo></product>
</catalog>
打开包含属性后,转出来的 CSV 是:
@sku,name,price,promo
A1,耳机,199,
A2,音箱,349,满300减50
注意三点:@sku 来自属性,前面带了前缀;promo 这个列只有第二行有值,第一行自动留空;每个字段都按 RFC 4180 转义,值里要是夹了逗号、引号或换行,会自动加双引号、内部引号翻倍,导进表格永远不串列。
老系统导出、电商数据源、银行对账单
三类场景最常碰到这种转换。第一类是老系统迁移:一个只能导出 XML 的旧系统,新工具吃的是 CSV,把 <record> 列表转过去,打开属性让存成 id="..." 的主键变成 @id 列带过来,选导入工具认的分隔符,数据里逗号多就换成 Tab 或竖线。
第二类是电商数据源:供应商发来几百个 <product> 的 XML feed,商品运营要 Google Sheets 版本,转成 CSV 下载拖进去就行,不用为这一件事写脚本。第三类是银行对账单:不少银行回单和流水以 XML 下发,一串 <transaction> 里挂着金额、对手方、时间,转成表格才方便做透视和对账。
我自己上周处理一份接口返回的 XML,原本要手抄字段到表格里核对,改用并集表头的转换后,十几条字段不齐的记录两秒就摊平成网格,缺字段的位置一目了然,省下的全是体力活。
转之前先把 XML 弄合法
最后提醒一个最容易踩的坑:一个没闭合的标签、一个落单的 &、或者嵌套对不上,都会让解析器拒绝整份文档,输出一片空白。好的工具会带着行号报解析错误,而不是瞎猜。遇到这种情况,先用 XML 格式化工具 过一遍把结构理顺,再来转换。
转完之后,如果还想换个目标格式,XML 与 JSON、CSV 之间的几条路都是通的,按需要挑一条走就好。
Made by Toolora · Updated 2026-06-13