在线 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 对比
| 特性 | XML | JSON |
|---|---|---|
| 可读性 | 中等 | 高 |
| 文件大小 | 大(标签冗余) | 小 |
| 数据类型 | ❌ 全为字符串 | ✅ 多种类型 |
| 属性支持 | ✅ 原生支持 | ⚠️ 需约定 |
| 命名空间 | ✅ 支持 | ❌ 不支持 |
| 注释 | ✅ 支持 | ❌ 不支持 |
| Schema 验证 | ✅ XSD | ✅ JSON Schema |
| Web 标准 | 传统标准 | 现代标准 |
为什么需要 XML/JSON 转换
- Web 服务迁移:SOAP(XML)→ REST(JSON)API 升级
- 配置文件转换:旧系统 XML 配置 → 新系统 JSON 配置
- 数据集成:不同系统使用不同数据格式
- RSS/Atom 解析:RSS Feed(XML)→ JSON 处理
- Office 文档:.docx/.xlsx 本质是 XML,需要转换为 JSON
- 遗留系统对接:新系统对接使用 XML 的旧系统
常见转换挑战
| 挑战 | 说明 | 本站做法 |
|---|---|---|
| 属性 vs 子元素 | XML 属性在 JSON 中没有标准表示 | 默认 @attr 前缀,可关闭 |
| 重复元素 | 有时一个、有时多个 | 重复兄弟→数组;可强制指定标签或全部折叠 |
| 文本 / CDATA | 混合内容与未转义片段 | #text / #cdata;可选保留空白 |
| 命名空间 | 前缀进键名 | 保留 ns:tag 字面量,对接前先约定 |
| 畸形文档 | 标签不匹配被静默吞掉 | 开启 well-formed 校验,报错带行号 |
如何使用在线工具
使用 ToolVault 工具匣 的 XML/JSON 转换器:
- 粘贴 XML,点「XML → JSON」(或反向粘贴 JSON)
- 按需勾选:保留属性、保留 CDATA、全部元素折叠为数组、保留文本空白
- 若只有部分标签需要稳定数组形状,在「强制数组标签」填入局部名(如
role,item) - 出错时看红色提示的行号与上下文指针,而不是整段重读
- 全部在浏览器本地完成,数据不上传
说明:工具页是按钮触发转换,不是「自动检测格式」;也不做服务端流式大文件管道——大文档请先在本地拆分或抽样验证约定。
代码中的转换
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 工具匣 提供。更多开发者工具请访问 首页。
相关工具
相关文章
在线 CSV 转 SQL 工具:将表格数据导入数据库
CSV 转 INSERT:空单元格→NULL、MySQL 反引号或 PostgreSQL 双引号、BOM 剥离、Markdown 竖线转义,以及与 COPY/LOAD 的分工。
HTML 表格转 JSON 怎么保留行列结构?
把网页里的 HTML 表格转成 JSON,怎么保留表头、处理合并单元格、保持嵌套结构?逐步方法并附本站 HTML 表格转 JSON 工具。
Excel 转 JSON 后日期变成数字 / 中文乱码,怎么办?
把 Excel 转成 JSON 时日期变 44927 这种数字、中文乱码、空单元格丢失怎么办?讲清 Excel 日期序列号与编码坑,并附本站 Excel 转 JSON 工具。