2017-01-18 59 views
1

爲了實現一個腳本導入到我的數據庫中,我想計算一個XML文件中節點的迭代次數。 我試圖用xmlstarlet,但每次他返回0作爲答案...xmlstarlet總是計數0

這裏是我的XML文件的樣本:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<global xmlns="http://www.xxxxxxxxxxx"> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 

在我的bash,我這樣做:

#!/bin/bash 
FILE="places.xml" RESULT=$(xmlstarlet sel -t -v "count(//place)" $FILE) 
echo $RESULT 

每一次,它返回0,結果...我已經嘗試了不同的XPath,如「//全球/地方」或「/地方」,但結果是一樣的...

有沒有人有任何想法如何解決它? 我是使用Ubuntu服務器14.04LTS。

+1

我覺得你忘了翻譯你的XPath,所以它說'place'而不是'lieu'(?) –

+1

儘管如此,也許你必須爲xmlstarlet指定一些命名空間映射? –

+0

你是對的......我沒有在我的演講中翻譯......我做了更正。但是,這個錯誤不是在我的代碼 – Yvo

回答

1

@ O.R.Mapper是正確的:你必須使用xmlstarlet時指定命名空間:

xmlstarlet sel -N q="http://www.xxxxxxxxxxx" -t -v 'count(//q:place)' "$FILE" 
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^ 

對我的作品(2回報,只要我添加</global>給你提供測試樣品的結束)。

q是用來引用命名空間的名稱,而http...x是來自XML文件的xmlns值。然後將每個標籤名稱q:添加到其前面以指定名稱空間。而不是q,你可以使用任何你想引用的名稱空間的ID —該URL是什麼定義的命名空間,而不是引用。

the docs

+0

很多人對你們都很完美! – Yvo

+0

更好的文檔鏈接是http://xmlstar.sourceforge.net/doc/UG/ch05.html,它解釋了'_:place'應該可以工作,而不必在命令行上打擾定義。 – npostavs