XML 转 JSON 工具
什么是 XML 转 JSON?
XML 转 JSON 是将 XML(可扩展标记语言)数据转换为 JSON(JavaScript 对象表示法)格式的过程。当需要现代化旧系统、对接期望 JSON 的 REST API,或需要更紧凑、更易解析的数据格式时,此工具非常实用。转换后的 JSON 数据体积更小,解析速度更快,更适合 Web 应用。 用于生产数据或真实代码库时,仍应结合解析器、测试结果和项目规范再次确认。
使用方法
使用方法
- 在左侧输入框中粘贴或输入 XML 数据
- 选择缩进大小(2 个空格、4 个空格或 Tab)
- 转换后的 JSON 在右侧显示并带有语法高亮
- 检查转换结果并修复 XML 错误
- 点击「复制」或「下载」保存结果
数据结构说明
- XML 属性、重复节点、命名空间和混合文本可以有多种合理的 JSON 映射方式;使用前请检查生成的结构。
- 进行 API 迁移时,建议定义字段映射规则,而不是依赖单个样本的转换结果。
使用场景
技术原理
转换从浏览器内置的 XML 解析器开始。`new DOMParser().parseFromString(xmlString, 'application/xml')` 返回一个遵循 W3C DOM Level 3 Core 的 Document,依据 XML 1.0(第五版)验证格式良好性,并将结果暴露为由 Element、Attr、Text、CDATASection 和 Comment 节点组成的树。如果输入格式不正确,解析器不会抛出异常——它返回一个根元素为 `<parsererror>` 的文档,其中包含错误位置和原因,因此转换器会先检查 `doc.querySelector('parsererror')` 并显示该消息,而不是输出残缺的 JSON。 树到 JSON 的映射采用深度优先遍历,遵循 Badgerfish 风格的约定。每个元素变为一个以本地名为键的属性;子元素变为嵌套对象;元素属性以 `@` 前缀展平(例如 `<user id="7">` → `{ "user": { "@id": "7" } }`);与子元素并列的文本内容存储在 `#text` 下。同级重复的同名元素折叠为 JSON 数组:两个 `<item>` 节点变为 `"item": [ ... ]`,但单个 `<item>` 保持为普通对象——这就是众所周知的「单个与多个」歧义,因为 XML 无法区分单元素列表和标量值,而 JSON 将 `"item": {...}` 和 `"item": [{...}]` 视为不同的结构。 部分 XML 特性没有干净的 JSON 等价形式,转换是有意有损的。XML 保留元素顺序,但 JSON 对象的键顺序在所有消费端不保证一致(虽然 ES2015 规定了字符串键的插入顺序,但 JSON Schema 等模式不约束它)。混合内容如 `<p>Hello <b>world</b>!</p>` 将文本与元素交织在一起,无法往返转换到简单的键值模型中。Clark 记法的 XML 命名空间(`{http://example.com/ns}user`)缩减为本地名 `user`,可能与另一个无关的同名元素冲突。CDATA 块如 `<![CDATA[<raw>]]>` 被展开为纯文本。处理指令(`<?xml-stylesheet ...?>`)、注释(`<!-- ... -->`)和 XML 声明被丢弃,因为 JSON 没有对应的语法。缩进通过 `JSON.stringify(value, null, indent)` 实现,支持 2 空格、4 空格或 `'\t'`。
- 解析器:`new DOMParser().parseFromString(xml, 'application/xml')` 遵循 W3C DOM Level 3 Core;错误以 `<parsererror>` 根元素的形式呈现,而非抛出异常。
- 映射约定:Badgerfish 风格用 `@attr` 表示属性、`#text` 表示混合文本、元素本地名表示子元素;Parker 约定丢弃属性,Spark 约定将属性保留在 `$` 中。
- 同名重复子元素折叠为 JSON 数组;单个子元素保持为对象——经典的「单个与多个」歧义在 XML 端没有解决方案。
- 有损特性:属性(不带 `@` 前缀时)、命名空间(`xmlns:foo`)、处理指令、注释、XML 声明和 CDATA 包装。
- 混合内容(`<p>Hello <b>world</b>!</p>`)无法往返转换为键值 JSON;在不保留键顺序的消费端中元素顺序可能丢失。
- 数字/布尔值强制转换是一种刻意选择:`<age>30</age>` 可能变为 `30`(数字)或 `"30"`(字符串);前导零(`007`)应保持为字符串。
- 输出格式化使用 `JSON.stringify(value, null, indent)`,缩进为 2 空格、4 空格或 `'\t'`;结果为无 BOM 的 UTF-8。
示例
简单元素
<root>
<name>John</name>
</root>
→
{"root": {"name": "John"}}重复元素
<root>
<item>A</item>
<item>B</item>
</root>
→
{"root": {"item": ["A", "B"]}}嵌套结构
<root>
<user>
<name>John</name>
<age>30</age>
</user>
</root>
→
{"root": {"user": {"name": "John", "age": 30}}}常见问题
XML 元素如何映射到 JSON?
每个元素变为一个 JSON 属性,其值为元素的内容(字符串或嵌套对象)。同名重复元素会变为数组。属性通常以 '@' 前缀表示,或存放在 '$' 这样的特殊键下。具体约定因实现而异,多数页面允许配置。
为什么 XML 转 JSON 有时会丢信息?
XML 区分元素、属性、文本内容、混合内容(文本与元素混排)、命名空间、处理指令和注释;而 JSON 只有对象、数组、字符串、数字、布尔值和 null。把更丰富的 XML 树映射到 JSON,会丢失顺序信息以及「元素 vs 属性」的区分。
混合内容(文本 + 子元素)如何处理?
Hello world!
没有干净的 JSON 表示。页面通常会用一个特殊键(如 '#text' 或 '$')来收集散落的文本,但文本与元素之间的顺序未必能保留。如果计划做往返转换,建议避免使用混合内容。XML 命名空间怎么处理?
带前缀的元素(如 <ns:foo>)会变为字符串键 'ns:foo',或拆分为 ns 与本地名称两个属性。xmlns 声明可能以类属性的形式保留,也可能被丢弃,具体取决于页面配置。
可以从 JSON 还原成完全相同的 XML 吗?
通常无法做到完全无损往返,尤其是涉及混合内容、注释、处理指令和属性顺序时。对于纯数据型 XML(配置、简单记录),往返一般没问题。对于文档型 XML(如 DocBook、HTML、RSS),请使用真正的 XML 解析器。
<foo/> 与 <foo></foo> 等价吗?
对解析器来说是等价的。两者都会生成一个值为空字符串或 null 的 foo 属性。自闭合写法在 XML 中纯属书写习惯。
转换是在本地完成的吗?
是的。XML 解析和 JSON 生成都在你的浏览器中完成,页面不会上传你的数据。