解析XML XmlPullParser机器人机器人、XML、XmlPullParser

由网友(生活沒有如果只有後果)分享简介:我使用xmlpullparser在Android的解析XML文档,看起来像:i'm using xmlpullparser in android to parse an xml document that looks like : <...

我使用xmlpullparser在Android的解析XML文档,看起来像:

i'm using xmlpullparser in android to parse an xml document that looks like :

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

我尝试这样做:

I tried this :

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

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

but I can not retrieve my Songs List.

任何一个可以帮助我吗?

can any one help me please ?

推荐答案

您似乎在期待名称来幻化检查的:

You seem to be expecting name to change magically between checks:

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

这怎么会是的和的 SONGS ?你需要保持拉XML和循环的反应,每个元素名称不同的。所以,你可能有一大堆的的if / else,如果反应时,向START_TAG事件声明没有任何嵌套。 (这很可能是值得的拉动,该处理成一个单独的方法,顺便说一句。)

How is it going to be SONG and SONGS? You need to keep pulling XML and react to each element name differently in the loop. So you'll probably have a bunch of if/else if statements without any nesting when reacting to a START_TAG event. (It's very likely to be worth pulling the handling of that into a separate method, by the way.)

编辑:好了,你需要做的每次循环只是反应的一个标签的。所以,你处理的开始标记会是这样的:

Okay, so you need to make each iteration of the loop just react to one tag. So your handling for a start tag would be something like:

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
                }
            }
        }

请注意是如何通过有任何路径,我们从不检查名称有多个值 - 我们说:

Note how in any path through there we never check for name having multiple values - we say:

难道我们开始一个新的类别? 如果是这样,创建它,记住它 - 然后继续下一个迭代 如果没有(如果以前的有的一个类别),是我们开始一个新的歌曲列表? 如果是这样,创建它,记住它 - 然后继续下一个迭代 如果没有(如果以前的得到的歌曲列表),是我们开始一个新的歌曲? 如果是这样,创建它,记住它 - 然后继续下一个迭代 如果没有(如果以前的有的一首歌曲)... 我们是读标题?如果是这样,请阅读文本并设置它,然后继续。 难道我们阅读的歌手呢?如果是这样,请阅读文本并设置它,然后继续。 我们是看缩略图?如果是这样,请阅读文本并设置它,然后继续。 等 Are we starting a new category? If so, create it and remember it - then continue with the next iteration. If not (and if we've got a category), are we starting a new song list? If so, create it and remember it - then continue with the next iteration. If not (and if we've got a song list), are we starting a new song? If so, create it and remember it - then continue with the next iteration. If not (and if we've got a song)... Are we reading the title? If so, read the text and set it, then continue. Are we reading the singer? If so, read the text and set it, then continue. Are we reading the thumbnail? If so, read the text and set it, then continue. etc
阅读全文

相关推荐

最新文章