【问题标题】:Returning content of XML element返回 XML 元素的内容
【发布时间】:2015-04-26 01:34:04
【问题描述】:

我正在尝试使用 xmlstarlet 来提取此 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>

我正在尝试提取“St Malo”。

我已将提要保存到 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 文件?如何提取“St Malo”?

【问题讨论】:

  • 您是如何下载整个xml 数据的?

标签: xml bash xpath xml-parsing xmlstarlet


【解决方案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 作为表达式,在这种情况下(考虑到您发布的示例 - 它将返回文件中的 all CityName 元素)。

【讨论】:

    【解决方案2】:

    您实际上不需要模板匹配(-m 选项),因为在您的情况下查询非常简单。将您在问题中实际显示的 XML 文档部分作为输入,使用

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

    会导致

    St Malo
    

    如果输入文档实际上有命名空间,请考虑使用

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

    或者,更好的是,将此命名空间 URI 与前缀一起声明,请参阅 holdererarocha 的答案。

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多