如何验证XML文件在sh(最好)或bash中是否有效?
我有一个经常损坏的文件,需要更换,同时我花时间调查潜在的问题。
有没有简单的方法可以用sh或bash执行此任务?
不是直接使用 bash,但xmllint
相当广泛。
xmllint --format "${xmlfile}"
如果 XML 文件无效,这将以非零状态退出(提示:$?
in bash 会获取最后一个命令的退出代码)。
XMLStarlet 有一个 validate 子命令。最简单的方法是检查格式是否良好:
xmlstarlet val "$filename"
要针对 DTD 进行验证,请执行以下操作:
xmlstarlet val -d "$dtd_filename" "$xml_filename"
要针对 XSD 架构进行验证,请执行以下操作:
xmlstarlet val -s "$xsd_filename" "$xml_filename"
要针对 RelaxNG 架构进行验证,请执行以下操作:
xmlstarlet val -r "$rng_filename" "$xml_filename"
这不是内置在bash中 - bash没有内置的XML解析器,没有一个就无法执行验证 - 但它被广泛用于现代操作系统发行版。
XMLStarlet 还具有用于从 XML 文件中提取信息、编辑 XML 文件等的子命令。如果你打算使用来自shell脚本的XML,建议使用它。
W3C XML 模式的替代语法)进行验证,可以使用 Libxml2 (xmllint),但它仅支持 RelaxNG XML 语法。
使用 Libxml2 根据 RelaxNG 模式验证 XML 文件
xmllint --noout --relaxng schema.rng file.xml
可以使用 trang 将 RelaxNG 模式从紧凑语法转换为 XML 语法。但您也可以使用 Jing 来验证 RelaxNG XML 架构。
在计算机上安装 jing 后,您可以根据如下所示的架构schema.relaxng
验证文件file.xml
:
jing schema.rng file.xml
要使用 RelaxNG 压缩语法:
jing -c schema.rnc file.xml
大多数解析器都附带可以从命令行运行的示例程序。运行验证文档的其中一个。
有很多很好的工具。作为一个已经实现了其中几个的人,但比你使用的特定工具更关心语言的人,我拒绝推荐一个而不是另一个。如果你坚持要回答这个问题,那就是"你不能在sh或bash本身这样做......至少除非你是一个受虐狂,试图从头开始写它,然后表现会很糟糕。