ToolDeck

CSV 转 XML

将 CSV 数据转换为 XML 格式

加载示例

CSV 输入

XML 输出

本地运行 · 粘贴密钥安全无忧
XML 输出将显示在此处…

什么是CSV转XML转换?

CSV转XML转换将逗号分隔值转化为可扩展标记语言(XML)文档。CSV的每一行成为一个XML元素,每个列标题映射为子元素标签名。结果是一个层次化的自描述文档,系统可以通过模式(XSD或DTD)对其进行验证,并使用XSLT、XPath、SAX/DOM等标准XML工具进行处理。

自W3C于1998年发布XML 1.0规范以来,XML一直是数据交换标准。尽管JSON在许多Web API中已取代XML,但XML仍是SOAP Web服务、RSS/Atom订阅源、SVG图形、Office Open XML文档(.docx、.xlsx)、Android资源文件、Maven/Gradle构建配置,以及医疗(HL7 CDA)、金融(FpML、XBRL)和政府(NIEM)等受监管行业的必选格式。当源数据来自电子表格或数据库导出时,CSV转XML转换是将其接入这些系统的标准途径。

正确的CSV转XML转换器必须处理RFC 4180的边缘情况:包含逗号或换行符的引用字段、转义双引号以及不同的分隔符。在XML方面,它必须转义五个预定义XML实体(& < > " '),从标题生成有效的元素名称(替换空格和特殊字符),并生成带有正确XML声明和一致编码的格式良好的输出。

为什么使用CSV转XML工具?

手动从电子表格数据编写XML既缓慢又容易出错。漏掉闭合标签或忘记转义&符号都会产生无效的XML,导致下游解析器报错。此转换器通过单步操作完成解析、转义和元素生成。

在浏览器中即时转换
粘贴CSV即可获得格式良好的XML输出,包含正确的声明、根元素和嵌套子元素。无需命令行工具或安装任何库。
🔒
数据保持私密
所有转换均使用JavaScript在本地浏览器中运行。您的CSV数据不会上传至服务器,不会被记录,也不会存储在本机以外的任何地方。
🎯
生成有效且格式良好的XML
输出会转义XML实体,将标题名称净化为有效的元素标签,生成正确嵌套的标记,可通过任何XML验证器或检查工具的验证。
📋
支持任意CSV方言
自动检测逗号、分号、制表符和竖线作为分隔符。支持RFC 4180引用规则,包括转义双引号、多行字段和带BOM的UTF-8文件。

CSV转XML使用场景

SOAP与遗留API集成
许多企业系统仍使用需要XML请求体的SOAP Web服务。将CSV数据导出转换为符合服务WSDL模式的XML载荷,再发送请求。
构建配置文件
从依赖项、字符串或配置条目的电子表格中生成Maven pom.xml依赖列表、Android资源文件或Spring Bean定义。通过单个CSV源批量生成XML配置。
数据管道ETL
将数据库或分析工具的CSV导出接入基于XML的ETL管道。Apache NiFi、Talend和SSIS等工具接受XML输入,用于需要在每个阶段进行模式验证的转换工作流。
监管与合规报告
医疗(HL7 CDA)、金融(XBRL、FpML)和政府(NIEM)等行业要求以XML格式提交报告。在提交前将表格合规数据转换为所需的XML结构。
RSS与Atom订阅源生成
将包含文章、标题和日期的CSV列表转换为RSS 2.0或Atom订阅源。内容管理工作流通常以帖子电子表格开始,需要将其发布为聚合订阅源。
讲授XML基础知识
学习XML的学生可以粘贴熟悉的CSV数据,查看生成的元素层次、嵌套和实体转义结果。对比输入与输出,使格式良好性和有效性等抽象概念变得直观。

CSV转XML映射参考

了解CSV文件各部分如何映射到XML结构,有助于预判输出格式并在转换前调整数据。

CSV概念XML等价形式说明
CSV fileXML documentThe entire file maps to a root element containing all records
Header rowElement tag namesEach column header becomes the tag name for child elements
Data row<row> elementEach row becomes a repeating child element of the root
Cell valueText nodeCell content becomes the text inside the corresponding tag
Empty cellEmpty element or omittedCan be rendered as <field/> or excluded from output
Comma delimiterXML structureDelimiters are replaced by element nesting and closing tags

CSV与XML对比

CSV是基于分隔符的平面格式,没有内置模式或数据类型。XML是层次化的自描述标记语言,支持模式、命名空间和复杂嵌套。选择哪种格式取决于下游系统的要求。

CSV
纯文本格式,每行一条记录。无数据类型:所有值均为字符串。无层次或嵌套结构。文件体积小。被电子表格、数据库和脚本语言普遍支持。由RFC 4180规范定义。适合在双方都了解列布局的系统之间传输简单表格数据。
XML
带开闭标签的层次标记语言。支持属性、命名空间、混合内容和CDATA节。可通过XSD或DTD模式进行验证。由XSLT、XPath、SAX和DOM解析器处理。因标签开销而比CSV文件体积大。SOAP API、Office Open XML、RSS/Atom以及众多受监管行业均要求使用XML。

代码示例

以下是在不同编程语言中实现CSV转XML转换的可运行示例。每个示例将CSV表头行解析为元素标签名,将每个数据行包装在容器元素中,并对单元格内容中的XML实体进行转义。

JavaScript (browser / Node.js)
// CSV string → XML with proper escaping
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`

function csvToXml(csv, rootTag = 'data', rowTag = 'row') {
  const rows = csv.trim().split('\n').map(r => r.split(','))
  const [headers, ...data] = rows
  const xmlRows = data.map(row => {
    const fields = headers.map((h, i) => {
      const val = (row[i] || '').replace(/&/g, '&amp;')
        .replace(/</g, '&lt;').replace(/>/g, '&gt;')
      return `    <${h}>${val}</${h}>`
    }).join('\n')
    return `  <${rowTag}>\n${fields}\n  </${rowTag}>`
  }).join('\n')
  return `<?xml version="1.0" encoding="UTF-8"?>\n<${rootTag}>\n${xmlRows}\n</${rootTag}>`
}

console.log(csvToXml(csv))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <data><row><name>Alice</name><age>30</age>...</row>...</data>
Python
import csv, io
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString

csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""

reader = csv.DictReader(io.StringIO(csv_string))
root = Element('data')

for row in reader:
    row_el = SubElement(root, 'row')
    for key, value in row.items():
        child = SubElement(row_el, key)
        child.text = value

# Pretty-print with declaration
raw = tostring(root, encoding='unicode')
pretty = parseString(raw).toprettyxml(indent='  ')
print(pretty)
# → <?xml version="1.0" ?>
# → <data>
# →   <row>
# →     <name>Alice</name>
# →     <age>30</age>
# →     <city>Berlin</city>
# →   </row>
# →   ...
# → </data>
Go
package main

import (
	"encoding/csv"
	"encoding/xml"
	"fmt"
	"os"
	"strings"
)

type Field struct {
	XMLName xml.Name
	Value   string `xml:",chardata"`
}

type Row struct {
	XMLName xml.Name `xml:"row"`
	Fields  []Field
}

type Data struct {
	XMLName xml.Name `xml:"data"`
	Rows    []Row
}

func main() {
	input := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
	r := csv.NewReader(strings.NewReader(input))
	records, _ := r.ReadAll()
	headers := records[0]

	var data Data
	for _, rec := range records[1:] {
		row := Row{}
		for i, h := range headers {
			row.Fields = append(row.Fields, Field{
				XMLName: xml.Name{Local: h},
				Value:   rec[i],
			})
		}
		data.Rows = append(data.Rows, row)
	}

	out, _ := xml.MarshalIndent(data, "", "  ")
	fmt.Println(xml.Header + string(out))
	// → <?xml version="1.0" encoding="UTF-8"?>
	// → <data><row><name>Alice</name>...</row>...</data>
}
CLI (csvkit / xmlstarlet)
# Using Python's csv and xml modules via one-liner
python3 -c "
import csv, sys
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString

reader = csv.DictReader(sys.stdin)
root = Element('data')
for row in reader:
    r = SubElement(root, 'row')
    for k, v in row.items():
        SubElement(r, k).text = v
print(parseString(tostring(root, encoding='unicode')).toprettyxml(indent='  '))
" < data.csv

# Using Miller (mlr) — a dedicated CSV/JSON/XML tool
mlr --icsv --oxml cat data.csv

常见问题

CSV转XML转换是如何工作的?
转换器将CSV的第一行作为列标题读取。后续每一行成为一个XML元素,每个单元格值被包装在以其列标题命名的子元素中。结果是一个格式良好的XML文档,根元素下每个数据行对应一个子元素。
CSV数据中的&和<等特殊字符如何处理?
转换器会转义全部五个XML预定义实体:&变为&amp;,<变为&lt;,>变为&gt;,"变为&quot;,'变为&apos;。这样生成的XML是有效的,不会导致解析器报错或格式良好性问题。
可以为根元素和行元素使用自定义标签名吗?
可以。工具支持设置根元素名称(默认为"data")和行元素名称(默认为"row")。CSV的列标题始终作为子元素名称。如果标题包含空格或XML元素名称中无效的字符,工具会自动净化处理。
CSV转XML与CSV转JSON有什么区别?
CSV转XML生成带开闭标签、XML声明并支持模式验证(XSD/DTD)的层次标记文档。CSV转JSON生成更轻量的键值对象数组。当目标系统需要XML时(SOAP API、受监管格式、RSS订阅源)请使用XML;对于REST API、JavaScript前端和NoSQL数据库,请使用JSON。
如何验证生成的XML输出?
将输出粘贴到任意XML验证器中,检查格式良好性(正确嵌套、实体转义、标签匹配)。如需模式验证,请提供XSD文件,并使用xmllint、Xerces或在线XSD验证器。此工具生成的XML始终格式良好,但模式有效性取决于其结构是否与目标模式匹配。
转换器能处理大型CSV文件吗?
工具在浏览器中运行,性能取决于可用内存。在现代硬件上,几兆字节(数万行)的文件可以正常转换。对于非常大的文件(100MB以上),建议使用Python的csv和xml.etree模块或Go的encoding/csv和encoding/xml包等命令行工具,它们以流式方式处理数据,无需将全部内容加载至内存。
生成的XML是否与XSLT转换兼容?
兼容。输出是标准的格式良好XML,带有声明和一致的元素结构。您可以应用任意XSLT样式表将其转换为HTML、其他XML模式或纯文本。可预测的结构(根元素 > 行元素 > 字段元素)使编写XPath选择器和XSLT模板变得直观。