5

命令行 xmllint --schema 验证失败但 $? 返回 0

我的输入.xml:

<myinput><header>mytestvalue</header></myinput>

我的架构.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="myinput" type="xsd:string"/>
</xsd:schema>

命令:

$xmllint --schema myschema.xsd myinput.xml

结果:

Element myinput: child header should not be present
myinput.xml fails to validate

命令:

$echo $?

结果:

0

有人能告诉我为什么 xmllint 模式验证失败不会作为错误返回吗?或者建议我如何在我的 shell 脚本中将此捕获为错误?在我的 shell 脚本中,当前我正在“if”块中验证上述 xmllint 命令,它仅因 xml 格式正确而失败,但因模式验证失败而成功。

如果上述内容没有作为错误返回,我是否应该在 xmllint 输出上执行“grep 失败”的丑陋方式来确定模式验证是成功还是失败?有什么想法吗?

4

2 回答 2

0

除了我在问题中提到的“AWK”病房方式之外,似乎没有更好的方式。无论如何,这就是我正在解决的方法:

$xmllint --noout --schema myschema.xsd myinput.xml >> $tmpFile
schemaResult=$(cat $tmpFile | grep myinput.xml | awk '{ print $2 }')
if [ "x$schemaResult" = "xvalidates" ];
    echo "Schema validation succeeded"
else
    echo "Schema validation failed"
fi
于 2013-07-02T20:57:49.880 回答
0

我想知道您使用的是什么版本的 xml utils。

arturcz@szczaw:/tmp/stack$ xmllint --schema myschema.xsd myinput.xml; echo $?
<?xml version="1.0"?>
<myinput><header>mytestvalue</header></myinput>
myinput.xml:1: element myinput: Schemas validity error : Element 'myinput': Element content is not allowed, because the type definition is simple.
myinput.xml fails to validate
3

3 是 echo $? 的结果。它适用于以下版本:

  • libxml2-utils 2.9.1+dfsg1-3(在 Debian 上不稳定) xmllint:使用 libxml 版本 20901
  • libxml2-utils 2.7.8.dfsg-2+squeeze8(在 Debian 挤压上) xmllint:使用 libxml 版本 20708

如果这对您来说很明显,请原谅我,但您需要记住,您不应在 xmllint call 和 echo $? 之间运行任何命令。因此,请尝试我上面的确切调用 - 一行中的两个命令用分号分隔。通过这种方式,您可以验证 xmllint 是否真的有问题。

如果上述建议对您没有帮助,请提供 xmllint --version 的输出和您正在使用的 shell。

于 2013-11-13T20:33:01.953 回答