如何验证 XML 文件在 sh(最好)或 bash 中是否有效?
我有一个文件经常损坏,需要在我花时间调查潜在问题时进行更换。
有没有用 sh 或 bash 执行此任务的简单方法?
不直接与 bash 一起使用,但xmllint相当广泛。
xmllint --format "${xmlfile}"
$?如果 XML 文件无效,这将以非零状态退出(提示:在 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 模式的替代语法的RelaxNG 模式进行验证,可以使用Libxml2 (xmllint),但它仅支持 RelaxNG XML 语法。
使用Libxml2针对 RelaxNG 模式验证 XML 文件
xmllint --noout --relaxng schema.rng file.xml
可以使用trang将 RelaxNG 模式从紧凑语法转换为 XML 语法。但是您也可以使用Jing来针对 RelaxNG XML 模式进行验证。
在您的计算机上安装 jing 后,您可以file.xml针对这样的架构验证文件schema.relaxng:
jing schema.rng file.xml
要使用 RelaxNG 紧凑语法:
jing -c schema.rnc file.xml
大多数解析器都带有可以从命令行运行的示例程序。运行其中一个验证文档。
有很多好的工具。作为已经实现了其中几个,但更关心语言而不是您使用的特定工具的人,我拒绝推荐其中一个。如果您坚持对所提出问题的答案,那就是“您不能在 sh 或 bash 本身中这样做……至少不能,除非您有足够的受虐狂尝试从头开始编写它,并且那么表现会很糟糕。”