1

我正在尝试使用 xmlstarlet 提取此 KML 文件中的“坐标”节点的内容。

KML 文件使用 xmlstarlet 本身可以很好地验证。

我已将其缩减为一个包含以下内容的小测试文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<Placemark>
    <name>eurovelo-5 690</name>
    <Snippet></Snippet>
    <description><![CDATA[&nbsp;]]></description>
    <styleUrl>#style390</styleUrl>
    <LineString>
      <tessellate>1</tessellate>
      <coordinates>
        10.146948,44.790592,97.500000
        10.146958,44.790562,97.599998
        10.147018,44.790497,97.699997
        10.147083,44.790466,97.699997
      </coordinates>
    </LineString>
  </Placemark>
  </Document>
</kml>

但运行此查询失败:

xmlstarlet sel -t -c "//coordinates/text()" test.kml

这似乎使用在线路径工具正确解析 - http://www.qutoric.com/xslt/analyser/xpathtool.html

我在这里错过了什么吗?

4

1 回答 1

4

您需要为以下内容定义和使用名称空间前缀http://earth.google.com/kml/2.2 test.kml

xmlstarlet sel -t -c "//kml:coordinates/text()" -N kml=http://earth.google.com/kml/2.2 test.kml

XPath 没有默认命名空间 - 如果 XPath 中的名称未指定命名空间前缀,则假定它位于空命名空间中;因此,在尝试匹配名称位于与空名称不同的名称空间中的节点时(如本例所示),必须始终指定名称空间前缀。

于 2013-04-30T18:45:06.227 回答