XML 格式化工具
即时格式化、美化和压缩 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> | 写成 & 和 < |
| 有两个根元素 | <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's "ok"</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 内容。