问题描述
我使用xmlpullparser在Android的解析XML文档,看起来像:
i'm using xmlpullparser in android to parse an xml document that looks like :
<top>
<category>
<name></name>
<desc></desc>
<songs>
<song>
<clip></clip>
<thumb></thumb>
</song>
<song>
<clip></clip>
<thumb></thumb>
</song>
</songs>
</category>
</top>
我尝试这样做:
I tried this :
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();
}
但我不能找回我的歌曲列表。
but I can not retrieve my Songs List.
任何一个可以帮助我吗?
can any one help me please ?
推荐答案
您似乎在期待名称
来幻化检查的:
You seem to be expecting name
to change magically between checks:
if (name.equalsIgnoreCase(SONGS)) {
songs = new ArrayList<SongMousika>();
if(name.equalsIgnoreCase(SONG)) {
这怎么会是宋
的和的 SONGS
?你需要保持拉XML和循环的反应,每个元素名称不同的。所以,你可能有一大堆的的if / else,如果反应时,向START_TAG事件
声明没有任何嵌套。 (这很可能是值得的拉动,该处理成一个单独的方法,顺便说一句。)
How is it going to be SONG
and SONGS
? You need to keep pulling XML and react to each element name differently in the loop. So you'll probably have a bunch of if/else if
statements without any nesting when reacting to a START_TAG event. (It's very likely to be worth pulling the handling of that into a separate method, by the way.)
编辑:好了,你需要做的每次循环只是反应的一个标签的。所以,你处理的开始标记会是这样的:
Okay, so you need to make each iteration of the loop just react to one tag. So your handling for a start tag would be something like:
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
}
}
}
请注意是如何通过有任何路径,我们从不检查名称
有多个值 - 我们说:
Note how in any path through there we never check for name
having multiple values - we say:
- 难道我们开始一个新的类别?
- 如果是这样,创建它,记住它 - 然后继续下一个迭代
- 如果没有(如果以前的有的一个类别),是我们开始一个新的歌曲列表?
- 如果是这样,创建它,记住它 - 然后继续下一个迭代
- 如果没有(如果以前的得到的歌曲列表),是我们开始一个新的歌曲?
- 如果是这样,创建它,记住它 - 然后继续下一个迭代
- 如果没有(如果以前的有的一首歌曲)...
- 我们是读标题?如果是这样,请阅读文本并设置它,然后继续。
- 难道我们阅读的歌手呢?如果是这样,请阅读文本并设置它,然后继续。
- 我们是看缩略图?如果是这样,请阅读文本并设置它,然后继续。
- 等
- Are we starting a new category?
- If so, create it and remember it - then continue with the next iteration.
- If not (and if we've got a category), are we starting a new song list?
- If so, create it and remember it - then continue with the next iteration.
- If not (and if we've got a song list), are we starting a new song?
- If so, create it and remember it - then continue with the next iteration.
- If not (and if we've got a song)...
- Are we reading the title? If so, read the text and set it, then continue.
- Are we reading the singer? If so, read the text and set it, then continue.
- Are we reading the thumbnail? If so, read the text and set it, then continue.
- etc
这篇关于解析XML XmlPullParser机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!