HandyTools Hub

XML 格式化工具

美化、压缩、验证和转换 XML

XML 格式化工具无需往返服务器就能把密实的标记整理干净。粘贴 XML,页面即可加上一致的缩进、压缩成最小载荷、检查结构良好性并给出精确到行列的错误,或把它转成 JSON 再转回来。它在 SOAP 请求与响应、Maven 和 Android 配置文件、站点地图,以及 RSS 或 Atom 订阅源这些场景里都很常用。

如何使用

  1. 把 XML 粘贴或输入到输入区。
  2. 选择一个操作:Format、Minify、Validate、XML to JSON 或 JSON to XML。
  3. 若选择 Format,从下拉菜单里挑两格或四格缩进;其他操作会忽略它。
  4. 查看输出区,用复制按钮复制结果。当输入被拒绝时,Format、Minify 和两个转换操作都会用红色打印错误,而不是给出结果。

实操示例

格式化嵌套 XML。 对 <note id="1"><to>Ada</to><to>Bob</to></note> 采用两格缩进,输出为:

<note id="1">
  <to>Ada</to>
  <to>Bob</to>
</note>

内容只有文本的元素会保持在一行,这让简单的叶节点保持紧凑,而不会每个都炸成三行。

把同一份文档转成 JSON。 输出为:

{"note":{"@id":"1","to":["Ada","Bob"]}}

元素名变成了键,属性变成了 @id,重复的 <to> 元素变成了数组。

压缩。 任何已经格式化的版本都会折叠回 <note id="1"><to>Ada</to><to>Bob</to></note>,标签之间的空白被移除,而文本内容原样保留。

XML 转 JSON 的映射规则

XML 结构JSON 结果
根元素以该元素命名的单个顶层键
子元素嵌套的键
重复的兄弟元素同一个键下的数组
属性以 @ 为前缀的键
文本内容普通字符串;当同时存在属性或子元素时则为 #text 键
带属性的自闭合元素由 @ 键组成的对象
不带属性的自闭合元素空字符串
注释和声明丢弃

#text 键只在元素同时带有属性或子元素时出现;只含文本的叶元素会变成一个裸字符串。

JSON 转 XML 的往返转换

反向操作接收一个已解析的 JSON 对象。单个键会成为根元素,所以 {"book":{"title":"Dune"}} 生成 <book><title>Dune</title></book>。多个顶层键会被包进 <root>。@name 键变成其父元素的属性,#text 键变成父元素的行内文本,数组则把父键按每一项重复一次。文本和属性值会对 &、<、>、" 和 ' 做转义,因此生成的标记可以安全地再次解析。通过 JSON 往返一次,适合把 XML 数据喂给 JavaScript 应用,但要记住前面提到的混合内容顺序和注释的丢失。

验证器检查什么、不检查什么

验证器会报告:输入为空、完全没有标签、开始与结束标签不匹配、没有对应开始标签的结束标签、空的标签名、输入结束时仍未闭合的标签,以及未终止的注释、CDATA 区段或处理指令。错误会带上行号和列号。它不检查架构符合性、DTD 规则、命名空间正确性、重复属性或实体解析。它是一个针对会让服务器拒绝请求的畸形标记的快速 lint,而不是标准完备的解析器。

常见错误

  • 服务器拒绝载荷时先去格式化。 应该改用 Validate;它会指出出问题那个标签的确切行列,比用肉眼看缩进快得多。
  • 以为 Minify 会压缩文件。 它只移除标签间的空白,不动注释,也不动重复结构。上线时用 Gzip 通常比压缩空白省得多。
  • 搞混两个转换方向,把 JSON 粘贴进 XML to JSON 操作。两个操作是分开的,要选与输入匹配的那个。
  • 把 JSON 结构当成单元素和重复元素都适用。 一个键会随着兄弟元素个数在字符串和数组之间切换,所以防御性代码必须两种都能处理。

实用技巧与较大的输入

保留声明。 XML 声明和处理指令会独占一行且不缩进,所以 <?xml version="1.0" encoding="UTF-8"?> 会留在解析器期望的顶部位置。注释和 CDATA 块在格式化和压缩两种操作里同样原样保留。

命名空间前缀是标签名的一部分。 像 <soap:Envelope> 这样的标签按完整字符串匹配,只要前后缀拼写完全一致,开始与结束标签就能配对。工具不解析命名空间 URI,也不检查某个前缀是否已声明,那属于架构层面的问题。

大文档。 格式化是在浏览器里一次完成的,没有大小上限,但几兆字节的文件可能让标签页短暂卡顿,因为缩进步骤要构建一个行数组。如果界面卡住,就分批粘贴;Minify 更轻,因为它只拼接词法单元的值。

Tab 还是空格。 缩进下拉菜单只提供空格。如果你的项目用 Tab,可以在这里格式化以便阅读,提交前再让编辑器的格式化程序改写缩进。不要把格式化后的输出直接粘贴回一个已经对齐过的文件,除非先核对差异,否则你会在版本控制里引入一堆空白噪音。

相关工具

常见问题

验证器会检查我的 XSD 或 DTD 架构吗?

不会。它只检查结构良好性——标签是否配对、嵌套是否正确,以及注释、CDATA 和处理指令是否闭合。一份文档可以在这里通过验证,却依然违反它的架构,因为像必需属性、允许出现的元素这类架构规则并不在检查范围内。

重复出现的兄弟元素在 JSON 输出里怎么表示?

第一次出现的会变成一个单值,第二次出现时该键会被转成数组。所以两个 <to> 子元素会产生 "to": ["Ada", "Bob"],而只有一个 <to> 时它保持为普通字符串。调用方必须同时能处理这两种形态。

为什么我的 id="1" 属性在 JSON 里变成了 @id?

属性会加上 @ 前缀,以便和共享同一个 JSON 对象的子元素区分开。属性映射为 @id,子元素则是嵌套对象。反向转换也遵循同样的约定,会把属性原样写回去。

XML 转 JSON 会保留混合内容吗?

不能忠实保留。文本和子元素被存放在不同的键下,文本被放进 #text,所以像加粗文字与行内标签交错的排布会丢失。如果你的文档依赖混合内容,请让它继续以 XML 形式存在。

能在这里把 JSON 转回 XML 吗?

可以,内置了 JSON to XML 操作。只有一个顶层键的 JSON 对象会用该键作为根元素;有多个键的对象会被包进 <root> 元素。以 @ 开头的键变成属性,而 #text 键变成行内内容。

格式化时可选哪些缩进宽度?

从缩进下拉菜单里选两格或四格空格,该菜单只在 Format 操作激活时出现。Minify 操作会移除所有元素间的空白,与这个设置无关。

由 HandyTools Hub 团队审校 · 最后更新