Skip to content

XML 转 JSON 转换器

粘贴 XML 即时获得 JSON。属性转换为 @_ 键,重复元素自动变为数组。100% 浏览器端运行,数据不上传,无需注册。

无追踪 浏览器中运行 免费
选项 · 2 空格 · XML → JSON
缩进
0 字符
JSON 输出
0
已审核 XML 1.0 格式良好性处理、@_/#text 约定正确性以及字符串保留准确性 — Go Tools 工程团队 · 2026年5月29日

什么是 XML 转 JSON 转换,它是如何工作的?

XML(可扩展标记语言)和 JSON(JavaScript 对象表示法)都是结构化数据格式,但它们的模型根本不同:XML 是一棵带有属性和混合内容(文本与子元素交错)的元素树;JSON 是一棵由对象、数组、字符串、数字、布尔值和 null 值组成的树。在两者之间转换需要一套约定来弥合这种不匹配。

本工具使用最广泛采用的约定,与流行库 fast-xml-parser(Node.js)、xmltodict(Python)和 JAXB(Java)使用的相同:

**1. 属性 → @_ 前缀。** XML 属性在 JSON 中没有直接对应物。约定是将其表示为带 @_ 前缀的键。因此 在 user 对象中变为 { "@_id": "42", "@_role": "admin" }。这个前缀是无歧义的:没有合法的 XML 元素名称以 @ 开头,因此与子元素名称不会产生冲突。

**2. 带属性的元素文本内容 → #text。** 当元素同时拥有属性和文本内容时 — 29.99 — 文本必须与属性共享同一个 JSON 对象。约定是将其存储在键 #text 下,生成 { "@_currency": "USD", "#text": "29.99" }。只有文本内容且无属性的元素直接转换为普通字符串值。

**3. 重复兄弟元素 → 数组。** XML 允许多个同名子元素;JSON 对象不能有重复键。解决方案是将同名兄弟元素收集为数组。一个 子元素变为单个对象;两个或更多 子元素变为对象数组。这是最重要的行为细节:JSON 形状会根据 XML 中存在多少兄弟元素而变化。

**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 约定。 变为 { "@_attr": "val" } — 与任何合法元素名称无歧义且无冲突。

自动检测重复元素并转为数组

同名兄弟元素自动变为 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 片段。由于 下有两个同名的 兄弟元素,它们会变为一个 JSON 数组。xmlns 命名空间声明变为 urlset 对象上的 "@_xmlns"。priority 值 "0.8" 保持为字符串 — 不进行数字强制转换 — 因此像 "0.08" 这样以零开头的值也会被原样保留。

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. 1

    粘贴 XML 数据

    在上方输入框中输入或粘贴 XML 数据。也可以点击「加载示例」试用示例 — 配置文件、Sitemap 片段或 RSS 条目。

  2. 2

    查看实时 JSON 输出

    JSON 即时显示在输出面板中。属性变为带 @_ 前缀的键,混合元素的文本内容变为 #text,重复的兄弟元素变为数组。按需调整缩进(2 或 4 空格)。

  3. 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) { ... }

单个条目与数组形状不匹配

只有一个 元素时,输出是对象;有两个或更多时,变为数组。如果消费端代码总是调用 result.items.forEach(),当 items 是单个对象时会崩溃。如果模式允许一个或多个条目,请在转换后始终将结果规范化为数组。

✗ 错误
// 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。常见的格式良好性错误原因:文本内容中未转义的 &(使用 &)、标签不匹配( vs — XML 区分大小写)、多个根元素或未闭合的标签。错误信息会显示首个问题的行号和列号。

