2011-09-19 146 views
7

我正在使用Android的XmlPullParser的OpenStreetMap(.osm)文件。我有問題的部分是這樣的:XmlPullParser獲取子節點

<way id='-13264' action='modify' visible='true'> 
    <nd ref='-13252' /> 
    <nd ref='-13251' /> 
    <nd ref='-13249' /> 
    </way> 

我需要每way-節點內與ND-節點的工作,在時間(這是關鍵)一個way-節點,從而形成一定的數據這些節點之間的結構要精確。 似乎沒有方便的方法來獲取XmlPullParser中一個節點的所有子節點,所以我嘗試了很多嵌套的if/elseif-這些節點上的東西,但無法讓它工作。有人可以提供一些示例代碼來處理節點的子節點,但保持類似父節點的子節點分離嗎?

+0

來到這裏尋找完全相同的東西,並沒有失望。只是一個FYI,我只是開放源代碼閱讀來自jdk/adk的osm.bz2文件的工具https://github.com/spyhunter99/osmreader – spy

+0

@spy看起來不錯,感謝分享! – FWeigl

回答

7

這是我會怎麼解析這個。你可以自由使用它,但你必須自己拿出Way課程的實現! :)

List<Way> allWays = new ArrayList<Way>(); 
Way way; 
int eventType; 
while((eventType = parser.getEventType())!=XmlPullParser.END_DOCUMENT){ 
    if(eventType==XmlPullParser.START_TAG) { 
     if("nd".equals(parser.getName()) { 
      way.addNd(parser.getAttributeValue(0)); 
     } 
     else if("way".equals(parser.getName()) { 
      way = new Way(); 
     } 
    } 
    else if(eventType==XmlPullParser.END_TAG) { 
     if("way".equals(parser.getName()) { 
      allWays.add(way); 
     } 
    } 
    parser.next(); 
} 

當然,如果xml即使有點不同,這個確切的代碼可能無法正常工作。再次,我將把它作爲提問者的練習。

+0

我會做一點不同,但這給了我權利方向。謝謝! – FWeigl

+0

@Ascorbin,我面臨同樣的問題,我是新來的XmlPullParsing請幫助我。我已經發布我的問題,請檢查這個http://stackoverflow.com/questions/17807718/how-to-get-child-or-sub-tags-in-xml-using-xmlpullparsing-in-android –

+0

我面臨同樣的問題http://stackoverflow.com/questions/39391267/how-can-i-identify-same-xml-tag-second-time –

2

您可以使用下面的代碼:

int eventType=parser.getEventType(); 
    while(eventType!=XmlPullParser.END_DOCUMENT){ 
     if(eventType==XmlPullParser.START_TAG 
       && parser.getName().equals("nd"){ 
       //process your node... 
     } 
     parser.next(); 
    } 
+0

請幫助我這個http://stackoverflow.com/questions/39391267/how-can-i-identify-same-xml-tag-second-time –