如何使用Java中的xpath从特定属性中选择所有属性值

时间:2014-03-05 12:25:15

标签: java xml xpath

我有以下包含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>

2 个答案:

答案 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);
   }
}