CSV 转 XML:每行变记录元素,列名变子标签的完整做法
讲清楚 CSV 怎么转成结构正确的 XML:每条数据行变一个记录元素,列名变子标签,自定义根标签和行标签,转义特殊字符,直接对接 SOAP 接口和老导入程序。
CSV 转 XML:每行变记录元素,列名变子标签的完整做法
我接手过一个老结算系统,财务那边每周导一份 CSV 报表,可上传口只认 XML。第一次我傻乎乎地用文本编辑器手敲标签,几百条记录敲到一半,闭合标签错了仨,备注列里一个 & 把整份文档顶报错。后来我才明白,CSV 转 XML 不是字符串拼接,是一套有规则的映射。这篇就把规则讲透,顺手记一下我踩过的坑。
CSV 转 XML 到底怎么映射
核心规则只有一句话:每条数据行变成一个记录元素,每一列变成该记录下的一个子标签,列名就是子标签名。再加一层,因为 XML 必须有且仅有一个根,整张表要被包进一个根元素里。
举个最小例子。下面这段 CSV:
id,name,price
1,Widget,9.99
2,"Smith, John",12.50
转成 XML 后是这样:
<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<id>1</id>
<name>Widget</name>
<price>9.99</price>
</row>
<row>
<id>2</id>
<name>Smith, John</name>
<price>12.50</price>
</row>
</rows>
看清楚三层结构:rows 是根,row 是每行的记录元素,id、name、price 是从表头来的子标签。第二行那个带逗号的 "Smith, John" 没有被拆成两列,因为合规的解析器认双引号包裹。你可以直接打开 CSV 转 XML 转换器 把上面这段贴进去试,左边粘 CSV,右边即时出 XML。
自定义根标签和行标签,对上目标 schema
默认的 rows 和 row 很少能直接用。老系统的 schema 往往要求特定的元素名。比如那个结算接口要的是批次包 Transactions 包着一堆 Transaction。把根元素名改成 Transactions,行元素名改成 Transaction,输出立刻对得上:
<Transactions>
<Transaction>
<id>1</id>
<amount>100.00</amount>
</Transaction>
</Transactions>
这一步是对接老系统的关键。导入程序按元素名匹配字段,名字差一个大小写它就不认。先翻一遍接口文档或 WSDL,确认批次包名和记录名,再设这两个值,省得来回返工。
列转元素还是转属性
同一份 CSV 有两种合法的 XML 写法。子元素方式是上面那种,每列一个标签。属性方式则把每列塞进记录元素的属性里:
<catalog>
<product sku="A1" title="Widget" price="9.99" stock="42"/>
</catalog>
什么时候选哪种?目标 schema 期望扁平记录,或者你在乎体积和 diff 的整洁,就用属性,自闭合元素更紧凑。但属性有两个硬伤:放不了干净的换行,严格 XML 里属性也没有顺序保证。所以自由文本、多行的「描述」「备注」这类列,老老实实留子元素。短的标量字段才适合做属性。
转义特殊字符,别让一个 & 顶崩文档
这是新手最容易翻车的地方。XML 里 &、<、> 是保留字符,属性值里还要管 " 和 '。一个客户名叫 Tom & Jerry < co. >,直接写进标签就是非法 XML。正确做法是转义:& 写成 &,< 写成 <,> 写成 >。工具会把每个值都自动转义,所以价格备注里出现 Q&A 或 <ref> 都不会破坏文档,也不会留下注入口子。
还有一个隐藏坑是表头。表头文字不会原样变标签名,因为 XML 标签名有规矩。带空格的 Order ID 会被清洗成 Order_ID,以数字开头的 2024 会补成 _2024,空表头变 col1,重复表头加数字后缀变 id_2。如果 schema 要精确的标签名,转完务必核一遍输出标签,必要时回源文件改表头。
分隔符和编码这些边角料
很多欧洲区域设置的表格用分号 ; 当字段分隔符,因为那边逗号是小数点。如果你的 1.234,56 被拆成了两列,八成是分隔符没对上。把分隔符切到分号,数据库导出的常是 Tab,对准了再读输出。开头那行 <?xml version="1.0" encoding="UTF-8"?> 声明头可开可关,看接收方是否需要 prolog。
转完拿到 XML,如果还想换个角度看数据,可以再用 XML 转 JSON 转换器 把它转成 JSON 在前端调试。两个工具配着用,一条数据能在 CSV、XML、JSON 三种形态之间随便切。整个过程纯浏览器本地跑,你的客户名单和导出文件不出标签页,这点对处理含隐私的报表很重要。
Made by Toolora · Updated 2026-06-13