XmlPullParser получить дочерние узлы - PullRequest
7 голосов
/ 19 сентября 2011

Я работаю с файлом OpenStreetMap (.osm) с помощью Android XmlPullParser. У меня проблемы с этим:

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

Мне нужно работать с nd-узлами в каждом путевом узле, по одному путевому узлу за раз (это суть), создавая определенную структуру данных между этими узлами, чтобы быть точным. Кажется, что нет удобного способа получить все дочерние узлы одного узла в XmlPullParser, поэтому я пробовал многое из этого вложенного if / elseif-материала на этих узлах, но не могу заставить его работать. Может ли кто-нибудь предоставить мне некоторый пример кода для работы с дочерними узлами узла, но с разделением дочерних узлов аналогичных родительских узлов?

Ответы [ 2 ]

8 голосов
/ 19 сентября 2011

Вот как бы я это проанализировал. Вы можете свободно использовать его, но вам придется самостоятельно придумать реализацию класса 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, приходящий к вам, немного отличается, этот точный код может не работать. Опять же, я оставлю это как упражнение для спрашивающего.

2 голосов
/ 19 сентября 2011

Вы можете использовать следующий код:

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