xmllint为何没有类似--valid的XSD校验专用选项?
xmllint校验参数设计原因说明
很多用户使用xmllint时遇到的「no DTD found」报错,本质是误用了仅支持DTD校验的--valid参数去校验仅配置了XSD规则的XML文件,切换为--schema参数传入对应的XSD文件即可解决。该参数设计是出于历史兼容性和语义明确性的考量,并非功能未实现或者存在技术限制,具体原因如下:
- 历史沿革因素:xmllint是libxml2配套的命令行工具,最早于上世纪90年代末发布,当时XML官方规范中唯一的标准化校验方式只有DTD,
--valid参数从设计之初就对应XML标准定义的「原生有效性校验」逻辑,语义绑定了DTD校验。XSD直到2001年才正式成为W3C推荐标准,此时已有大量依赖--valid参数默认DTD校验的脚本在生产环境运行,修改原有参数的行为会造成严重的兼容性破坏,因此新增的XSD校验只能通过独立参数实现。 - 校验逻辑的固有差异:DTD的引用路径固定定义在XML文档的DOCTYPE声明中,
--valid参数可以直接读取文档内置的DTD路径完成校验,不需要额外传参。而XSD的引用方式非常灵活,既可以通过文档内的xsi:schemaLocation属性声明,也可以使用完全独立于XML文件的外部模式文件,没有统一的默认读取规则,必须由用户显式指定才能避免校验逻辑歧义,因此单独设计了--schema参数用于传入XSD文件路径。 - 后续扩展性考量:除了DTD和XSD之外,libxml2后续还新增了RELAX NG、Schematron等多种校验规范的支持,均采用了独立参数的设计(对应
--relaxng、--schematron等参数),不同校验方式的参数语义完全隔离,既不会互相干扰,也能保证旧版本脚本的执行逻辑永远不会因工具升级发生变化。
内容的提问来源于stack exchange,提问作者Sergio Losilla
相关产品推荐
相关产品推荐

