XML 转 JSON 转换工具

将 XML 文档一键解析为 JSON 数据,基于浏览器原生 DOMParser 实现,支持属性名前缀、CDATA 处理、空元素表示、类型推断等配置,同名子元素自动合并为数组,XXE 防护。适用于 SOAP 响应解析、RSS / Atom Feed 读取、SVG / Office 文档解析、Spring / Maven 配置转换等场景,所有数据在浏览器本地处理。

转换选项
JSON 输出
输入 XML 后将自动转换为 JSON

常见问题

1. XML 转 JSON 有哪些常见应用场景?

尽管 JSON 已是现代 Web API 的事实标准,XML 在以下场景仍广泛存在,需要转换为 JSON 便于前端处理:

  • SOAP Web Service 响应:传统企业级服务(银行、保险、SAP)的响应均为 XML
  • RSS / Atom Feed:博客订阅源、新闻聚合仍以 XML 为主
  • SVG 图形解析:可缩放矢量图形本质是 XML,提取元数据时需转为 JSON
  • Office 文档:docx / xlsx / pptx 内部均为 XML(Office Open XML 标准)
  • Spring / Maven 配置:旧版 Java 项目配置文件 pom.xml / web.xml
  • Android 资源:strings.xml / AndroidManifest.xml 解析
  • Apple Plist:iOS / macOS 配置文件(XML 格式变体)
  • Sitemap:搜索引擎站点地图 protocol.xml
2. 属性名前缀 @ 是什么意思?为什么需要它?

XML 元素可以同时拥有属性和子元素,而 JSON 对象的 key 必须唯一。如果不加前缀,属性名可能与子元素名冲突。例如:

<user id="1">
  <id>100</id>
  <name>Aether</name>
</user>

加上 @ 前缀后转为 JSON:

{
  "@id": "1",
  "id": "100",
  "name": "Aether"
}

@id 表示属性,id 表示子元素,互不冲突。可在选项中改为其他前缀(如 _$)或留空(不推荐,可能冲突)。

3. XML 的同名子元素如何转换为 JSON?

XML 允许同名元素重复出现(如多个 <tag>),JSON 没有原生的「重复键」概念。本工具采用 XML → JSON 的标准做法:同名子元素自动合并为数组。例如:

<tags>
  <tag>前端</tag>
  <tag>工具</tag>
</tags>

转换为:

{
  "tags": {
    "tag": ["前端", "工具"]
  }
}

若只有一个同名元素,默认不包数组(保持简洁)。开启「子元素始终为数组」选项后,即便只有一个也会包成数组,便于下游统一处理。

4. CDATA 合并与分离有什么区别?

CDATA 用 <![CDATA[...]]> 包裹原样文本,常用于嵌入含特殊字符的内容(HTML 片段、代码、正则)。两种处理方式:

  • 合并(默认):CDATA 内容与普通文本节点合并,统一放入 #text 字段。适合只关心最终文本的场景
  • 分离:CDATA 单独放入 #cdata 字段,与 #text 区分。适合需要保留 CDATA 边界信息的场景(如反向重建 XML)

分离模式下,单个 CDATA 为字符串,多个 CDATA 自动包为数组。

5. XML 的空元素如何表示为 JSON?

XML 空元素(如 <note/><note></note>)没有内容,JSON 没有统一的「空」表示。三种选项:

  • null(默认):转为 null,最简洁,明确表示「无值」
  • 空字符串:转为 "",与空文本元素一致
  • 空对象:转为 {},保留「这是一个元素」的语义,便于下游统一类型判断

注意:空元素与「有属性但无文本 / 子元素」的元素不同,后者仍转为对象(包含属性字段)。

6. 类型推断有什么用?有什么风险?

XML 是纯文本格式,所有值都是字符串。开启「类型推断」后,工具会自动识别:

  • "true" / "false" → 布尔值
  • "null" → null
  • "95" → 数字 95
  • "3.14" → 数字 3.14

