XML 格式化、校验与压缩
粘贴 XML,就能缩进、压缩或检查。出错时会告诉你第几行第几列,以及最可能的改法。注释、CDATA、处理指令,以及夹在标签中间的文字都原样保留。不会上传任何内容,全部在本页里运行。
建议开启。文字与标签挨在一起时(比如一段话里夹着一个加粗的词)原样保留,不会多出或丢失空格。关闭后每段文字都会去掉首尾空白并单独占一行,这会改变文字内容。
XML 格式正确,已在下方格式化。
- 大小
- 400 B
- 元素
- 10
- 属性
- 7
- 层数
- 4
- 注释
- 1
它是怎么工作的
- •本页用自带的分词器读取 XML,规则遵循 XML 1.0,不依赖浏览器自带的 XML 解析器,所以在哪里运行结果都一样,报错位置也精确。行按换行符、CRLF 和单独的 CR 划分,列号是从该行开头数起的字符数。
- •它在遇到第一个问题时停下。例如 <a><b></a> 会报告第 1 行第 7 列:本该是 </b> 的地方出现了 </a>。标签不匹配或没有关闭、属性值缺引号、属性重复、出现第二个根元素、文字里有单独的 & 或 <、 这类未定义的实体、文字里的 ]]>,以及 XML 禁止的字符,都能查出来。
- •格式化只改动不属于内容的空白。子元素之间会加上换行和缩进;含有空白以外内容的文字、CDATA、注释、处理指令、XML 声明、DOCTYPE,以及 xml:space="preserve" 之下的全部内容,都原样输出。压缩去掉的也只是同样这类无意义空白。
- •可选项:2 个或 4 个空格或制表符,空元素统一写成 <a/> 或 <a></a>,每个属性单独一行,删除注释,以及是否检查命名空间前缀。关闭“混合内容保持原样”后,标签旁边的文字会去掉首尾空白并单独占一行,这确实会改变那些文字。
- •命名空间错误(比如没有声明的前缀 <p:a/>)会按错误报告,多数 XML 库也是这样;命令行工具 xmllint 则会放过它们。上限是 5 MB 文本和 1000 层嵌套。DOCTYPE 里声明的实体可以通过但不会展开,不会加载外部 DTD,也不会按 DTD 或 Schema 做校验。
- •我们拿 208 份测试文档(77 份应当格式正确,131 份应当有错)把判断结果与 xmllint 和 Python 的 ElementTree 做了对比:与 ElementTree 一致的有 207 份,与 xmllint 一致的有 198 份。和 xmllint 不同的 10 份都是命名空间错误;和 ElementTree 不同的 1 份是 XML 声明里的 version="2.0",XML 规范不允许这个版本号。
常见问题
- 会上传我的 XML 吗?
- 不会。文本只由本页里运行的代码处理,不会发送到任何地方。复制和下载也都在你的设备上完成。
- 格式化会改变 XML 的含义吗?
- 默认设置下不会。只有元素之间的空白会被增加或去掉,文字、CDATA、注释、处理指令以及 xml:space="preserve" 之下的内容都保持原样。如果你自己的程序会把元素之间的空白当作数据读取,格式化后它看到的内容就会不同。关闭“混合内容保持原样”则确实会改变与标签挨在一起的文字。
- 为什么别的工具通过了,这里却报错?
- 最常见的是命名空间规则:元素或属性用了某个前缀,却没有对应的 xmlns:前缀 声明,xmllint 之类的工具不会报错,多数 XML 库会。取消勾选“检查命名空间前缀”就能看到纯 XML 1.0 的结果。另一类原因是 HTML 的习惯在 XML 里不被允许:单独的 &、没有值的属性,或者 这样的名称。
- 格式正确就等于有效吗?
- 不等于。格式正确(well-formed)只说明文本符合 XML 语法规则;有效(valid)还要求它符合 DTD 或 Schema 中规定的元素和属性。本页检查的是前者,不是后者。