XML 转 JSON 转换工具
将 XML 文档一键解析为 JSON 数据,基于浏览器原生 DOMParser 实现,支持属性名前缀、CDATA 处理、空元素表示、类型推断等配置,同名子元素自动合并为数组,XXE 防护。适用于 SOAP 响应解析、RSS / Atom Feed 读取、SVG / Office 文档解析、Spring / Maven 配置转换等场景,所有数据在浏览器本地处理。
常见问题
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> 本工具使用浏览器原生 DOMParser 的 text/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 实现,无第三方依赖,数据不会离开你的设备。适合处理敏感配置、密钥、个人信息等不可外泄的数据。