📄 XML ⇔ JSON 转换
XML ⇔ JSON 双向转换。支持属性前缀、文本节点键、CDATA 和数组自动检测。可处理 RSS / SOAP 等复杂 XML。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
🔒 关于隐私
- ・所有处理均在您的浏览器中完成
- ・输入数据绝不会发送到任何服务器
🔗 相关工具
📖 常见的坑
在 XML 与 JSON 之间互相转换。支持配置属性前缀、文本节点键名、CDATA 处理与数组自动检测,因此 RSS、SOAP 这类复杂文档也能应付。处理全部在浏览器内完成。但请注意,两者的数据模型不同,转换本质上是有损的——XML → JSON → XML 走一圈,并不会还原成原文件。请把它当作单向导入的工具。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 来回转了一圈,XML 变成了另一份东西 | JSON 既没有「属性」这一概念,也没有保持元素顺序的机制,更没有注释。因此来回转换会丢失很多东西:属性的书写顺序、命名空间前缀(ns1: 变成 ns2: 在 XML 中是等价的)、<a/> 与 <a></a> 的区别、注释、DOCTYPE、处理指令、元素之间的空白。最严重的是数字签名:XMLDSig 签的是字节序列本身,因此只要来回转换一次,验签就必定失败。在 SOAP 或电子发票场景中,这是致命的。 |
请把设计做成「不需要来回转换」。如果是接收 XML 并在应用内部使用,就转成 JSON,而需要回传的 XML 要么保留原文件,要么从模板重新生成。凡涉及签名或验签的场景,正解是使用能直接处理 XML 的库——请把转成 JSON 严格看作「方便人读内容」的辅助手段。想知道对你的数据损失有多大,最快的检验方法就是转一圈再与原文件做 diff:用一次有意的实验摸清边界,胜过等出事后才发现。 |
| 同名标签只有一条时就不是数组了 | 「数组自动检测」是按标签实际出现的次数来判断的。因此有 3 个 <item> 就是数组,只有 1 个就成了对象。这意味着JSON 的形状取决于数据而非 schema,消费方的代码会在 items.map(...) 处崩掉。这是 XML 转 JSON 中最常踩的坑,更糟的是测试样本里通常有好几条,所以只会在生产环境中「恰好只有一条」的那天首次崩溃。抓取 RSS 源或搜索结果时最典型。 |
如果知道 schema,就始终把该元素当作数组处理。多数库都提供 alwaysArray / arrayNotation 之类的选项,可以列出必须永远是数组的标签名。若库不提供这种控制,就在消费端归一化,例如 const list = [].concat(data.items?.item ?? [])——把这一行养成习惯,这类故障几乎就绝迹了。测试数据请务必包含 0 条、1 条、多条三种情况:真正会崩的是前两种,而前两种恰恰是示例文件里没有的。 |
| 带命名空间的键在 JavaScript 里很难用 | <dc:creator> 在 JSON 中会变成键 "dc:creator"。因为含冒号,无法使用点号访问——obj.dc:creator 是语法错误。RSS 与 Atom 必然使用命名空间,因此凡是处理订阅源就一定会撞上:content:encoded、media:thumbnail、itunes:duration 等。更麻烦的是,前缀由各文档自行决定——同一个命名空间 URI,在这个源里是 dc:,在那个源里可能是 dcterms:,因此写死前缀的代码换一个源就跑不通了。 |
请用方括号写法 obj["dc:creator"] 访问;TypeScript 的类型定义同样可以用带引号的键名声明。要应对前缀的不确定性,只有在导入时归一化这一条实用路径:要么去掉前缀写成 creator,要么先按命名空间 URI 解析,再改名为自定的短名。但要注意单纯去掉前缀可能撞车——dc:date 与 atom:date 都会变成 date。找五个真实的订阅源试一遍,很快就能发现你没料到的前缀,这比读规范文档更快。 |
当心那些看起来像数字的字符串。XML 中一切皆文本,因此 <zip>007-0000</zip> 与 <tel>+81...</tel> 都是字符串,但某些转换实现会把「像数字的东西」自动转成数字,那一刻前导零消失、1e5 变成 100000、+81 变成 81。邮政编码、电话号码、产品编号、版本号务必配置为保持字符串。其次,在服务端解析来自外部的 XML 时,请当心 XXE(外部实体引用)。浏览器的 DOMParser 不会展开外部实体,因此本页的处理是安全的,但服务端解析器在若干实现中默认是开启的。在 PHP 中意味着不要传 LIBXML_NOENT;在 Java 中要用 setFeature 禁用外部实体。这是「任意读取本地文件」的经典漏洞,至今仍被频繁发现。
📖 使用方法
-
1
设置方向和选项选择 XML → JSON 或 JSON → XML,然后设置属性前缀、文本键和缩进。
-
2
输入数据在左侧粘贴 XML 或 JSON。点击示例按钮加载 RSS 或带属性的 JSON。
-
3
复制或下载结果转换结果实时显示在右侧。点击复制或下载按钮保存。
❓ 常见问题
属性和文本节点如何表示?
属性以带前缀的键(如 @id)存储,文本节点以指定键(如 #text)存储。两者均可配置。
支持 CDATA 节吗?
是的。XML → JSON 将 CDATA 内容保留为文本;JSON → XML 会自动用 CDATA 包裹含保留字符的值。
重复标签会变成数组吗?
启用"数组自动"时,多个同名兄弟标签会归入数组。禁用时则后者覆盖前者。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。