XML 格式化工具怎么用
- 把 XML 粘贴到输入框——MyBatis 映射文件、Maven 的
pom.xml、Spring 配置、Android 布局、微信支付的接口报文、SOAP 请求、RSS 或网站地图都可以。粘贴后立即校验并格式化。 - 选格式化让每个元素单独一行,用 2 个空格、4 个空格或制表符缩进;选压缩则去掉标签之间的空白。
- 点击结果旁的复制,或点下载保存为文件。
- 如果 XML 格式不正确,会显示问题、行号和列号,把出错的那一行列出来并在下面用 ^ 标出位置,再告诉你怎么改。改好后,格式化结果立刻出现。
会改动什么,不会改动什么
XML 文档是一棵元素树。格式化把每个子元素、注释和处理指令放到单独一行,按嵌套层数缩进;压缩则去掉这些换行和缩进。只有内容全是子元素的元素才会这样处理,因为只有在那里,标签之间的空白才没有意义。其他内容逐字复制:
- 文本内容,包括开头和结尾的空格:
<name> 张伟 </name>两边的空格都会保留。 - 混合内容——同一个元素里既有文字又有标签,例如 MyBatis 里带
<if>或 CDATA 的 SQL 语句——完全按原样保留,因为在那里加换行就会改变文本。 - 标了
xml:space="preserve"的元素及其全部内容。 - CDATA 段、注释、处理指令和 DOCTYPE,包括
[ ]里的内部子集。 - 实体和字符引用:
&仍是&,中不会被转成“中”。 - 属性值、引号和属性顺序。标签内部的空白会整理:每个属性前一个空格,
=两边不留空格,所以<x id = "1" />变成<x id="1"/>。
Windows 换行(CR LF)会写成 LF,所有 XML 解析器本来就是这样读取的。中文内容按原样保留,不会转成 &#x…; 编码。
什么叫“格式正确”
每个 XML 文件都必须遵守 XML 1.0 和 XML 命名空间的语法规则,否则任何程序都读不了它。校验器会报告找到的第一条违反的规则:只有一个包含全部内容的根元素;每个开始标签都有对应的结束标签,顺序正确、大小写一致;属性值加引号,同一标签里没有重复属性;文本里的 & 和 < 要写成 & 和 <;除非 DOCTYPE 另有声明,只能使用五个预定义实体;dc: 这样的命名空间前缀必须用 xmlns:dc="…" 声明;如果有 <?xml … ?> 声明,它必须是文件最开头的字符。
MyBatis 里的 < 和 CDATA
国内 Java 项目里最常遇到的 XML 错误,是在 MyBatis 映射文件的 SQL 里直接写小于号:
<select id="cheap"> SELECT * FROM t_goods WHERE price < 100 </select>
校验结果是 未转义的 <,位置在第 2 行、第 37 列:
SELECT * FROM t_goods WHERE price < 100
^
XML 解析器把 < 当成一个标签的开始,而 < 100 不是合法的标签。有两种改法:写成 price < 100,或者用 CDATA 包起来:price <![CDATA[ < ]]> 100。> 在文本里其实是允许的,但很多团队为了统一也写成 >。属性里同理,<if test="amount < 100"> 也要写成 <。另一个常见错误是 SQL 或网址里的 &,例如 JDBC 连接串 ?useSSL=false&serverTimezone=Asia/Shanghai 写进 XML 配置时,& 必须写成 &。
格式正确不等于有效。有效性检查要对照 XSD 或 DTD 这样的模式,看哪些元素和值是允许的。本页只检查语法,不加载 DTD 或模式文件。
计算示例
输入框里的示例是一个 535 字节、写在一行里的 MyBatis 映射文件,带有 DOCTYPE、注释和 CDATA。按 2 个空格格式化后:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.shop.mapper.OrderMapper">
<!-- 按用户查询一段时间内的订单 -->
<select id="listByUser" resultType="com.example.shop.entity.Order">SELECT id, order_no, amount FROM t_order WHERE user_id = #{userId} AND created_at <![CDATA[ <= ]]> #{until}</select>
<update id="markPaid">UPDATE t_order SET status = 'PAID' WHERE order_no = #{orderNo}</update>
</mapper>
3 个元素嵌套了 2 层。<select> 和 <update> 里是 SQL 文本(其中还有 CDATA),属于混合内容,所以保持在一行,SQL 一个字符都不变。注意每个汉字在 UTF-8 里占 3 字节,缩进让文件增加了 12 字节;再压缩又回到 535 字节。
微信支付和其他接口报文
微信支付 API v2 的请求和返回都是 XML(v3 已改用 JSON),字段值常用 CDATA 包裹。把一行的返回报文格式化后,排查起来清楚得多:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <result_code><![CDATA[SUCCESS]]></result_code> <trade_type><![CDATA[JSAPI]]></trade_type> </xml>
需要注意:带签名的报文(微信支付的 sign、SAML 断言、SOAP 的 WS-Security、电子发票的数字签名)签的是原始文本,格式化或压缩后的副本可能与签名对不上。格式化只用来阅读和找错,发送和存档请用原文件。
限制与小技巧
- 大文件:几百 KB、包含上千个元素的文件不到一秒就能校验并格式化,长结果也能流畅滚动。几十 MB 的文件更适合用 IDEA、VS Code 这类编辑器处理。
- 编码:页面处理的是你粘贴的字符,下载保存为 UTF-8。如果声明里写的是
encoding="GBK"或GB2312,请在下载的文件里改成UTF-8,否则其他程序会按 GBK 读取,中文变成乱码。 - DTD 实体:文档有 DOCTYPE 时,
&co;这类命名实体直接接受,不检查 DTD 是否声明了它们。 - HTML 不是 XML。没有结束斜杠的
<br>在这里会报错;网页请用 HTML 格式化。JSON 请用 JSON 格式化,映射文件里的 SQL 可以复制到 SQL 格式化里整理。
XML 不会离开你的设备
解析、校验和格式化都在浏览器里完成。配置文件和接口报文里经常有数据库密码、商户号和 API 密钥,这些内容都不会被上传或记录,也不会被保存:刷新页面就会清空。
常见问题
我的 XML 会被上传到服务器吗?
不会。格式化工具是在你浏览器里运行的 JavaScript,文件不会离开你的设备;页面加载后断网也能使用。
“格式正确”和“有效”有什么区别?
格式正确的 XML 遵守所有 XML 解析器都会检查的语法:标签正确闭合和嵌套、属性值加引号、特殊字符转义、只有一个根元素。有效的 XML 在此基础上还符合某个 XSD 或 DTD 模式。本页检查的是格式是否正确。
为什么提示“未转义的 &”?
XML 里的 & 用来开始 &、中 这样的引用。公司名、商品描述或带多个参数的网址里出现的单独 &,必须写成 &。
MyBatis 里的小于号怎么写?
写成 <,或者用 <![CDATA[ < ]]> 包起来。直接写 < 会让解析器以为是一个新标签的开始,本页会报“未转义的 <”并指出位置。
为什么有些元素格式化后还在一行?
含有文本的元素——无论只有文字还是文字和标签混在一起——都按原样复制,因为在里面加换行或空格会改变文本。只有内容全是子元素、注释和处理指令的元素才会展开成多行。
最后更新:2026年10月16日