2011-09-03 125 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