解析XML XmlPullParser android
我在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 } } } 请注意,在任何路径中我们都不会检查具有多个值的名称 – 我们说: >我们是否开始新的类别? >如果是,请创建并记住它 – 然后继续下一次迭代. >如果是,请创建并记住它 – 然后继续下一次迭代.>如果没有(如果我们有一首歌)……>我们正在阅读标题吗?如果是这样,请阅读文本并进行设置,然后继续.>我们在看歌手吗?如果是这样,然后继续.>我们正在阅读缩略图吗?如果是这样,然后继续.>等 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |