
XML 与 JSON:何时以及为何转换
XML(可扩展标记语言)和 JSON(JavaScript 对象表示法)都是基于文本的数据交换格式,但它们服务于不同的生态系统。XML 在 2000 年代主导了企业和 Web 服务,而 JSON 已成为现代 REST API 的标准。在集成旧系统与新系统时,两者之间的转换是一项常见任务。

为什么将 XML 转换为 JSON?
现代 API 消费
大多数 JavaScript 框架和现代后端原生支持 JSON。来自旧 API 的 XML 响应需要转换后才能轻松处理。
性能
JSON 通常比等效的 XML 更紧凑:
- XML 为每个字段使用开闭标签
- XML 需要显式类型声明
- JSON 数组自然映射到 JavaScript 数组
- JSON 解析在 JavaScript 引擎中通常更快
开发者体验
JSON 更易于手动阅读和编写。JSON.parse() 和 JSON.stringify() 函数内置于每个 JavaScript 运行时中。
集成
现代工具如 Node.js、Python 的 requests 库以及几乎所有 REST API 都原生使用 JSON。
XML 结构与 JSON 结构
简单 XML
<user>
<id>123</id>
<name>Alice Smith</name>
<email>alice@example.com</email>
<active>true</active>
</user>
等效 JSON:
{
"user": {
"id": "123",
"name": "Alice Smith",
"email": "alice@example.com",
"active": "true"
}
}

带属性的 XML
<product id="456" category="electronics">
<name>Laptop</name>
<price currency="USD">999.99</price>
</product>
属性的常见 JSON 表示:
{
"product": {
"@id": "456",
"@category": "electronics",
"name": "Laptop",
"price": {
"@currency": "USD",
"#text": "999.99"
}
}
}
属性在 XML 到 JSON 转换中会造成歧义——不同的库处理方式不同。
XML 数组(重复元素)
<users>
<user><id>1</id><name>Alice</name></user>
<user><id>2</id><name>Bob</name></user>
</users>
JSON 转换(对象数组):
{
"users": {
"user": [
{"id": "1", "name": "Alice"},
{"id": "2", "name": "Bob"}
]
}
}
XML 转 JSON 的常见挑战
类型信息
XML 没有原生类型系统——所有内容都是文本。在上面的例子中,id 变成了字符串 "123" 而不是数字 123。类型强制转换必须显式处理或通过约定处理。
属性与元素
XML 同时支持 <tag attribute="value">content</tag> 和嵌套的 <parent><child>value</child></parent>。这些需要在 JSON 表示中一致处理。
带属性的文本节点
当 XML 元素同时具有属性和文本内容时,JSON 必须表示两者,通常使用特殊键如 #text 表示文本内容。
命名空间
XML 支持 XML 命名空间(xmlns:prefix="uri")。这会显著复杂化 JSON 表示。大多数转换器会去除命名空间或将其扁平化。

CDATA 段
<![CDATA[... raw content ...]]> 段包含不应解析为 XML 的文本。这些通常转换为 JSON 中的纯字符串。
注释
XML 注释(<!-- comment -->)在 JSON 转换中被丢弃,因为 JSON 没有注释语法。
流行的转换库
JavaScript
- xml2js:简单、广泛使用的 Node.js 库
- fast-xml-parser:高性能,可自定义输出
- xml-js:一致处理属性和元素
Python
- xmltodict:将 XML 转换为 Python 字典(可序列化为 JSON)
- lxml:全面的 XML/HTML 处理,提供 ElementTree API
命令行
- xq(来自 yq/xq 工具):XPath 查询,JSON 输出
- python3 -c "import xmltodict, json, sys; print(json.dumps(xmltodict.parse(sys.stdin.read()), indent=2))":快速单行命令
XML Web 服务(SOAP)
许多遗留企业系统使用 SOAP(简单对象访问协议),它将业务数据包装在 XML 信封中:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getUser>
<userId>123</userId>
</getUser>
</soap:Body>
</soap:Envelope>
将 SOAP 响应转换为 JSON 通常需要剥离信封并提取相关负载。
使用 XML 转 JSON 转换器
我们的工具:
- 粘贴 XML 内容——接受任何格式良好的 XML
- 即时 JSON 输出——实时转换
- 属性处理——选择如何表示 XML 属性
- 数组检测——正确识别重复元素为数组
- 格式化选项——缩进(可读)或紧凑输出
- 复制 JSON——一键复制结果
- 下载——保存 JSON 文件
用于转换来自遗留 SOAP 或 XML 服务的 API 响应、转换配置文件以及将 XML 数据源集成到现代应用程序中。