2016-01-13 65 views
0

我有xml文件:搜索在XML文件中bash腳本值

<?xml version="1.0" encoding="UTF-8"?> 
<metadata> 
<groupId>group</groupId> 
<artifactId>project100</artifactId> 
<versioning> 
    <latest>1.2.1-black</latest> 
    <release>1.2.1-black</release> 
<versions> 
    <version>1.0.0</version> 
    <version>1.0.0-black</version> 
    <version>1.0.2</version> 
    <version>1.0.1</version> 
    <version>1.2.0</version> 
    <version>1.2.1-black</version> 
    </versions> 
</versionsing> 
</metadata> 

而且我也有一個變量,如:$ ID = 1.0.2,我要檢查,如果這個ID在我的XML文件中存在。 我嘗試這樣:

'cat ///metadata/versioning/version/text()' | xmllint --shell $content | grep -v "^/ >" 

其中$ contenet是我的XML文件,但這個說明MI是這樣的:

warning: failed to load external entity "<version>1.0.0</version> 

從XML文件中的每個實體。我不知道如何做到這一點。我在bash腳本類型的noobie

+1

'versioning'或'versionsing'? – choroba

回答

1

我認爲$content包含內容文件的,而該工具使用的是希望你通過名的文件。它將XML中的每個「單詞」(如<version>1.0.0</version>)視爲文件的路徑,並且找不到一個,因此抱怨。

我還注意到,您使用的是--shell,然後必須使用grep來刪除提示。您可以直接使用--xpath來避免這種情況。

我建議想是這樣的:

echo "$content" | xmllint --xpath '//metadata/versioning/versions/version/text()' - 

或者,如果你有文件,以手的名字,然後就這樣做:

xmllint --xpath '//metadata/versioning/versions/version/text()' file.xml 

我認爲versionsing是一個錯字,所以我將它更改爲XPath中的versioning。我還添加了缺少的部分versions/(謝謝choroba)。

既然你要過濾特定的版本,我想你想是這樣的:

$ id=1.0.0 
$ xmllint --xpath "//metadata/versionsing/versions/version[text() = '$id']/text()" file.xml 
1.0.0 

要找出一個給定的版本存在,你可以這樣做:

id=1.2.3 
xpath="//metadata/versionsing/versions/version[text() = '$id']" 
if xmllint --xpath "$xpath" file.xml 2>/dev/null 
then 
    echo "version $id found" 
else 
    echo "version $id not found" 
fi 
+1

請注意,Xpath表達式缺少一個步驟:'版本/'。 – choroba

+0

乾杯,編輯。 –

0

這會告訴你,如果ID值出現在XML文件中:

$ grep -q $ID file.xml && echo exists 

EDIT 排除部分匹配:

$ grep ">${ID}<" file.xml && echo exists 
+0

哎呀,它說版本'2.1-b'存在。 – choroba