2015-02-24 39 views
1

我試圖用xmlstarlet以提取某些元素的文本此XML飼料:返回XML元素的含量

https://services.boatwizard.com/bridge/events/bc0af0c8-4b47-42b3-9a71-5326775344e0/boats?status=on

一個我想提取的元素是文本這是嵌入在XML文檔中的(不包括爲清楚起見某些父元素)城市名稱:

<Location> 
<LocationAddress> 
<CityName>St Malo</CityName> 
<CountryID>FR</CountryID> 
<Postcode>35400</Postcode> 
</LocationAddress> 
</Location> 

我試圖提取「聖馬洛」。

我已經保存了飼料boats.xml和我用xmlstarlet el -v boats.xml找出正確的XPath的名字,這似乎是:

ProcessVehicleRemarketingDataArea/VehicleRemarketing/VehicleRemarketingBoatLineItem/Location/LocationAddress/CityName 

我想下面的語法來提取文本:

xml sel -t -m "ProcessVehicleRemarketingDataArea/VehicleRemarketing/VehicleRemarketingBoatLineItem/Location/LocationAddress/CityName" -v "." -n boats.xml 

嘗試了許多不同的語法變體,但沒有成功。幾乎認爲它可能是關閉的XML文件?我如何提取「聖馬洛」?

+0

你是怎麼下載整個'xml'數據的? – Birei 2015-02-24 12:44:56

回答

1

在您所提供的鏈接中的XML聲明中VehicleRemarking標籤的默認命名空間:

<VehicleRemarketing xmlns="http://www.starstandard.org/STAR/5" ...> 

這意味着你有,你應該使用合格每個一步您的XPath的前綴聲明它表達式是命名空間的一部分:

xml sel -N ns=http://www.starstandard.org/STAR/5 
     -t -m "ProcessVehicleRemarketingDataArea/ns:VehicleRemarketing//ns:CityName" 
     -v "." -n boats.xml 

第一個元素是不是命名空間的一部分,但ns:VehicleRemarketing其所有的孩子都。您也可以使用//ns:CityName表達式,在這種情況下(考慮您發佈的示例 - 它將返回全部CityNameCityName文件中的元素)。

1

實際上您並不需要模板匹配(-m選項),因爲查詢對您而言非常簡單。作爲輸入你實際在討論的XML文檔的一部分,使用

$ xml sel -t -v "//CityName" -n boats.xml 

將導致

St Malo 

如果輸入的文件居然有命名空間,可以考慮使用

$ xml sel -t -v "//*[local-name() = 'CityName']" -n boats.xml 

或者,甚至更好的是,將這個名稱空間URI與一個前綴一起聲明,請參閱helderarocha的答案。