解析XML XmlPullParser android

前端之家收集整理的这篇文章主要介绍了解析XML XmlPullParser android前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在android中使用xmlpullparser来解析一个看起来像这样的xml文档:
  1. <top>
  2. <category>
  3. <name></name>
  4. <desc></desc>
  5. <songs>
  6. <song>
  7. <clip></clip>
  8. <thumb></thumb>
  9. </song>
  10. <song>
  11. <clip></clip>
  12. <thumb></thumb>
  13. </song>
  14. </songs>
  15. </category>
  16. </top>

我试过这个:

  1. while (eventType != XmlPullParser.END_DOCUMENT && !done){
  2. String name = null;
  3. switch (eventType){
  4. case XmlPullParser.START_DOCUMENT:
  5. categoriesSong = new ArrayList<TopMousika>();
  6. break;
  7. case XmlPullParser.START_TAG:
  8. name = parser.getName();
  9. if (name.equalsIgnoreCase(CATEGORY)){
  10. currentCategory = new TopMousika();
  11. currentCategory.setId(parser.getAttributeValue(0));
  12. currentCategory.setId(parser.getAttributeValue(1));
  13. } else if (currentCategory != null){
  14. if (name.equalsIgnoreCase(NAME)){
  15. currentCategory.setName(parser.nextText());
  16. } else if (name.equalsIgnoreCase(DESCRIPTION)){
  17. currentCategory.setDescription(parser.nextText());
  18. } else if (name.equalsIgnoreCase(THUMBNAIL)){
  19. currentCategory.setThumbnail(parser.nextText());
  20. } else if (name.equalsIgnoreCase(SONGS)){
  21. songs = new ArrayList<SongMousika>();
  22. if(name.equalsIgnoreCase(SONG)){
  23. currentSong = new SongMousika();
  24. currentSong.setId(parser.getAttributeValue(0));
  25. Log.d("TEST","OK");
  26. songs.add(currentSong);
  27. } else if (name.equalsIgnoreCase(TITLE)){
  28. Log.d("TEST","OK2");
  29. currentSong.setTitle(parser.nextText());
  30. } else if (name.equalsIgnoreCase(SINGER)){
  31. currentSong.setTitle(parser.nextText());
  32. } else if (name.equalsIgnoreCase(THUMBNAIL)){
  33. currentSong.setTitle(parser.nextText());
  34. } else if (name.equalsIgnoreCase(PUBLICATION_DATE)){
  35. currentSong.setTitle(parser.nextText());
  36. } else if (name.equalsIgnoreCase(CLIP)){
  37. currentSong.setTitle(parser.nextText());
  38. }
  39. currentCategory.setSongs(songs);
  40. }
  41. }
  42. break;
  43. case XmlPullParser.END_TAG:
  44. name = parser.getName();
  45. if (name.equalsIgnoreCase(CATEGORY) &&
  46. currentCategory != null){
  47. currentCategory.setSongs(songs);
  48. categoriesSong.add(currentCategory);
  49. } else if (name.equalsIgnoreCase(TOP)){
  50. done = true;
  51. }
  52. break;
  53. }
  54. eventType = parser.next();
  55. }

但我无法检索我的歌曲列表.

有人可以帮我吗?

你似乎期望名字在检查之间神奇地改变:
  1. if (name.equalsIgnoreCase(SONGS)) {
  2. songs = new ArrayList<SongMousika>();
  3. if(name.equalsIgnoreCase(SONG)) {

SONG和SONGS怎么样?您需要继续提取XML并在循环中以不同方式对每个元素名称做出反应.因此,当您对START_TAG事件做出反应时,您可能会有一堆if / else if语句而没有任何嵌套. (顺便说一句,很可能值得把它的处理方法拉成一个单独的方法.)

编辑:好的,所以你需要让循环的每次迭代只对一个标签做出反应.因此,您对开始标记的处理将类似于:

  1. case XmlPullParser.START_TAG:
  2. name = parser.getName();
  3. if (name.equalsIgnoreCase(CATEGORY)){
  4. currentCategory = new TopMousika();
  5. currentCategory.setId(parser.getAttributeValue(0));
  6. currentCategory.setId(parser.getAttributeValue(1));
  7. } else if (currentCategory != null) {
  8. if (name.equalsIgnoreCase(NAME)){
  9. currentCategory.setName(parser.nextText());
  10. } else if (name.equalsIgnoreCase(DESCRIPTION)){
  11. currentCategory.setDescription(parser.nextText());
  12. } else if (name.equalsIgnoreCase(THUMBNAIL)){
  13. currentCategory.setThumbnail(parser.nextText());
  14. } else if (name.equalsIgnoreCase(SONGS)){
  15. songs = new ArrayList<SongMousika>();
  16. } else if (songs != null) {
  17. if(name.equalsIgnoreCase(SONG)) {
  18. currentSong = new SongMousika();
  19. currentSong.setId(parser.getAttributeValue(0));
  20. Log.d("TEST","OK");
  21. songs.add(currentSong);
  22. } else if (currentSong != null) {
  23. else if (name.equalsIgnoreCase(TITLE)) {
  24. Log.d("TEST","OK2");
  25. currentSong.setTitle(parser.nextText());
  26. } else if (name.equalsIgnoreCase(SINGER)){
  27. currentSong.setSinger(parser.nextText());
  28. } else if (name.equalsIgnoreCase(THUMBNAIL))
  29. // etc
  30. }
  31. }
  32. }

请注意,在任何路径中我们都不会检查具有多个值的名称 – 我们说:

>我们是否开始新的类别?

>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有一个类别),我们是否开始新的歌曲列表?
>如果是,请创建并记住它 – 然后继续下一次迭代.
>如果没有(如果我们有歌曲列表),我们是否开始新歌?

>如果是,请创建并记住它 – 然后继续下一次迭代.>如果没有(如果我们有一首歌)……>我们正在阅读标题吗?如果是这样,请阅读文本并进行设置,然后继续.>我们在看歌手吗?如果是这样,然后继续.>我们正在阅读缩略图吗?如果是这样,然后继续.>等

猜你在找的XML相关文章