XML 转 JSON 转换器
粘贴 XML 即时获得 JSON。属性转换为 @_ 键,重复元素自动变为数组。100% 浏览器端运行,数据不上传,无需注册。
选项 · 2 空格 · XML → JSON
什么是 XML 转 JSON 转换,它是如何工作的?
XML(可扩展标记语言)和 JSON(JavaScript 对象表示法)都是结构化数据格式,但它们的模型根本不同:XML 是一棵带有属性和混合内容(文本与子元素交错)的元素树;JSON 是一棵由对象、数组、字符串、数字、布尔值和 null 值组成的树。在两者之间转换需要一套约定来弥合这种不匹配。
本工具使用最广泛采用的约定,与流行库 fast-xml-parser(Node.js)、xmltodict(Python)和 JAXB(Java)使用的相同:
**1. 属性 → @_ 前缀。** XML 属性在 JSON 中没有直接对应物。约定是将其表示为带 @_ 前缀的键。因此
**2. 带属性的元素文本内容 → #text。** 当元素同时拥有属性和文本内容时 —
**3. 重复兄弟元素 → 数组。** XML 允许多个同名子元素;JSON 对象不能有重复键。解决方案是将同名兄弟元素收集为数组。一个
**4. 不进行类型强制转换 — 所有值保持为字符串。** XML 没有文本内容的原生类型系统。XML 中的 "123" 值是字符串。将其转换为 JSON 数字 123 需要对作者意图做出假设 — 这对邮政编码("01234" → 1234)、电话号码、填充标识符和精度敏感的小数字符串来说是错误的假设。本工具将所有值保留为字符串。对于你明确知道类型的字段,在自己的代码中应用类型强制转换。
**5. 对注释、处理指令和命名空间有损。** XML 支持 JSON 不支持的特性:注释()、处理指令()和命名空间语义。这些在转换过程中会被丢弃或近似处理。如需无损 XML 处理 — 重新格式化、压缩、验证 — 请使用 XML 格式化工具。反向转换 — 从 JSON 构建 XML — 请使用 JSON 转 XML 转换器。
**为什么要将 XML 转换为 JSON?** JSON 是 JavaScript 的原生格式,也是 REST API 的默认交换格式。如果你从遗留 SOAP 服务、RSS Feed、Sitemap 或企业系统接收 XML,将其转换为 JSON 可以让你使用标准 JavaScript 对象访问、JSON 路径查询以及任何支持 JSON 的数据库或 API 来处理数据。这种转换是单向桥接:适用于在现代技术栈中消费 XML 数据,但不适合保留或往返传输 XML 文档。
// Convert XML to JSON in Node.js using fast-xml-parser
import { XMLParser } from 'fast-xml-parser';
const xml = `<catalog>
<product id="P01">
<name>Wireless Headphones</name>
<price currency="USD">79.99</price>
</product>
</catalog>`;
const parser = new XMLParser({
ignoreAttributes: false, // preserve attributes
attributeNamePrefix: '@_', // @_ prefix for attributes
textNodeName: '#text', // #text for mixed element content
parseAttributeValue: false, // no type coercion on attributes
parseTagValue: false, // no type coercion on element text
});
const result = parser.parse(xml);
console.log(JSON.stringify(result, null, 2));
// {
// "catalog": {
// "product": {
// "@_id": "P01",
// "name": "Wireless Headphones",
// "price": {
// "@_currency": "USD",
// "#text": "79.99"
// }
// }
// }
// } 核心功能
实时转换
输入或粘贴 XML 时,JSON 输出即时更新 — 无需点击「转换」按钮。大型输入(>200KB)自动切换为手动模式以保持浏览器响应。
@_ 属性前缀约定
XML 属性变为带 @_ 前缀的 JSON 键,遵循 fast-xml-parser 和 xmltodict 约定。
自动检测重复元素并转为数组
同名兄弟元素自动变为 JSON 数组。一个
不进行类型强制转换 — 值保持为字符串
所有 XML 值保留为 JSON 字符串。前导零、电话号码、填充代码以及像 "true" 或 "false" 这样的布尔样字符串,绝不会被静默转换为数字或布尔值。
100% 浏览器端隐私保护
所有转换均在浏览器中通过 JavaScript 本地运行。你的 XML(包括凭证、内部配置和敏感载荷)不会被发送到任何服务器,不会被记录,也不会被存储。
格式良好性错误报告
如果 XML 格式不良好,工具会报告首个错误的确切行号和列号,便于立即定位和修复问题,再进行转换。
示例
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<appConfig version="2.1" env="production">
<database>
<host>db.example.com</host>
<port>5432</port>
<name>myapp_prod</name>
<pool max="10" min="2"/>
</database>
<cache enabled="true">
<ttl>3600</ttl>
<driver>redis</driver>
</cache>
</appConfig> 一个包含属性和嵌套元素的小型应用配置。属性在 JSON 输出中变为带 @_ 前缀的键:version="2.1" 在 appConfig 下变为 "@_version": "2.1",pool 元素的 max 和 min 属性分别变为 "@_max": "10" 和 "@_min": "2"。所有值(包括 port 和 ttl)均保持为字符串而非数字,因为转换器不执行类型强制转换。
Sitemap 片段
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://go-tools.org/tools/xml-to-json</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://go-tools.org/tools/json-to-xml</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset> 一个包含两个 URL 的 sitemap.xml 片段。由于
RSS 条目
<item> <title>XML to JSON: A Practical Guide</title> <link>https://go-tools.org/blog/xml-to-json-guide</link> <pubDate>Thu, 29 May 2026 00:00:00 GMT</pubDate> <category>Developer Tools</category> <description>Learn how XML attributes map to @_ keys, how repeated elements become arrays, and why values stay strings in any XML-to-JSON conversion.</description> <guid isPermaLink="true">https://go-tools.org/blog/xml-to-json-guide</guid> </item>
一个 RSS 2.0 条目元素。guid 元素带有 isPermaLink 属性,因此 guid 的 JSON 输出变为一个对象,包含 "@_isPermaLink": "true" 和 "#text": "https://go-tools.org/blog/xml-to-json-guide" — 属性和元素的文本内容作为兄弟键共存。其他所有元素只有文本内容,直接转换为字符串值。
使用方法
- 1
粘贴 XML 数据
在上方输入框中输入或粘贴 XML 数据。也可以点击「加载示例」试用示例 — 配置文件、Sitemap 片段或 RSS 条目。
- 2
查看实时 JSON 输出
JSON 即时显示在输出面板中。属性变为带 @_ 前缀的键,混合元素的文本内容变为 #text,重复的兄弟元素变为数组。按需调整缩进(2 或 4 空格)。
- 3
复制或下载
点击「复制」将 JSON 复制到剪贴板,或点击「下载」将其保存为 .json 文件,可直接用于你的应用、API 或数据管道。
常见转换陷阱
忘记值会保持为字符串
转换器不执行类型强制转换。如果下游代码期望 JSON 数字但 XML 包含数字字符串,必须在转换后显式进行强制转换。依赖隐式字符串转数字强制转换(JavaScript 的 == 或算术运算符)容易出错 — 请始终有意识地使用 parseInt()、parseFloat() 或 Number()。
// XML: <timeout>30</timeout>
// JSON output: { "timeout": "30" } ← string, not number
// Dangerous: comparing as-is
if (config.timeout > 25) { ... } // "30" > 25 coerces, but fragile // XML: <timeout>30</timeout>
// JSON output: { "timeout": "30" }
// Safe: explicit coercion where you know the type
if (parseInt(config.timeout, 10) > 25) { ... } 单个条目与数组形状不匹配
只有一个
// XML with one item: <root><item>a</item></root>
// JSON: { "root": { "item": "a" } } ← string, not array
result.root.item.forEach(i => console.log(i)); // TypeError: not a function // Normalize to array regardless of count const items = [].concat(result.root?.item ?? []); items.forEach(i => console.log(i)); // safe for 0, 1, or many
混合内容与 #text 键
当元素同时拥有属性和文本内容时,文本存储在 #text 下。如果将元素值当作普通字符串访问,将返回一个对象而非字符串。当属性可能存在时,请始终检查元素值是字符串还是包含 #text 键的对象。
// XML: <price currency="USD">29.99</price>
// JSON: { "price": { "@_currency": "USD", "#text": "29.99" } }
const amount = result.price; // { "@_currency": "USD", "#text": "29.99" }, not "29.99" // Handle both plain string and @_/#text object const raw = result.price; const amount = typeof raw === 'object' ? raw['#text'] : raw; // "29.99"
输入 XML 格式不良好
转换器要求格式良好的 XML。常见的格式良好性错误原因:文本内容中未转义的 &(使用 &)、标签不匹配(
<!-- Unescaped & — well-formedness error --> <query>name = 'Alice' & role = 'admin'</query>
<!-- Escaped & — valid XML --> <query>name = 'Alice' & role = 'admin'</query>
前导零值被强制转换损坏
本工具不进行类型强制转换,因此保留前导零。如果你在后续处理 JSON 时使用了会强制转换的库(某些 JSON Schema 验证器、ORM 映射器),前导零可能会丢失。请始终在模式中将该字段类型显式声明为字符串。
// XML: <zipCode>01234</zipCode>
// This tool outputs: { "zipCode": "01234" } ← correct
// But if a downstream schema coerces:
// { zipCode: z.number() } → 1234 ← leading zero lost // Declare ZIP codes and other padded identifiers as strings
// { zipCode: z.string() } → "01234" ← correct 常见使用场景
- 消费 SOAP / 遗留 XML API
- 遗留企业服务(银行、保险、物流)通常以 SOAP API 形式返回 XML。将响应转换为 JSON,即可使用现代 JavaScript 工具处理数据、存储到文档数据库,或转发给 REST API 消费者。
- 处理 RSS 和 Atom Feed
- RSS 2.0 和 Atom 1.0 Feed 都是 XML。将 Feed XML 转换为 JSON,无需 XML 解析库依赖即可为 Feed 聚合器、内容管道和通知系统提取标题、链接、发布日期和描述。
- 解析 Sitemap 文件
- sitemap.xml 文件列举站点 URL 及其元数据。将 Sitemap 转换为 JSON,可分析 URL 覆盖情况、构建抓取队列、跨环境对比 Sitemap,或将 URL 传入链接检查器或 SEO 审计工具。
- 转换配置文件
- 许多企业系统(Spring、Maven、Ant、JBoss、Tomcat)使用 XML 配置文件。将其转换为 JSON,用于分析、迁移脚本编写、文档生成,或导入原生支持 JSON 的工具。
- 移动端和 Android 开发
- Android 资源、布局文件和 AndroidManifest.xml 均为 XML。将其转换为 JSON,用于分析脚本、自动化审计,或生成关于声明权限、Activity 和资源值的文档。
- 数据迁移与 ETL
- 企业系统(ERP、CRM、薪资系统)的数据导出通常以 XML 格式提供。将 XML 转换为 JSON 作为 ETL 管道的第一步,以便将数据加载到 MongoDB、Firestore 或 REST API 等 JSON 原生数据存储中。
技术细节
- 浏览器 DOMParser 用于 XML 解析
- XML 输入使用浏览器原生的 DOMParser 以 'text/xml' MIME 类型解析 — 与渲染 SVG 和 XHTML 的引擎相同。完全符合 XML 1.0 标准,能报告带行列信息的格式良好性错误。这种方式无需任何第三方依赖,即可正确处理命名空间、CDATA 节、处理指令和实体引用。
- 递归 DOM 转 JSON 序列化
- 解析后,工具递归遍历 DOM 树。元素节点变为 JSON 对象;其属性变为带 @_ 前缀的键;纯文本元素变为普通字符串值;同时拥有属性和文本内容的元素为文本内容添加 #text 键。同名兄弟元素被收集并作为 JSON 数组输出。元素之间的纯空白文本节点被丢弃。
- 不进行类型强制转换 — 字符串保留
- 所有属性值和文本内容均以字符串形式写入 JSON 输出。不应用 parseInt、parseFloat 或布尔解析。这是一个有意的设计选择,防止前导零值、精度敏感小数和布尔样字符串的静默数据损坏。需要时,类型强制转换应在下游代码中显式应用。
- 100% 浏览器端 — 不上传,无服务器
- 所有处理均在浏览器的 JavaScript 引擎中运行。数据在任何时候都不会通过网络传输。超过 200KB 的输入会自动从实时模式切换到手动模式(需要显式点击「转换」),以保持浏览器响应,防止繁重 DOM 遍历时主线程阻塞。
最佳实践
- 先验证 XML 格式良好性
- 如果 XML 来源是手写的,或来自偶尔会产生格式错误输出的系统,请在转换前进行验证。使用 XML 格式化工具的「验证」按钮,确认 XML 格式良好,并获取任何问题的精确错误位置。
- 将一个或多个字段规范化为数组
- 当 XML 模式允许同名子元素为一个或多个时,一个元素的 JSON 输出是对象,多个时是数组。请始终在消费端代码中规范化这些字段:const items = [].concat(result.items ?? []) — 对零个、一个或多个情况均安全,防止 TypeError。
- 显式且有选择地应用类型强制转换
- 由于本工具将所有值保留为字符串,请在代码中有意识地为需要的特定字段应用类型强制转换。对已知整数字段使用 parseInt(val, 10) 是安全的。用 Number(val) 广泛应用强制转换可能会损坏前导零值、空字符串和精度敏感小数。
- 访问元素值时检查 #text
- 如果某个元素在某些载荷中可能有属性,其 JSON 值将是普通字符串(无属性)或带 @_ 键和 #text 键的对象(有属性)。编写健壮的访问器:const val = typeof node === 'object' ? node['#text'] : node。这种模式能处理两种形状,避免静默 undefined 值。
- 无损 XML 处理请使用 XML 格式化工具
- XML 转 JSON 转换会丢弃注释、处理指令和命名空间语义。如需完整保留所有 XML 内容,请使用 XML 格式化工具进行美化、压缩和验证,无任何数据损失。仅在需要在 JSON 原生上下文中处理数据时才转换为 JSON。
常见问题
使用此工具时,我的 XML 数据会被上传到服务器吗?
XML 属性在 JSON 输出中如何映射?
转换器会强制转换数字或布尔值吗?
重复的(同名兄弟)元素如何处理?
XML 转 JSON 是无损的吗?
如何将 JSON 转换回 XML?
XML 命名空间会如何处理?
为什么 0123 变为 "0123" 而不是 123?
本工具与 XML 格式化工具有什么区别?
有文件大小限制吗?
转换器会处理 CDATA 节吗?
相关工具
查看所有工具 →Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
CSV 转 JSON 转换器
编码和格式化
在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。
JSON Diff 对比
编码和格式化
在浏览器中即时对比两份 JSON。Side-by-Side 高亮 + RFC 6902 JSON Patch 输出,一键忽略 timestamps、IDs 等噪音字段。100% 隐私保护,零上传。
JSON 格式化与验证工具
编码和格式化
在浏览器中即时格式化、验证和美化 JSON。免费在线工具,支持语法验证、错误检测、压缩和一键复制,100% 隐私保护。
JSON Schema 验证器
编码和格式化
在浏览器中即时校验 JSON 是否符合任意 JSON Schema。支持 Draft 2020-12、2019-09 与 Draft-07,错误信息精确定位到 JSON Pointer 路径。100% 隐私保护,零上传、零账号、永久免费。
JSON 转 CSV 转换器
编码和格式化
在浏览器中将 JSON 转换为 CSV。支持 RFC 4180、Excel-EU、TSV、Pipe 预设。可展平嵌套或字符串化。100% 隐私,无需上传。