2015-02-24 40 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的答案。