✗ 错误
<!-- Unescaped & — well-formedness error -->
<query>name = 'Alice' & role = 'admin'</query>
✓ 正确
<!-- Escaped & — valid XML -->
<query>name = 'Alice' &amp; 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 数据会被上传到服务器吗?
不会。所有转换完全在浏览器中通过 JavaScript 完成。你的 XML 数据不会通过网络传输,不会存储在任何服务器上,也不会被记录或分析。因此,即使 XML 载荷包含 API 凭证、内部服务配置、SOAP WS-Security 令牌、医疗 HL7/FHIR 数据或其他敏感内容,使用本工具也是安全的。你可以通过打开浏览器的「网络」标签来验证 — 粘贴或转换 XML 时不会触发任何请求。
XML 属性在 JSON 输出中如何映射?
XML 属性会变为带 @_ 前缀的 JSON 键。例如, 会在该元素的 JSON 对象中生成 "@_id": "P01" 和 "@_category": "electronics",与子元素键并列。当元素同时拥有属性和文本内容时 — 例如 29.99 — 文本内容存储在特殊键 "#text" 下,结果为 { "@_currency": "USD", "#text": "29.99" }。这一约定一致且可预测:@_ 始终代表属性,#text 始终代表元素文本内容。
转换器会强制转换数字或布尔值吗?
不会。所有 XML 文本内容和属性值均转换为 JSON 字符串,无论看起来像什么类型。42 变为 "count": "42" 而非 42。true 变为 "enabled": "true" 而非 true。这是有意为之且很重要:它保留了前导零(电话号码、账户代码、邮编如 "01234")、"0.100" 等值的数字精度,以及看起来像布尔值的字符串。如果需要在下游 JSON 中使用数字或布尔值,请在转换后在自己的代码中应用类型强制转换 — 在你能精确控制哪些字段需要转换的地方。
重复的(同名兄弟)元素如何处理?
单个子元素变为 JSON 对象。同一父元素下两个或更多同名子元素变为 JSON 数组。例如,a 生成 { "root": { "item": "a" } } — item 是一个对象(字符串)。但 ab 生成 { "root": { "item": ["a", "b"] } } — item 是一个数组。这意味着 JSON 输出的结构取决于 XML 中兄弟元素的数量,这也是 XML 转 JSON 基于约定的原因之一。如果你的 XML 模式允许一个或多个同名子元素,消费端代码必须同时处理对象和数组两种情况。
XML 转 JSON 是无损的吗?
不是。XML 有一些在 JSON 中没有对应概念的特性,在转换过程中会被丢弃:XML 注释()会被丢弃,处理指令()会被丢弃,命名空间前缀绑定部分以 @_ 属性形式保留但语义丢失,混合内容节点的相对顺序(文本与子元素交错)可能无法完美往返。对于不包含注释或处理指令的纯结构 XML,转换会保留所有元素名称、属性名称、属性值和文本内容。如需无损 XML 处理 — 格式化、验证或检查 XML 而不丢失任何数据 — 请使用 XML 格式化工具
如何将 JSON 转换回 XML?
使用我们的配套工具 JSON 转 XML 转换器。它以相同约定进行反向转换:带 @_ 前缀的键变为 XML 属性,#text 键变为元素文本内容,JSON 数组变为重复的同名兄弟元素。这使两个工具在往返使用场景中完全对称。
XML 命名空间会如何处理?
命名空间声明(xmlns="..." 和 xmlns:prefix="...")被视为普通属性,在 JSON 输出中以 @_xmlns 和 @_xmlns:prefix 键出现。元素名称中的命名空间前缀作为元素名称键的一部分被保留(例如, 在 JSON 中变为 "soap:Body")。命名空间的语义含义 — 两个前缀可能指向同一 URI — 不会被解析。如果你的用例需要精确的命名空间处理,请使用支持命名空间的解析器解析 XML,而非转换为 JSON。
为什么 0123 变为 "0123" 而不是 123?
因为转换器不执行类型强制转换。字符串 "0123" 和数字 123 是不同的值:"0123" 有一个前导零,在许多场景下(账户代码、邮政编码、国民身份证号码、填充标识符)是有意义的。静默去掉前导零会破坏数据。安全的默认行为是将所有值原样保留为字符串。对于你确定值始终是普通整数的特定字段,在自己的代码中有选择地应用数字解析。
本工具与 XML 格式化工具有什么区别?
XML 格式化工具对 XML 重新格式化 — 改变缩进和空白字符,但输出仍然是 XML。而本 XML 转 JSON 转换器完全改变格式:输出是一个使用 @_ 属性约定表示 XML 结构的 JSON 文档。当你需要阅读、编辑、验证或压缩 XML 时,请使用格式化工具;当你需要在 JavaScript 应用中处理 XML 数据、将其传入 REST API,或存储到 JSON 文档数据库时,请使用本转换器。
有文件大小限制吗?
没有硬性限制,但超过 200KB 的输入会自动从实时转换切换到手动模式。在手动模式下,会出现「转换」按钮,只有点击时才执行转换 — 这在解析大型 XML 文档时保持浏览器响应。对于非常大的 XML 文件(多兆字节数据导出),建议使用命令行工具以获得更好性能:python3 -c "import sys, xmltodict, json; print(json.dumps(xmltodict.parse(sys.stdin.read()), indent=2))" 或使用专用 XML 转 JSON 库的 Node.js 脚本。
转换器会处理 CDATA 节吗?
会。CDATA 节内容()被视为元素文本内容,在 JSON 输出中显示为普通字符串值。CDATA 分隔符本身会被去除 — 只保留其中的内容。例如, 在 JSON 中生成 "note": "if (a < b) return;"。这是正确的行为:CDATA 只是一种嵌入含特殊字符文本而无需转义的方式,其语义含义就是文本内容。
可以转换包含多个根元素的 XML 吗?
不可以。包含多个根元素的 XML 不是格式良好的,本工具要求输入是格式良好的 XML。如果你的 XML 解析器返回多个根元素(在拼接 XML 片段时很常见),请在转换前用单个根元素包裹它们。例如,如果有 ,请将其转换为 。错误信息会指出格式良好性问题的位置,便于快速修复。