我有以下包含GPS坐标的XML文件,我只是想知道如何使用Java中的Xpath提取轨道纬度和经度。到目前为止我试过了:
System.out.println(xpath.evaluate("/gpx/trk/trkseg/trkpt/@lat", doc));
但这只检索第一个值?请有人告诉我如何一次性检索所有值。
非常感谢提前。
<gpx xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="MapSource 6.11.3"
version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1
http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>...</metadata>
<wpt lat="40.653792" lon="-111.922379">...</wpt>
<wpt lat="40.658111" lon="-111.919564">...</wpt>
<wpt lat="40.659546" lon="-111.917527">...</wpt>
<wpt lat="40.595857" lon="-111.910294">...</wpt>
<wpt lat="40.657349" lon="-111.918721">...</wpt>
<trk>
<name>FromParking</name>
<extensions>...</extensions>
<trkseg>
<trkpt lat="40.653782" lon="-111.922365">
<ele>1224.376221</ele>
<time>2009-11-19T20:00:11Z</time>
</trkpt>
<trkpt lat="40.653786" lon="-111.922350">
<ele>1223.895508</ele>
<time>2009-11-19T20:00:13Z</time>
</trkpt>
<trkpt lat="40.654449" lon="-111.922073">
<ele>1224.376221</ele>
<time>2009-11-19T20:00:22Z</time>
</trkpt>
<trkpt lat="40.654509" lon="-111.921919">
<ele>1224.376221</ele>
<time>2009-11-19T20:00:25Z</time>
</trkpt>
<trkpt lat="40.654618" lon="-111.921700">
<ele>1224.856934</ele>
<time>2009-11-19T20:00:35Z</time>
</trkpt>
答案 0 :(得分:1)
除了我在my answer to your previous question中描述的命名空间问题之外,您的基本问题是没有 XPath.evaluate
参数的QName returnType
方法将评估XPath表达式作为字符串,并且XPath规则说包含多个节点的节点集的字符串值是defined to be 第一个节点的字符串值按文档顺序设置。
如果要评估返回一组节点的XPath表达式,则必须使用一个采用QName的XPath方法,将XPathConstants.NODESET
作为请求的返回类型传递,并转换从{{返回的结果1}}到evaluate
然后你可以迭代。
答案 1 :(得分:0)
试试这个:要检索所有trkpt
属性,请执行以下操作:
String trkpt ="/gpx/trk/trkseg/trkpt";
NodeList nodeList= (NodeList) xpath.compile(trkpt).evaluate(doc, XPathConstants.NODESET);
for(int i=0; i<nodeList.getLength(); i++){
Node node = nodeList.item(i);
NamedNodeMap attributesMap = node.getAttributes();
for (int j = 0; j< attributesMap.getLength(); j++) {
Node attributeNode = attributesMap.item(j);
String attributeName = attributeNode.getNodeName();
String attributeValue = attributeNode.getNodeValue();
System.out.println(attributeName + "=" + attributeValue);
}
}