Разбор XML XmlPullParser android - PullRequest
       11

Разбор XML XmlPullParser android

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

Я использую xmlpullparser в Android для анализа XML-документа, который выглядит следующим образом:

<top>
  <category>
    <name></name>
    <desc></desc>
    <songs>
      <song>
        <clip></clip>
        <thumb></thumb>
      </song>
      <song>
        <clip></clip>
        <thumb></thumb>
      </song>
    </songs>
  </category>
</top>

Я пробовал это:

while (eventType != XmlPullParser.END_DOCUMENT && !done){
                String name = null;
                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        categoriesSong = new ArrayList<TopMousika>();
                        break;
                    case XmlPullParser.START_TAG:
                        name = parser.getName();
                        if (name.equalsIgnoreCase(CATEGORY)){
                            currentCategory = new TopMousika();
                            currentCategory.setId(parser.getAttributeValue(0));
                            currentCategory.setId(parser.getAttributeValue(1));
                        } else if (currentCategory != null){
                            if (name.equalsIgnoreCase(NAME)){
                                currentCategory.setName(parser.nextText());
                            } else if (name.equalsIgnoreCase(DESCRIPTION)){
                                currentCategory.setDescription(parser.nextText());
                            } else if (name.equalsIgnoreCase(THUMBNAIL)){
                                currentCategory.setThumbnail(parser.nextText());
                            } else if (name.equalsIgnoreCase(SONGS)){
                                songs = new ArrayList<SongMousika>();
                                if(name.equalsIgnoreCase(SONG)){
                                    currentSong = new SongMousika();
                                    currentSong.setId(parser.getAttributeValue(0));
                                    Log.d("TEST", "OK");
                                    songs.add(currentSong);
                                } else if (name.equalsIgnoreCase(TITLE)){
                                    Log.d("TEST", "OK2");
                                    currentSong.setTitle(parser.nextText());
                                } else if (name.equalsIgnoreCase(SINGER)){
                                    currentSong.setTitle(parser.nextText());
                                } else if (name.equalsIgnoreCase(THUMBNAIL)){
                                    currentSong.setTitle(parser.nextText());
                                } else if (name.equalsIgnoreCase(PUBLICATION_DATE)){
                                    currentSong.setTitle(parser.nextText());
                                } else if (name.equalsIgnoreCase(CLIP)){
                                    currentSong.setTitle(parser.nextText());
                                }
                                currentCategory.setSongs(songs);
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        name = parser.getName();
                        if (name.equalsIgnoreCase(CATEGORY) && 
currentCategory != null){
                            currentCategory.setSongs(songs);
                            categoriesSong.add(currentCategory);
                        } else if (name.equalsIgnoreCase(TOP)){
                            done = true;
                        }
                        break;
                }
                eventType = parser.next();
            }

но я не могу получить список своих песен.

Может ли кто-нибудь помочь мне, пожалуйста?

1 Ответ

4 голосов
/ 03 сентября 2011

Вы, похоже, ожидаете магического изменения name между проверками:

if (name.equalsIgnoreCase(SONGS)) {
    songs = new ArrayList<SongMousika>();
    if(name.equalsIgnoreCase(SONG)) {

Как это будет SONG и SONGS? Вы должны продолжать тянуть XML и реагировать на каждое имя элемента по-разному в цикле . Таким образом, вы, вероятно, будете иметь кучу if/else if операторов без вложенности при реагировании на событие START_TAG. (Между прочим, вполне вероятно, стоит потянуть обработку этого в отдельный метод.)

РЕДАКТИРОВАТЬ: Хорошо, поэтому вам нужно, чтобы каждая итерация цикла просто реагировала на один тег . Таким образом, ваша обработка начального тега будет выглядеть примерно так:

case XmlPullParser.START_TAG:
    name = parser.getName();
    if (name.equalsIgnoreCase(CATEGORY)){
        currentCategory = new TopMousika();
        currentCategory.setId(parser.getAttributeValue(0));
        currentCategory.setId(parser.getAttributeValue(1));
    } else if (currentCategory != null) {
        if (name.equalsIgnoreCase(NAME)){
            currentCategory.setName(parser.nextText());
        } else if (name.equalsIgnoreCase(DESCRIPTION)){
            currentCategory.setDescription(parser.nextText());
        } else if (name.equalsIgnoreCase(THUMBNAIL)){
            currentCategory.setThumbnail(parser.nextText());
        } else if (name.equalsIgnoreCase(SONGS)){
            songs = new ArrayList<SongMousika>();
        } else if (songs != null) {
            if(name.equalsIgnoreCase(SONG)) {
                currentSong = new SongMousika();
                currentSong.setId(parser.getAttributeValue(0));
                Log.d("TEST", "OK");
                songs.add(currentSong);
            } else if (currentSong != null) {
                 else if (name.equalsIgnoreCase(TITLE)) {
                    Log.d("TEST", "OK2");
                    currentSong.setTitle(parser.nextText());
                } else if (name.equalsIgnoreCase(SINGER)){
                    currentSong.setSinger(parser.nextText());
                } else if (name.equalsIgnoreCase(THUMBNAIL))
                    // etc
                }
            }
        }

Обратите внимание, что при любом проходе через него мы никогда не проверяем наличие у name нескольких значений - мы говорим:

  • Мы начинаем новую категорию?
    • Если это так, создайте его и запомните - затем переходите к следующей итерации.
    • Если нет (и если у нас есть категория), мы начинаем новый список песен?
    • Если это так, создайте его и запомните - затем переходите к следующей итерации.
    • Если нет (и если у нас есть список песен), мы начинаем новую песню?
      • Если это так, создайте его и запомните - затем переходите к следующей итерации.
      • Если нет (и если у нас есть песня) ...
      • Мы читаем заголовок? Если это так, прочитайте текст и установите его, а затем продолжайте.
      • Мы читаем певца? Если это так, прочитайте текст и установите его, а затем продолжайте.
      • Читаем ли мы миниатюру? Если это так, прочитайте текст и установите его, а затем продолжайте.
      • и т.д.
...