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

16

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

我有一个经常损坏并需要替换的文件,而我需要花时间调查其根本原因。

使用sh或bash是否有任何简单的方法执行此任务?


你应该澄清你是指合法性(正确的语法)还是有效性(根据模式)。这些是不同的事情。 - Martynas Jusevičius
4个回答

29

虽然不能直接使用bash,但是xmllint相当普遍可用。

xmllint --format "${xmlfile}"

如果 XML 文件无效,此操作将以非零状态退出 (提示:在 Bash 中 $? 获取上一个命令的退出码)。


1
在处理包含空格或通配符字符的文件名时,建议使用更多引号以确保安全。 - Charles Duffy
2
这正是我多年前停止使用zsh的原因 - 每当我为POSIX超集shell编写代码时,它会导致太多的错误。 - Charles Duffy
1
xmllint --format "${xmlfile}" > /dev/null 可能更方便。如果无效,该命令将使用 stderr 打印信息。 - Jason Pan

6

XMLStarlet有一个验证子命令。最简单的用法是检查格式是否正确:

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,建议使用它。

1
使用以下命令xmlstarlet val -e -s "$xsd_filename" "$xml_filename"来查看哪一行出错。 - daparic

3
如果您想针对RelaxNG模式进行验证,该模式是W3C XML模式的替代语法,您可以使用Libxml2(xmllint),但它仅支持RelaxNG XML语法。
要使用Libxml2验证XML文件是否符合RelaxNG模式,请执行以下操作:
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

-1

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

有许多好的工具。作为已经实现了几个工具但更关心语言而不是特定工具的人,我拒绝推荐一个工具胜过另一个。如果您坚持要回答所提出的问题,那么答案是“你不能在sh或bash中这样做...除非你足够 masochist 以尝试从头开始编写它,然后性能将很差。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接