跳到主要内容
数据处理2026-07-155 分钟阅读

在线 XML/JSON 转换器:数据格式互转工具

什么是 XML 和 JSON

XML(eXtensible Markup Language,可扩展标记语言)是一种用于标记数据的标记语言,支持属性和命名空间。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,使用键值对表示数据。

对比示例

XML:

<user id="1">
  <name>张三</name>
  <email>zhang@example.com</email>
  <bio><![CDATA[score: a < b]]></bio>
  <tags>
    <tag>developer</tag>
    <tag>admin</tag>
  </tags>
</user>

JSON(本站默认约定):

{
  "user": {
    "@id": "1",
    "name": "张三",
    "email": "zhang@example.com",
    "bio": {
      "#cdata": "score: a < b"
    },
    "tags": {
      "tag": ["developer", "admin"]
    }
  }
}

属性落在 @id,CDATA 落在 #cdata,重复兄弟元素变成数组——这是 ToolVault 转换器的默认行为,可在工具页关掉或改成「全部折叠为数组」。

XML vs JSON 对比

特性XMLJSON
可读性中等高
文件大小大(标签冗余)小
数据类型❌ 全为字符串✅ 多种类型
属性支持✅ 原生支持⚠️ 需约定
命名空间✅ 支持❌ 不支持
注释✅ 支持❌ 不支持
Schema 验证✅ XSD✅ JSON Schema
Web 标准传统标准现代标准

为什么需要 XML/JSON 转换

  1. Web 服务迁移:SOAP(XML)→ REST(JSON)API 升级
  2. 配置文件转换:旧系统 XML 配置 → 新系统 JSON 配置
  3. 数据集成:不同系统使用不同数据格式
  4. RSS/Atom 解析:RSS Feed(XML)→ JSON 处理
  5. Office 文档:.docx/.xlsx 本质是 XML,需要转换为 JSON
  6. 遗留系统对接:新系统对接使用 XML 的旧系统

常见转换挑战

挑战说明本站做法
属性 vs 子元素XML 属性在 JSON 中没有标准表示默认 @attr 前缀,可关闭
重复元素有时一个、有时多个重复兄弟→数组;可强制指定标签或全部折叠
文本 / CDATA混合内容与未转义片段#text / #cdata;可选保留空白
命名空间前缀进键名保留 ns:tag 字面量,对接前先约定
畸形文档标签不匹配被静默吞掉开启 well-formed 校验,报错带行号

如何使用在线工具

使用 ToolVault 工具匣 的 XML/JSON 转换器:

  1. 粘贴 XML,点「XML → JSON」(或反向粘贴 JSON)
  2. 按需勾选:保留属性、保留 CDATA、全部元素折叠为数组、保留文本空白
  3. 若只有部分标签需要稳定数组形状,在「强制数组标签」填入局部名(如 role,item)
  4. 出错时看红色提示的行号与上下文指针,而不是整段重读
  5. 全部在浏览器本地完成,数据不上传

说明:工具页是按钮触发转换,不是「自动检测格式」;也不做服务端流式大文件管道——大文档请先在本地拆分或抽样验证约定。

代码中的转换

JavaScript(与本站相近的约定)

const { XMLBuilder, XMLParser } = require('fast-xml-parser');

// XML → JSON(务必开校验,否则错标签可能静默通过)
const parser = new XMLParser({
  ignoreAttributes: false,
  attributeNamePrefix: '@',
  cdataPropName: '#cdata',
  textNodeName: '#text',
  processEntities: false,
});
const xml = '<user id="1"><name>张三</name></user>';
const json = parser.parse(xml, true);

// JSON → XML
const builder = new XMLBuilder({
  ignoreAttributes: false,
  attributeNamePrefix: '@',
  cdataPropName: '#cdata',
  format: true,
});
const xmlStr = builder.build(json);

Python

import xmltodict
import json

# XML → JSON
xml_str = '<user id="1"><name>张三</name></user>'
data = xmltodict.parse(xml_str)
json_str = json.dumps(data, ensure_ascii=False, indent=2)

# JSON → XML
data = {"user": {"name": "张三"}}
xml_str = xmltodict.unparse(data, pretty=True)

属性、命名空间、混合内容:无解三角

三个 XML 特性在 JSON 里没有自然归宿,每个转换器选的答案还不同。属性:前缀约定(@id)或子对象——选一个全管线一致。命名空间:ns:element 平铺成键名或丢掉命名空间 URI(两个不同元素撞名);SOAP 与企业 schema 重灾区。混合内容(文字与标签交错)最难——JSON 只能发明 #text;需要保留空白时打开工具的「保留文本空白」。混合内容很重的文档型 XML 不必强行转 JSON,按 XML 处理更合适。

数组形状:为什么要「强制折叠」

下游 TypeScript / JSON Schema 往往假定 tag: string[],但 XML 里只出现一次时,转换器通常输出标量 tag: "admin"——运行时就会炸。解决办法三选一:源头保证重复、消费方同时兼容标量与数组,或在转换时用「强制数组标签 / 全部折叠为数组」稳住形状。对接契约评审时把这一条写进 checklist。

XXE:为什么转换器必须关实体展开

解析器若解析文档类型定义(DTD)并展开外部实体,可被诱导执行 XXE:恶意 DTD 读本地文件或对内网端点发起 SSRF。我们的转换器默认关闭实体处理与外部实体;喂不可信 XML 前应验证任何工具是否同样收紧。一个乐意解析实体的转换器,就是指向自己环境的文件泄露原语。

FAQ

XML 属性怎么转换为 JSON?

没有单一标准。本站默认用 @ 前缀(如 @id),文本用 #text,CDATA 用 #cdata。可在工具页关闭「保留属性」以丢弃属性。

JSON 转 XML 会丢失信息吗?

可能。数组需要约定元素名;JSON 类型在 XML 里往往变成文本;没有属性前缀约定时,属性与子元素会对不齐。转换前先对齐字段命名与数组形状。

标签写错为什么以前「能转」?

部分解析器默认不校验配对,错闭合会被静默改写。本站开启 well-formed 校验,不匹配会直接报错并给出行号,便于定位。

什么时候用 XML,什么时候用 JSON?

使用 XML:需要命名空间、Schema 严格验证、文档混合内容(如 XHTML)。使用 JSON:Web API、配置文件、前后端数据交换。现代项目更多选择 JSON,但边界仍有大量 XML。

排查注记

「无解三角」一节承认属性、命名空间、混合内容在 JSON 里没有自然归宿、且每个转换器答案不同——所以给出的规则不是选对答案,而是选一个答案并全管线一致。数组形状一节抓的是运行时炸弹:XML 里只出现一次的元素会转成标量,下游假定 tag: string[] 的代码运行时就炸,解法三选一并写进对接契约 checklist。XXE 一节的说服句很重——一个乐意解析实体的转换器,就是指向自己环境的文件泄露原语;well-formed 校验则是对「以前能转」的纠偏:部分解析器默认不校验配对、错闭合被静默改写,本站选择报错并给出行号。


本文由 ToolVault 工具匣 提供。更多开发者工具请访问 首页。