XML 格式化

用 2 空格、4 空格或制表符美化 XML,或压缩成单行。输入时实时校验是否格式良好,并显示元素数量与嵌套深度。

把一整墙 XML 变得能读,或者再压回去。 粘贴 XML 即可按你偏好的缩进重新排版,也可以压缩成单行。输入时会实时校验是否格式良好,计数器则告诉你文档里有多少元素、嵌套了多深。

格式化 XML 而不弄坏它

XML 里的空白属于内容

这正是 XML 格式化与 JSON 格式化的分水岭。在 JSON 中,词法单元之间的空白没有含义,删掉永远安全。而在 XML 中,<name>Ada 之间的字符属于该元素文本节点的一部分。重新缩进一份文档,技术上就是改变了它的内容。

实际上这几乎从不构成问题,因为绝大多数 XML 使用的是「纯元素内容」——元素里只包含其他元素,别无他物——这种情况下周围的空白对任何 schema 都是可忽略的。格式化只在这类元素内部添加缩进。当某个元素装的是真正的文本,或者像 HTML 那样文本与子元素混排时,它的内容会被原样保留。就是这一条规则,让 <p>Hello <b>there</b></p> 不会在 there 两边悄悄多出空格。

格式良好不等于有效

这里做的检查是「格式良好」,也就是 XML 规范要求每个解析器都必须执行的那一层:有且仅有一个根元素、所有标签都闭合且正确嵌套、属性值加引号、文本中的 &< 已转义。任何一条不满足,文档就会被直接拒绝——和 HTML 不同,XML 出了名地没有容错恢复。

「有效」则是更进一步的要求:它追问文档是否符合某份 DTD、XSD 或 RelaxNG schema,从而确保 <invoice> 里确实有 <total>、日期确实是日期。这需要 schema 本身,而它并不在你粘贴进来的文档里。这里显示通过,意味着语法没问题、任何解析器都能读;但并不意味着接收方系统会认为内容是对的。

压缩与自闭合标签

压缩会移除元素之间可忽略的空白,把整份文档放到一行。由于这些空白本来就不是内容,纯元素结构的输出解析出来的树完全相同。

另一部分节省来自空元素:<summary></summary><summary/> 被规范定义为等价,输出时采用较短的写法。收益真实但有限——XML 的体积大头花在重复的标签名上,因为每个元素都要把名字写两遍。如果文件真的需要变小,答案是 gzip,它处理这些重复名字的效果远胜于任何空白删除。另外记得留一份格式化的副本用来阅读,压缩后的 XML 对人来说基本不可读。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

我的 XML 会被上传吗?
不会。文档使用浏览器内置的 DOMParser 在本地解析和序列化,不会向任何服务器发送数据。
格式化会改变我的文档吗?
只会在那些只包含子元素的元素内部添加空白,这类空白可忽略。装有文本或混合内容的元素会被原样保留。
这个工具会按 schema 校验吗?
不会。它检查的是格式良好:标签闭合且正确嵌套、只有一个根、字符已转义。按 DTD 或 XSD 校验需要 schema 文件本身。
为什么我的文档被拒绝了?
常见原因是标签未闭合或不匹配、未转义的 & 或 <、属性值没加引号,以及存在多个根元素。XML 没有容错恢复机制。
元素数和深度分别是什么意思?
元素数是文档中元素节点的总数。深度是最长的一条嵌套链的层数,根元素算作第一层。
为什么我的空标签变形了?
XML 规范规定 <a></a> 与 <a/> 完全等价,因此压缩输出会采用更短的自闭合写法来节省字节。