如何验证xml文件在sh或bash中是否有效?

如何验证xml文件在sh或bash中是否有效?,xml,bash,sh,xmllint,Xml,Bash,Sh,Xmllint,如何验证XML文件在sh(最好)或bash中是否有效 我有一个文件经常被损坏,需要在我花时间调查潜在问题时被替换 有什么简单的方法可以用sh或bash执行此任务吗?大多数解析器都带有可以从命令行运行的示例程序。运行其中一个验证文档的程序 有很多好的工具。作为一个已经实现了其中几个工具的人,但是他更关心语言而不是您使用的特定工具,我拒绝推荐其中一个。如果你坚持要回答所提出的问题,那就是“你不能在sh或bash中这样做……至少不能,除非你是一个受虐狂,试图从头开始写,否则性能会很糟糕。”不能直接使用

如何验证XML文件在sh(最好)或bash中是否有效

我有一个文件经常被损坏,需要在我花时间调查潜在问题时被替换


有什么简单的方法可以用sh或bash执行此任务吗?

大多数解析器都带有可以从命令行运行的示例程序。运行其中一个验证文档的程序


有很多好的工具。作为一个已经实现了其中几个工具的人,但是他更关心语言而不是您使用的特定工具,我拒绝推荐其中一个。如果你坚持要回答所提出的问题,那就是“你不能在sh或bash中这样做……至少不能,除非你是一个受虐狂,试图从头开始写,否则性能会很糟糕。”

不能直接使用bash,但
xmllint
是相当广泛的

xmllint——格式“${xmlfile}”
如果XML文件无效,将以非零状态退出(提示:bash中的
$?
获取最后一个命令的退出代码)。

有一个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解析器,没有XML解析器就无法执行验证——但它被广泛打包用于现代操作系统发行版



XMLStarlet还有用于从XML文件中提取信息、编辑XML文件等的子命令。如果您打算从shell脚本中使用XML,最好使用它。

如果您想根据W3C XML模式的替代语法进行验证,可以使用(xmllint)但它只支持relaxngxml语法

根据RelaxNG模式验证XML文件的步骤

xmllint --noout --relaxng schema.rng file.xml
可以使用将RelaxNG模式从紧凑语法转换为XML语法。但您也可以使用来根据RelaxNG XML模式进行验证

在您的计算机上安装了jing之后,您可以根据模式
schema.relaxng
验证文件
file.xml
,如下所示:

jing schema.rng file.xml
要使用RelaxNG compact语法,请执行以下操作:

jing -c schema.rnc file.xml

需要更多的引号才能确保包含空格或全局字符的文件名的安全。这正是我多年前停止使用zsh的原因——每当我为POSIX超集shell编写代码时,它都会导致太多错误。
xmlstarlet val-e-s“$xsd_filename”“$xml_filename”
要判断哪一行是错误的,您应该澄清您指的是格式良好(语法正确)还是有效性(针对架构)。这些是不同的事情。