我正在尝试使用xmlstarlet提取这个KML文件中的'坐标'节点的内容。
使用xmlstarlet本身验证KML文件。
我把它缩减为一个小的测试文件,包含:
<?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[ ]]></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
似乎可以正确解析我错过了什么吗?
您需要为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中的名称没有指定名称空间前缀,则假定它在空名称空间中;因此,在尝试匹配名称与空名称不同的名称空间中的节点时(如在本例中),必须始终指定名称空间前缀。