我在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();
- }
但我无法检索我的歌曲列表.
有人可以帮我吗?
你似乎期望名字在检查之间神奇地改变:
- if (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
- }
- }
- }
请注意,在任何路径中我们都不会检查具有多个值的名称 – 我们说:
>我们是否开始新的类别?
>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有一个类别),我们是否开始新的歌曲列表?
>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有歌曲列表),我们是否开始新歌?
>如果是,请创建并记住它 – 然后继续下一次迭代.>如果没有(如果我们有一首歌)……>我们正在阅读标题吗?如果是这样,请阅读文本并进行设置,然后继续.>我们在看歌手吗?如果是这样,然后继续.>我们正在阅读缩略图吗?如果是这样,然后继续.>等