返回 XML 元素的内容
Returning content of XML element
我正在尝试使用 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"?
您提供的 link 中的 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
作为表达式,在这种情况下(考虑您发布的示例 - 它将 return all CityName
中的元素文件)。
您实际上不需要模板匹配(-m
选项),因为您的查询非常简单。使用
将您在问题中实际显示的 XML 文档部分作为输入
$ xml sel -t -v "//CityName" -n boats.xml
将导致
St Malo
如果输入文档确实有命名空间,请考虑使用
$ xml sel -t -v "//*[local-name() = 'CityName']" -n boats.xml
或者,更好的是,声明此命名空间 URI 和前缀,请参阅 helderarocha 的回答。
我正在尝试使用 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"?
您提供的 link 中的 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
作为表达式,在这种情况下(考虑您发布的示例 - 它将 return all CityName
中的元素文件)。
您实际上不需要模板匹配(-m
选项),因为您的查询非常简单。使用
$ xml sel -t -v "//CityName" -n boats.xml
将导致
St Malo
如果输入文档确实有命名空间,请考虑使用
$ xml sel -t -v "//*[local-name() = 'CityName']" -n boats.xml
或者,更好的是,声明此命名空间 URI 和前缀,请参阅 helderarocha 的回答。