7

我正在使用 Android 的 XmlPullParser 处理 OpenStreetMap (.osm) 文件。我遇到问题的部分是:

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

我需要在每个路节点中使用 nd- 节点,一次一个路节点(这是关键),准确地说,在这些节点之间创建特定的数据结构。似乎没有方便的方法来获取 XmlPullParser 中一个节点的所有子节点,所以我在这些节点上尝试了很多嵌套的 if/elseif- 东西,但无法让它工作。有人可以为我提供一些示例代码来处理节点的子节点,但将相似父节点的子节点分开吗?

4

2 回答 2

8

这就是我将如何解析它。你可以自由使用它,但你必须自己想出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 稍有不同,则此确切代码可能无法正常工作。同样,我将把它留给提问者作为练习。

于 2011-09-19T15:34:57.533 回答
2

您可以使用以下代码:

    int eventType=parser.getEventType();
    while(eventType!=XmlPullParser.END_DOCUMENT){
         if(eventType==XmlPullParser.START_TAG 
               && parser.getName().equals("nd"){
              //process your node...
         }
         parser.next();
    }
于 2011-09-19T15:27:27.140 回答