风险:可能误判。例如手机号 "13800138000" 会被转为数字,丢失前导零(如 "007" → 7);ID "0001" 也会丢失前导零。若数据需要保留原始字符串形式(如编号、电话、邮政编码),建议关闭类型推断。

本工具仅转换安全整数(Number.isSafeInteger)与有限浮点数,避免大整数精度丢失。

7. XML 注释怎么处理?

XML 注释格式为 <!-- 注释内容 -->。本工具默认忽略注释(ignoreComments: true),转换结果中不包含注释信息。

关闭「忽略注释」选项后,注释会被保留——但由于 JSON 没有原生注释语法,注释会被放入特殊字段(如 #comment)。多数场景建议保持默认忽略。

注意:XML 声明 <?xml version="1.0"?> 不是注释,而是处理指令,本工具会自动跳过,不纳入转换结果。

8. 混合内容(既有文本又有子元素)怎么处理?

XML 允许元素同时包含文本和子元素(混合内容),常见于富文本格式(如 XHTML、DocBook)。例如:

<p>Hello <strong>world</strong>!</p>

本工具会将文本放入 #text 字段,子元素作为普通字段:

{
  "p": {
    "#text": "Hello !",
    "strong": "world"
  }
}

注意:混合内容的文本会被拆分(文本节点在子元素前后会分别保留),但合并后可能丢失原始顺序信息。若需保留顺序,建议使用专门的 XML 处理库(如 fast-xml-parser 的 preserveOrder 选项)。

9. 与 JSON 转 XML 工具是什么关系?

两者互为反向工具,共同覆盖 XML 与 JSON 的双向转换:

  • JSON 转 XML(/json-to-xml):JSON → XML 单向导出,可配置根节点名、数组项名、属性风格、CDATA 包裹、XML 声明。面向 SOAP 请求构造、SVG 生成、Office 文档生成等场景
  • XML 转 JSON(/xml-to-json,本工具):XML → JSON 单向解析,可配置属性前缀、CDATA 处理、空元素表示、类型推断。面向 SOAP 响应解析、RSS 读取、配置文件转换等场景

由于两种格式的语义差异(XML 同名重复 vs JSON 数组、XML 属性 vs JSON 字段),往返转换可能不保证完全一致。建议根据场景选择单向工具。

10. 如何防护 XXE 攻击?

XXE(XML External Entity)是利用 XML 外部实体引用读取本地文件 / 发起 SSRF 的攻击手法。例如:

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>

本工具使用浏览器原生 DOMParsertext/xml 模式解析,该模式:

  • 不加载外部实体(天然防 XXE)
  • 不发起网络请求(防 SSRF)
  • 不解析 DTD(防实体爆炸攻击 Billion Laughs)

即使输入含恶意 DOCTYPE 声明,也会被安全忽略,不会读取本地文件或发起网络请求。

11. 大文件解析性能如何?

本工具基于浏览器原生 DOMParser,性能接近原生 XML 解析器。常见文件规模参考:

  • 小型配置文件(< 10KB,如 pom.xml、web.xml):瞬时完成(< 1ms)
  • 中型文档(10KB - 1MB,如 RSS Feed、SVG):< 50ms
  • 大型文档(1MB - 10MB,如 SOAP 响应、Office 文档):100ms - 1s
  • 超大型文档(> 10MB):可能卡顿,建议改用流式解析(SAX)

由于 DOMParser 会将整个文档加载到内存构建 DOM 树,超大型文件可能占用较多内存。本工具在前端实时转换,不会阻塞主线程太久(< 100ms 的转换不会感知卡顿)。

12. 数据会上传到服务器吗?

不会。所有转换在浏览器本地完成,不发起任何网络请求。本工具基于纯原生 TypeScript + 浏览器 DOMParser 实现,无第三方依赖,数据不会离开你的设备。适合处理敏感配置、密钥、个人信息等不可外泄的数据。