2013-07-01 43 views
3

命令行xmllint --schema驗證失敗,但$?返回0linux xmllint架構驗證失敗,但錯誤代碼爲0

myinput.xml:

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

myschema.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 

結果:

​​

命令:

$echo $? 

結果:

0 

有人能告訴我爲什麼xmllint模式驗證失敗是沒有返回錯誤?或者建議我如何在shell腳本中捕獲這個錯誤? 在我的shell腳本中,當前我在「if」塊中驗證上述xmllint命令,並且它僅失敗了xml格式良好性,但成功進行了模式驗證失敗。

如果上述不返回爲錯誤,我應該在xmllint輸出上執行醜陋的「grep failed」方式來計算模式驗證成功或失敗嗎? 有什麼想法?

+0

有人可以提供一些投入呢? – user1549605

+0

對此有何想法? – user1549605

+0

您是在'xmllint'行還是幾行代碼之後閱讀'$?'? '$?'與_preceding_語句的返回代碼有關,如果你在兩者之間有一個'echo',或者你會讀到'echo'的'$?'。 – vesperto

回答

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 
0

我不知道你正在使用什麼版本的xml utils。

[email protected]:/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通話和回聲$之間的任何命令?所以,請嘗試我上面提到的確切的調用 - 這兩個命令在一行中用分號分隔。這樣你就可以驗證xmllint是否真的有問題。

如果以上消化不會對您有所幫助,請提供xmllint --version的輸出以及您正在使用的shell。