XML 格式化工具

即时格式化、美化和压缩 XML。检查 XML 是否格式良好并显示错误位置。免费在线工具,在浏览器中处理。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
选择两个空格、四个空格或制表符。点击“格式化”将当前缩进设置应用到 XML。
按所选缩进格式化。文本首尾空白会被删除;原文混有文本和元素时,替换前请核对结果。
压缩输入并移除缩进。文本首尾空白会删除,注释、CDATA、处理指令、原始 XML 声明和 DOCTYPE 会保留。
清空两个文本框、状态和等待执行的格式化。缩进选项保持原值。焦点在工具内时,也可按 Ctrl+L(Mac 为 ⌘+L)。
在此粘贴 XML。停止输入 0.3 秒后自动格式化。浏览器检查 XML 格式良好性,不按 DTD 或 XML Schema 校验。
复制当前 XML 输入框中的全部原文。
复制当前格式化或压缩后的完整输出,包括可见区域之外的内容。

格式化后的 XML 显示在这里…

示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

示例:整理微信推送的 XML

用户给服务号发消息时,微信服务器会把一段 XML 用 POST 发到开发者填写的 URL(接收普通消息)。服务端日志通常把它记成一行。下面沿用文档里文本消息的字段名和占位值,只把 Content 换成一句中文,并去掉了文档示例末尾的 MsgDataId、Idx:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好,想查一下订单]]></Content><MsgId>1234567890123456</MsgId></xml>

用 2 个空格格式化后:

<xml>
  <ToUserName>
    <![CDATA[toUser]]>
  </ToUserName>
  <FromUserName>
    <![CDATA[fromUser]]>
  </FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType>
    <![CDATA[text]]>
  </MsgType>
  <Content>
    <![CDATA[你好,想查一下订单]]>
  </Content>
  <MsgId>1234567890123456</MsgId>
</xml>

结果里有两种写法:CreateTime、MsgId 这类只含普通文本的元素保持一行;ToUserName、MsgType、Content 里只有一个 CDATA 段,CDATA 会单独占一行,所以每个字段变成三行。

CDATA 里的中文和全角逗号原样保留,不会被转义成实体。要把它贴回日志或测试用例,对这段格式化结果点“压缩”,得到的正是上面那一行:压缩会去掉缩进产生的空白文本,CDATA 的内容不动。

示例:中文元素名和属性名

XML 的名字可以直接用汉字。XML 1.0 规定名字首字符的范围里有 [#x3001-#xD7FF],常用汉字都在其中(XML 1.0 §2.3)。工具按浏览器解析出的名字写回,不会改写或转义:

<订单 编号="1001">
  <商品 数量="2">茶叶</商品>
  <商品 数量="1">紫砂壶</商品>
</订单>

点“压缩”后:

<订单 编号="1001"><商品 数量="2">茶叶</商品><商品 数量="1">紫砂壶</商品></订单>

压缩去掉的是标签之间用于缩进的换行和空格,它们在解析结果里是只含空白的文本节点。元素名、属性名、属性值和“茶叶”这类文字都不变。

常见错误

本工具用浏览器的 XML 解析器解析输入,遇到第一个格式良好性错误就停止,并显示浏览器给出的信息。常见原因如下:

错误示例改法
标签未闭合<person><name>Alice</person>用 </name> 闭合 <name>
标签不匹配<b>bold</i>开始和结束标签用同一个名字,注意区分大小写
文本里直接写了 & 或 <<company>AT&T</company>写成 &amp; 和 &lt;
有两个根元素<record/><record/>用一个父元素包起来,例如 <records>
属性值没加引号<item id=42/>加引号:id="42"

中文输入法开着中文标点时,属性值的引号容易打成全角的 “ ”。下面的报错是 2026-10-08 在 Chrome 152 里实测的:输入 <item id=“1001”>茶叶</item>,状态栏显示“错误:”和 error on line 1 at column 10: AttValue: " or ' expected。第 10 列正是 “ 所在的位置,把两个全角引号换成半角 " 即可。报错正文是浏览器的英文原文,换用 Firefox 时措辞会不同,所以排查时以行号和列号为准。

限制

  • DOCTYPE 里声明的实体会被展开。 XML 声明和 DOCTYPE(含内部子集)原样保留,但引用其中声明的实体(如 &company;)时,输出写的是替换后的文本。
  • 文本会被去掉首尾空白。 元素内文本的首尾空白会删除,xml:space="preserve" 不生效;文本和元素混排的文档(如 XHTML)格式化后文字会分到多行,替换原文前请核对。
  • 空元素的写法会变。 格式化时 <note></note> 和 <note> </note> 都写成 <note/>;压缩时没有内容的 <note></note> 写成 <note/>,只含空格的 <note> </note> 写成 <note></note>。
  • 引号与转义按统一写法输出。 属性值一律用双引号;文本和属性里的 & < > " ' 都写成实体,例如 <note>It's "ok"</note> 输出为 <note>It&apos;s &quot;ok&quot;</note>,含义不变。
  • 只检查格式良好性。 不按 DTD 或 XML Schema 校验,一次只报告第一处错误。

FAQ

会验证 XML 吗?

只检查格式良好性(well-formedness)。工具用浏览器内置的 DOMParser 解析,遇到第一处错误就停止,状态栏显示“错误:”加浏览器给出的英文原文和行列号。Chrome 152 已实测,显示 error on line N at column M 这一句;Safari 若给出同样的 libxml2 格式,也按同样方式读取;Firefox 按其报错格式(XML Parsing Error … Line Number N, Column M)解析,显示第一行和行列号,未在 Firefox 中实测。不按 DTD 或 XML Schema(XSD)校验。

CDATA 部分会保留吗?

会。CDATA 段、注释、处理指令、XML 声明和 DOCTYPE(含内部子集)都会保留。元素里只有一个 CDATA 段时,格式化会把它单独放一行,夹在开始标签和结束标签之间,微信消息 XML 里的 ToUserName、Content 就是这样。

命名空间和前缀会保留吗?

会。x:v 这样的带前缀名称和 xmlns 声明按解析结果原样写回,属性保持原来的顺序;所有属性值一律写成双引号。

可以自定义缩进吗?

可以。在“缩进”菜单里选 2 个空格、4 个空格或制表符。输入时自动格式化会用当前选中的缩进;改了菜单之后,点击“格式化”才会应用到已有的输出。

为什么文字里的空格变了?

工具会去掉每段文本首尾的空白,只含空白的文本直接丢弃,也不理会 xml:space="preserve"。文本和元素混排时,格式化会把每段文字放到单独一行,压缩则把去掉空白后的各段直接拼起来,例如 <p>Hello <b>world</b>!</p> 压缩后是 <p>Hello<b>world</b>!</p>。

数据会发送到服务器吗?

不会。XML 在当前浏览器标签页里解析和格式化,不会发送到服务器,也不会保存到浏览器存储。点击“格式化”或“压缩”时,页面统计会记录工具名和这个操作,不包含 XML 内容。