如何在sh(最好)或bash中验证XML文件是否有效?
我有一个经常损坏并需要替换的文件,而我需要花时间调查其根本原因。
使用sh或bash是否有任何简单的方法执行此任务?
虽然不能直接使用bash,但是xmllint
相当普遍可用。
xmllint --format "${xmlfile}"
如果 XML 文件无效,此操作将以非零状态退出 (提示:在 Bash 中 $?
获取上一个命令的退出码)。
xmllint --format "${xmlfile}" > /dev/null
可能更方便。如果无效,该命令将使用 stderr 打印信息。 - Jason PanXMLStarlet有一个验证子命令。最简单的用法是检查格式是否正确:
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 val -e -s "$xsd_filename" "$xml_filename"
来查看哪一行出错。 - daparicxmllint --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中这样做...除非你足够 masochist 以尝试从头开始编写它,然后性能将很差。”