我在android中使用xmlpullparser来解析一个看起来像这样的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(); }
但我无法检索我的歌曲列表.
有人可以帮我吗?
你似乎期望名字在检查之间神奇地改变:
原文链接:https://www.f2er.com/xml/293098.htmlif (name.equalsIgnoreCase(SONGS)) { songs = new ArrayList<SongMousika>(); if(name.equalsIgnoreCase(SONG)) {
SONG和SONGS怎么样?您需要继续提取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 } } }
请注意,在任何路径中我们都不会检查具有多个值的名称 – 我们说:
>我们是否开始新的类别?
>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有一个类别),我们是否开始新的歌曲列表?
>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有歌曲列表),我们是否开始新歌?
>如果是,请创建并记住它 – 然后继续下一次迭代.>如果没有(如果我们有一首歌)……>我们正在阅读标题吗?如果是这样,请阅读文本并进行设置,然后继续.>我们在看歌手吗?如果是这样,然后继续.>我们正在阅读缩略图吗?如果是这样,然后继续.>等