Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个XPath表达式不能在xmlstarlet中返回正确的值?_Xml_Xpath_Kml_Xmlstarlet - Fatal编程技术网

为什么这个XPath表达式不能在xmlstarlet中返回正确的值?

为什么这个XPath表达式不能在xmlstarlet中返回正确的值?,xml,xpath,kml,xmlstarlet,Xml,Xpath,Kml,Xmlstarlet,我试图使用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</nam

我试图使用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>
这似乎可以使用联机路径工具正确解析-


我在这里遗漏了什么吗?

您需要为
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中的名称未指定名称空间前缀,则假定该名称位于空名称空间中;因此,在尝试匹配名称位于不同于空名称空间(如本例中)的节点时,必须始终指定名称空间前缀。

您需要为
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中的名称未指定名称空间前缀,则假定该名称位于空名称空间中;因此,在尝试匹配名称位于与空名称空间不同的名称空间(如本例中)的节点时,必须始终指定名称空间前缀。

PathEnq,您引用的在线xpath工具是xpath 2.0工具-因此它识别XML中的默认名称空间-xpath 1.0工具(如xmlstarlet)不识别默认名称空间,因此需要您使用前缀定义名称空间-如接受的答案中所述。PathEnq,您引用的在线xpath工具是xpath 2.0工具-因此它识别XML中的默认名称空间-xpath 1.0工具(如xmlstarlet)不识别默认名称空间,因此需要您使用前缀定义名称空间-如接受的答案中所述。