2012-05-31 12 views
2

我有一個xpath查詢,我可以得到所有的屬性和它們各自的值如何獲取vtd-xml中的父元素?

但現在我想知道這些屬性屬於哪個元素?

這是我的xml:

<?xml version='1.0' encoding='UTF-8'?> 
<osm version="0.6" generator="osmconvert 0.5Z"> 
<bounds minlat="51.60542" minlon="-0.1854331" maxlat="51.69193" maxlon="-0.0088394"/> 
    <node id="195870" lat="51.6844148" lon="-0.1772914" version="4" timestamp="2008-10-07T19:42:43Z" changeset="136213" uid="508" user="Welshie"> 
     <tag k="highway" v="motorway_junction"/> 
     <tag k="ref" v="24"/> 
    </node> 
<node id="33206602" lat="51.6084884" lon="-0.0365496" version="4" timestamp="2011-09-23T16:54:00Z" changeset="9378015" uid="28024" user="dbisping"> 
     <tag k="amenity" v="fuel"/> 
     <tag k="fuel:biodiesel" v="yes"/> 
     <tag k="fuel:biogas" v="no"/> 
     <tag k="fuel:cng" v="no"/> 
     <tag k="fuel:diesel" v="no"/> 
     <tag k="fuel:hydrogen" v="no"/> 
     <tag k="fuel:lpg" v="no"/> 
     <tag k="fuel:octane_100" v="no"/> 
     <tag k="fuel:octane_95" v="no"/> 
     <tag k="fuel:octane_98" v="no"/> 
     <tag k="name" v="Pure Fuels"/> 
     <tag k="self_service" v="no"/> 
    </node> 
    </osm> 

和我寫的代碼:

import com.ximpleware.*; 

public class Test2 
{ 
    public static void main (String[] abc) 
    { 
     VTDGen vg = new VTDGen(); 
     vg.parseFile("C:\\workspace\\sample osm xml\\1.xml",false); 


     VTDNav nav = vg.getNav(); 
     AutoPilot ap = new AutoPilot(nav); 
     try { 
      //ap.selectXPath("/osm/node/tag[@k='amenity']"); 
      ap.selectXPath("//node/tag"); 
      while (ap.evalXPath() != -1) 
      { 

       //getting attribute first element 
       int val = nav.getAttrVal("k"); 
       if (val != -1) 
       { 
        String element = "The element or node is ??? "; 
        String o = "key = " + nav.toNormalizedString(val) + " value = " +nav.toString(val + 2); 
        System.out.print(element); 
        System.out.println(o); 
       } 


      } 
     } catch (XPathParseException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (XPathEvalException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (NavException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 


    } 
} 
+0

所以,你想知道您要分析的@id?如果這就是你要找的所有東西,請嘗試ap.selectXPath(「../@id」)如果是其他內容,請嘗試添加您發佈的xml之前/之後的片段。 – JWiley

回答

1

如何vn.toElement(vn.PARENT)?

1

我有同樣的問題,以及和我無法處理它(我也是工作OSM數據)

我使用的方法,但我認爲它是沒有效率像OSM

大量DATAS的

我想獲得途徑中的節點,當我看到節點,我試圖讓其父ID

int wayIndex = 1; 

     while (way_id_counter != -1) 
     { 
      start = System.currentTimeMillis(); 
      wayID = vn.toString(way_id_counter+1); 
      apSubNode_id.resetXPath(); 
      apSubNode_id.selectXPath("//way[" + wayIndex +"]/nd/@ref"); 
      way_node_id_counter = apSubNode_id.evalXPath(); 

      while (way_node_id_counter != -1) 
      { 
       subNodeID = vn.toString(way_node_id_counter+1); 
       //System.out.println("Sub node id is " + subNodeID); 
       way_node_id_counter = apSubNode_id.evalXPath(); 
      } 
      wayIndex++; 
      way_id_counter = apWay_id.evalXPath(); 
      //System.out.println("Way id is " + wayID); 
      //break; 
      end = System.currentTimeMillis(); 
      System.out.println(end - start); 
     } 

據嵌套(尋找途徑第一則這種方式中或在此節點標籤方式在你的情況,但我沒有找到一個好的解決方案,直到現在)

希望它幫助