【发布时间】:2014-04-01 17:21:59
【问题描述】:
如何在 sh(最好)或 bash 中验证 XML 文件是否有效?
我有一个文件经常损坏,在我花时间调查根本问题时需要更换。
有没有用 sh 或 bash 执行此任务的简单方法?
【问题讨论】:
-
您应该澄清您的意思是格式正确(正确的语法)还是有效性(针对模式)。这些是不同的东西。
如何在 sh(最好)或 bash 中验证 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,建议使用它。
【讨论】:
xmlstarlet val -e -s "$xsd_filename" "$xml_filename" 判断哪一行出错
如果您想验证 RelaxNG schema,它是 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
【讨论】: