跳到正文

校验您的XML

标签不匹配、未定义的实体、错误的命名空间——由浏览器自带的XML解析器找出并精确定位。不存储任何内容。

  • 绝不存储
  • 无需排队,无需等待
  • 无需注册,无水印
格式化结果

粘贴XML,输入时即实时校验。

使用方法

1

粘贴XML

也可以直接拖入文件。任何内容都不会被发送出去。

2

查看结论

格式良好时,显示内容摘要;否则显示第一个问题的精确行号和列号。

3

修改并重新检查

直接在原处编辑,结果随输入实时更新。

两道不同的门槛,以及这里检查的是哪一道

XML定义了两个层级的正确性,而人们经常把它们混为一谈。格式良好(well-formed)指文档遵守XML自身的语法:只有一个根元素、每个标签都已闭合、嵌套正确、字符合法、&符号和尖括号正确转义、属性值带引号、同一元素内属性名不重复。有效(valid)则要求更高——文档还必须符合某个特定的schema,正确的元素按正确的顺序出现,并携带正确类型的值。本页面检查的是前者。任何XML解析器都会拒绝不满足它的文档,所以这项检查决定了文件到底能不能被读取。

出错的地方很有规律。未转义的&远远是最常见的——它会开启一个实体引用,所以直接粘贴到元素里的带查询字符串的URL就会破坏文档。文本中单独的<也是如此。其次是标签不匹配或未闭合、元素关闭顺序错误、出现两个根元素,以及一个XML根本不允许的控制字符,它悄无声息地藏在文件里,肉眼看不见。

本页面有意从不获取DTD或schema,这是一项安全特性,而不是缺失的功能。XML文档可以声明一个外部实体,解析器一旦解析它,就会去获取它指向的内容——磁盘上的文件,或内部网络上的地址。这就是XML外部实体(XXE)漏洞,是被利用最多的漏洞类别之一,而唯一彻底的防御就是不解析外部实体。因此这里不会向外连接任何东西,代价是按schema校验不在支持范围内。

您得到的是解析停止处的精确行号和列号。和所有解析器一样,那是文档开始说不通的地方,而不一定是错误所在:未闭合的标签通常会在其后意外出现的结束标签处才被报告,有时相隔数百行。报告的位置是您向上查找的起点,而不是需要修改的地方。

如果您需要的是别的

要按schema校验,xmllint是标准工具:XSD用xmllint --noout --schema schema.xsd file.xml,RELAX NG用--relaxng,DTD用--noout --valid。它会报告所有违规之处,而不是在第一个错误处停下——当文档是真的写错了、而不只是格式坏了时,这正是您需要的。

凡是涉及不可信的输入,解析器的配置比校验器更重要。无论使用哪种语言,都要明确关闭外部实体解析和DTD处理——Python用defusedxml,PHP用LIBXML_NONET,Java开启安全处理——因为好几个流行的解析器默认仍会解析实体,而漏洞就藏在默认设置里。

常见问题

我的XML会被存储吗?

不会。没有服务器调用,没有日志记录,不存储任何内容。页面加载完成后,您甚至可以断开网络,它照样能用。这一点在这里比看上去更重要:人们粘贴到在线格式化工具里的,往往是API响应、配置文件和错误信息,而这些内容经常包含令牌、客户记录和内部主机名。

“格式良好”是什么意思?

指文档遵守XML自身的规则:每个标签都已闭合、标签按正确顺序嵌套、有且只有一个根元素、属性值带引号,并且每个&和<要么已转义,要么属于合法的实体。这是关于XML可以问的两个问题中的第一个。第二个问题——文档是否符合某个特定schema——是另一回事,本页面不回答它。

能按DTD或XSD schema校验吗?

不能。这里检查的是文档是否为格式良好的XML,这也是大多数人实际遇到的错误。schema校验需要您的schema文件和一个支持校验的解析器,而没有任何浏览器内置这样的解析器;如果声称在这里能做到,要么是把您的文档发送到服务器,要么是悄悄不做检查。这个区别值得了解:一个文档可以完全格式良好,却仍然不符合它的schema。

最常见的XML错误有哪些?

最常见的是单独的&符号——&必须写成&amp;,即使在URL中也是如此,所以直接粘贴到元素里的查询字符串会破坏文档。其次是:标签关闭顺序错误、出现两个根元素、使用了未定义的实体(例如&nbsp;,HTML定义了它而XML没有),以及使用了未声明的命名空间前缀。每种错误都会注明名称和位置。

HTML是合法的XML吗?

通常不是,而且这很正常,并不是错误。HTML允许<br>和<li>这类未闭合的标签、没有引号的属性值和单独的&符号;XML一个都不允许。如果您需要同时也是合法XML的HTML,那就是XHTML,它必须闭合每一个标签。

有大小限制吗?

取决于可用内存,而不是我们设定的上限。几MB的文档瞬间就能格式化;超大文档受限于能一次载入多少内容,而不是我们这边的任何限制。

小贴士: 检查格式良好性,而不是schema校验。会检查标签是否配对、嵌套是否正确、字符是否合法,并给出第一个问题的精确行号和列号。按DTD或XSD校验需要去获取它们,而这正是本页面有意从不发出的网络请求。

把这个工具放到您的网站上

博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。