解析XML XmlPullParser安卓
问题描述:
我使用xmlpullparser在android系统解析的XML文档的样子:解析XML XmlPullParser安卓
<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();
}
,但我不能找回我的歌曲列表。
任何人都可以帮我吗?
答
你似乎在期待name
支票之间幻化:
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
}
}
}
注意,在通过没有任何路径如何,我们从来没有检查有多个值name
- 我们说:
- 我们是开始一个新的类别?
- 如果是这样,创建它并记住它 - 然后继续下一次迭代。
- 如果不是(如果我们已经得到一个类别),我们是否开始一个新的歌曲列表?
- 如果是这样,创建它并记住它 - 然后继续下一次迭代。
- 如果不是(如果我们已经得到一首歌曲列表),我们开始新歌吗?
- 如果是这样,创建它并记住它 - 然后继续下一次迭代。
- 如果不是(如果我们有一首歌曲)...
- 难道我们阅读的标题?如果是这样,请阅读文本并设置它,然后继续。
- 我们在读歌手吗?如果是这样,请阅读文本并设置它,然后继续。
- 我们正在阅读缩略图吗?如果是这样,请阅读文本并设置它,然后继续。
- 等
谢谢您的回答,我已经按照在IBM developerWorks上[链接](例子http://www.ibm.com/developerworks/opensource/library/x -android /) – wael
@wael:不,你没有。尝试找到一个例子,在那里他们检查'name'是否等于一个值,然后*在该条件下*检查'name'是否等于另一个值。他们检查'currentMessage'为空,并检查其中的各种名称,但这不是一回事。你现在明白为什么它不起作用吗? –
请您解释更多关于**您需要不断地拉动XML并对循环中的每个元素名称作出不同的反应** – wael