如何验证xml文件在sh或bash中是否有效?
如何验证XML文件在sh(最好)或bash中是否有效 我有一个文件经常被损坏,需要在我花时间调查潜在问题时被替换如何验证xml文件在sh或bash中是否有效?,xml,bash,sh,xmllint,Xml,Bash,Sh,Xmllint,如何验证XML文件在sh(最好)或bash中是否有效 我有一个文件经常被损坏,需要在我花时间调查潜在问题时被替换 有什么简单的方法可以用sh或bash执行此任务吗?大多数解析器都带有可以从命令行运行的示例程序。运行其中一个验证文档的程序 有很多好的工具。作为一个已经实现了其中几个工具的人,但是他更关心语言而不是您使用的特定工具,我拒绝推荐其中一个。如果你坚持要回答所提出的问题,那就是“你不能在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”
要判断哪一行是错误的,您应该澄清您指的是格式良好(语法正确)还是有效性(针对架构)。这些是不同的事情。