2011-09-03 94 views
2

我使用xmlpullparser在android系统解析的XML文档的样子:解析XML XmlPullParser安卓

<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(); 
      } 

,但我不能找回我的歌曲列表。

任何人都可以帮我吗?

回答

4

你似乎在期待name支票之间幻化:

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

它是如何将是SONGSONGS?您需要继续拉动XML并对每个元素名称作出不同的反应在循环中。因此,在对START_TAG事件做出反应时,您可能会有大量if/else if语句没有任何嵌套。 (顺便提一下,这很有可能是值得把处理方式分解成单独的方法。)

编辑:好的,所以你需要使每个迭代的循环只对一个标签作出反应。所以,你处理的开始标记会是这样的:

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 - 我们说:

  • 我们是开始一个新的类别?
    • 如果是这样,创建它并记住它 - 然后继续下一次迭代。
    • 如果不是(如果我们已经得到一个类别),我们是否开始一个新的歌曲列表?
    • 如果是这样,创建它并记住它 - 然后继续下一次迭代。
    • 如果不是(如果我们已经得到一首歌曲列表),我们开始新歌吗?
      • 如果是这样,创建它并记住它 - 然后继续下一次迭代。
      • 如果不是(如果我们一首歌曲)...
      • 难道我们阅读的标题?如果是这样,请阅读文本并设置它,然后继续。
      • 我们在读歌手吗?如果是这样,请阅读文本并设置它,然后继续。
      • 我们正在阅读缩略图吗?如果是这样,请阅读文本并设置它,然后继续。
+0

谢谢您的回答,我已经按照在IBM developerWorks上[链接](例子http://www.ibm.com/developerworks/opensource/library/x -android /) – wael

+0

@wael:不,你没有。尝试找到一个例子,在那里他们检查'name'是否等于一个值,然后*在该条件下*检查'name'是否等于另一个值。他们检查'currentMessage'为空,并检查其中的各种名称,但这不是一回事。你现在明白为什么它不起作用吗? –

+0

请您解释更多关于**您需要不断地拉动XML并对循环中的每个元素名称作出不同的反应** – wael