XML转CSV

在你的设备上运行 · 你的文件从不离开你的设备。

拖入一个由重复记录组成的XML文件——<records><record>…</record>…</records>、RSS订阅源、数据库导出——得到一行一条记录的CSV。文档由浏览器的XML解析器读取,然后自动找到最长的那组重复元素,不管外面包着什么——外壳上带属性,或者订阅源自己的标题和链接就在条目旁边——结果那一行会写明用的是哪个列表。

每条记录的展平方式和JSON转CSV工具一样:嵌套元素变成点分隔的列(address.city),属性变成以@开头的列(@id),自身还有子元素的内部重复元素变成带序号的列(line.0.sku),只含文本的重复元素用分号连接(a;b),表头是所有出现过的列的并集。值完全按XML里的样子写出。含逗号、引号或换行的字段按RFC 4180加引号。

CSV是UTF-8,可选加BOM让Excel正确显示中文,分隔符由你选,下载前可以预览前200行。文件不上传。

如何XML转CSV

  1. 拖入XML文件,或者把XML粘贴到文本框。
  2. 选择输出的分隔符,决定要不要加Excel的BOM。
  3. 点击“转换为CSV”,看一下预览。
  4. 下载.csv。

支持的格式与限制

输入
XML(.xml)——文件或粘贴的文本,按文件声明的编码读取
输出
CSV,RFC 4180,UTF-8,可选BOM
行
最长的那组重复元素
嵌套
子元素→点分隔的列;属性→@列
运行位置
在浏览器本地完成,不上传

不适用于: 有好几组记录的文档——只有最长的一组变成行;想要另一组,先转成JSON,复制那个列表,再用JSON转CSV转换。

行是怎样找到的

行是根元素以下任何位置最长的那组重复元素,不管外面包着什么。<records count="2"><record>…</record><record>…</record></records>每个<record>一行,尽管外壳带着属性。RSS订阅源每个<item>一行,列有title、link和pubDate等,尽管频道自己的title和link就在这些item旁边。结果下方那一行会写明用的是哪个列表,比如rss.channel.item。

列表旁边的值,比如订阅源自己的标题,不属于任何一条记录,会被略去。文档里有好几组记录时,只有最长的一组变成行。想要另一组,先用XML转JSON(/xml-to-json)转换文件,把那个列表从它的[复制到],粘贴到JSON转CSV(/json-to-csv)再转换。

只有一条记录的文件

没有重复元素时,那一条记录就是唯一的一行,列名就是它自己的字段名:<records><record><name>Ali</name><city>Cairo</city></record></records>得到name和city两列。所以一个有时只有一条记录、有时有很多条的文件,表头保持不变——另一个程序按列名读取时,这一点很重要。

值怎样写出

值完全按XML里的样子写出:1.50还是1.50,TRUE还是TRUE,内容为NULL的元素得到文本NULL,而空元素得到空单元格。007保留它的零,日期按原样。以=、+、-或@开头的值前面会加一个撇号,和JSON转CSV(/json-to-csv)一样,这样电子表格不会把它当公式执行。

只含文本的重复子元素在一个单元格里用分号连接,所以两个<tag>元素得到a;b。自身还有子元素的重复子元素得到带编号的列,比如line.0.sku和line.1.sku。命名空间前缀保留在列名里,比如soap:Body.price。和子元素并列的文本放进#text列,不记录它在子元素之间的位置。文件按第一行声明的编码读取。

常见问题

我的文件会上传到服务器吗?
不会。转换完全在你的浏览器里完成,用的是你自己设备的算力。文件不会离开你的电脑或手机;每个工具用过一次之后,断网也照样能用。
它怎么知道哪些元素是行?
取根元素以下最长的那组重复元素——所以<records><record>…</record></records>每个<record>一行,RSS订阅源每个<item>一行。列表旁边的值,比如订阅源自己的标题,会被略去。没有重复元素时,那一条记录变成一行,列名就是它自己的字段名。
属性去哪了?
变成以@开头的列,<record id="3">得到一列@id。和子元素并列的文本放进#text列。
Excel打开会乱码吗?
不会。“为Excel添加BOM”开关(默认打开)会写入Excel识别UTF-8所需的标记,中文和各种符号都能正确显示。

相关工具

表格与数据中的更多工具

本页的其他语言版本: English · العربية · Deutsch · Français · Español · Русский · Português · हिन्दी · Türkçe · עברית · فارسی · اردو · Bahasa Indonesia · বাংলা