ToolAct工具行动

XML 转 JSON 工具

XML 输入
JSON 输出
行数: 1字符数: 0字节数: 0
行数: 1字符数: 0字节数: 0

什么是 XML 转 JSON?

XML 转 JSON 是将 XML(可扩展标记语言)数据转换为 JSON(JavaScript 对象表示法)格式的过程。当需要现代化旧系统、对接期望 JSON 的 REST API,或需要更紧凑、更易解析的数据格式时,此工具非常实用。转换后的 JSON 数据体积更小,解析速度更快,更适合 Web 应用。 用于生产数据或真实代码库时,仍应结合解析器、测试结果和项目规范再次确认。

使用方法

使用方法

  1. 在左侧输入框中粘贴或输入 XML 数据
  2. 选择缩进大小(2 个空格、4 个空格或 Tab)
  3. 转换后的 JSON 在右侧显示并带有语法高亮
  4. 检查转换结果并修复 XML 错误
  5. 点击「复制」或「下载」保存结果

数据结构说明

  • XML 属性、重复节点、命名空间和混合文本可以有多种合理的 JSON 映射方式;使用前请检查生成的结构。
  • 进行 API 迁移时,建议定义字段映射规则,而不是依赖单个样本的转换结果。

使用场景

将 XML 载荷转为可读 JSON 便于检查粘贴 SOAP、RSS、设备响应或合作方返回的 XML,浏览器的 DOMParser 会将文档转为 JSON 对象,保留根元素、嵌套子元素,并将重复的子元素名折叠为数组。足够简单的数字文本和 true/false 值会被自动转换类型。解析器遵循 W3C DOM Level 3 Core 规范,因此任何 DOMParser 能接受的格式良好的 XML 1.0 输入都会生成可遍历的树,JSON 转换只是对该树做深度优先遍历,通过统计同级重复名称来决定输出单个对象还是数组。
在替换 XML 集成前准备样本数据利用双面板编辑器对比原始 XML 和格式化后的 JSON,然后复制或下载 output.json 用于迁移说明、测试数据或 API 讨论。缩进可以在 2 空格、4 空格和 Tab 之间切换,以匹配目标代码库的风格。
在进入解析密集型流程前发现格式错误的 XML转换器会显示浏览器 XML 解析器的报错信息,而不是静默输出残缺结果。它侧重于元素和文本内容的转换,因此属性、命名空间、注释、处理指令和 Schema 校验在细节重要时仍需使用专门的 XML 工具。
确认属性如何映射为 JSON 键名当一个元素同时包含属性和子元素时,属性通常会加上 `@` 前缀以避免与文本内容或具名子元素冲突。检查生成的 JSON 中类似 @id 或 @type 的字段,如果偏好扁平的键名结构,可在消费代码中重命名。常见映射约定是 `@attribute` 对应 XML 属性,`#text` 对应与子元素并列的字符数据,元素本地名对应每个子元素,与许多 JSON-XML 库采用的 Badgerfish 约定一致。
识别转换器有意简化的 XML 文件依赖属性、命名空间、处理指令、注释或 CDATA 块的文档在 JSON 输出中会丢失细节。当这些 XML 特性承载业务数据时,应将结果视为快速可读的概览,而非无损迁移目标。数组检测仅在同级子元素名称重复时触发,因此单个 `<item>` 和两个 `<product>` 兄弟节点会被合并为一个包含两个键的对象而非列表;以 Clark 记法表示的命名空间 `{http://example.com/ns}user` 在提取本地名 `user` 时会被丢弃,这可能与另一个无命名空间的同名元素产生冲突。

技术原理

转换从浏览器内置的 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。

示例

简单元素

&lt;root>
  &lt;name>John&lt;/name>
&lt;/root>
→
{"root": {"name": "John"}}

重复元素

&lt;root>
  &lt;item>A&lt;/item>
  &lt;item>B&lt;/item>
&lt;/root>
→
{"root": {"item": ["A", "B"]}}

嵌套结构

&lt;root>
  &lt;user>
    &lt;name>John&lt;/name>
    &lt;age>30&lt;/age>
  &lt;/user>
&lt;/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 生成都在你的浏览器中完成,页面不会上传你的数据。