[英]Android Studio Java XmlPullParser how to get only certain tag values
我在解析一些xml标签时遇到了麻烦。 我对Android开发非常陌生,但仍在基础方面苦苦挣扎。
抱歉,如果这篇帖子很难阅读。
我想阅读我下载的以下XML文件:
<lfm status="ok">
<album>
<name>Now, Diabolical</name>
<artist>Satyricon</artist>
<mbid>28d51e3f-b12c-4948-b35b-c1f5aae76ed2</mbid>
<image size="">...</image>
<listeners>131741</listeners>
<playcount>2876007</playcount>
<tracks>
<track rank="1">
<name>Now, Diabolical</name>
<url>...</url>
<duration>367</duration>
<streamable fulltrack="0">0</streamable>
<artist>
<name>Satyricon</name>
<mbid>8eed05a5-e9a1-4dda-8b33-e354c4ecc8b6</mbid>
<url>https://www.last.fm/music/Satyricon</url>
</artist>
</track>
<track rank="2">
<name>K.I.N.G.</name>
<url>https://www.last.fm/music/Satyricon/_/K.I.N.G.</url>
<duration>216</duration>
<streamable fulltrack="0">0</streamable>
<artist>
<name>Satyricon</name>
<mbid>8eed05a5-e9a1-4dda-8b33-e354c4ecc8b6</mbid>
<url>https://www.last.fm/music/Satyricon</url>
</artist>
</track>
</tracks>
<tags>
<tag>
<name>black metal</name>
<url>https://www.last.fm/tag/black+metal</url>
</tag>
<tag>...</tag>
<tag>...</tag>
</tags>
</album>
</lfm>
我用我的XmlPullParser类阅读了它:
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
FileInputStream fis = ctx.openFileInput("AlbumInfo.xml");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
xpp.setInput(reader);
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = xpp.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagName.equalsIgnoreCase("track")) {
currentXmlAlbumTrack = new XmlTracks();
}
break;
case XmlPullParser.TEXT:
curText = xpp.getText();
break;
case XmlPullParser.END_TAG:
if (tagName.equals("track")) {
xmlTrackItems.add(currentXmlAlbumTrack);
} else if (tagName.equals("name")) {
currentXmlAlbumTrack.setTrackName(curText);
Log.d("tag","name: " + curText);
} else if (tagName.equalsIgnoreCase("url")) {
//TODO
} else if (tagName.equalsIgnoreCase("duration")){
//TODO
}
break;
default:
break;
}
eventType = xpp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
我只想解析每个track
标签内的name
标签。
因此,基本上我想将所有轨道名称(其中的8个)解析为ListView,但是当我使用currentXmlAlbumTrack.setTrackName(curText);
它尝试输出XML文件中的每个名称标签,如下所示:
D/tag: name text: Now, Diabolical
D/tag: name text: Now, Diabolical
D/tag: name text: Satyricon
D/tag: name text: K.I.N.G.
D/tag: name text: Satyricon
D/tag: name text: The Pentagram Burns
D/tag: name text: Satyricon
D/tag: name text: A New Enemy
D/tag: name text: Satyricon
D/tag: name text: The Rite of Our Cross
D/tag: name text: Satyricon
D/tag: name text: That Darkness Shall Be Eternal
D/tag: name text: Satyricon
D/tag: name text: Delirium
D/tag: name text: Satyricon
D/tag: name text: To the Mountains
D/tag: name text: Satyricon
D/tag: name text: black metal
D/tag: name text: albums I own
D/tag: name text: Black n Roll
D/tag: name text: Norwegian Black Metal
D/tag: name text: metal
没有完全重写解析器,有什么办法可以避免这种情况?
您可以尝试使用getDepth() https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html#getDepth()
它返回元素的深度,所以对于您感兴趣的名称,深度应该为4,因为根深度为1。在最后一个case语句中,您的代码只做了很小的更改,并使用xpp检查深度.getDepth()== 4 :
case XmlPullParser.END_TAG:
if (tagName.equals("track")) {
xmlTrackItems.add(currentXmlAlbumTrack);
} else if (tagName.equals("name") && xpp.getDepth()==4) {
currentXmlAlbumTrack.setTrackName(curText);
Log.d("tag","name: " + curText);
} else if (tagName.equalsIgnoreCase("url")) {
//TODO
} else if (tagName.equalsIgnoreCase("duration")){
//TODO
}
break;
另一种解决方案是添加在轨道标签被发现时引发一个标志,在跟踪标签结束时被清除,并在名称标签检查:
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
FileInputStream fis = ctx.openFileInput("AlbumInfo.xml");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
xpp.setInput(reader);
int eventType = xpp.getEventType();
// add flag to distinguish parent tag
bool isTrack=false;
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = xpp.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
// WRONG PLACE, IT SHOULD BE INSIDE IF !!!
// isTrack=true; // <track> tag found
if (tagName.equalsIgnoreCase("track")) {
currentXmlAlbumTrack = new XmlTracks();
isTrack=true; // <track> tag found
}
break;
case XmlPullParser.TEXT:
curText = xpp.getText();
break;
case XmlPullParser.END_TAG:
if (tagName.equals("track")) {
isTrack=false; // </track> end tag found
xmlTrackItems.add(currentXmlAlbumTrack);
} else if (tagName.equals("name") && isTrack) {
currentXmlAlbumTrack.setTrackName(curText);
Log.d("tag","name: " + curText);
} else if (tagName.equalsIgnoreCase("url")) {
//TODO
} else if (tagName.equalsIgnoreCase("duration")){
//TODO
}
break;
default:
break;
}
eventType = xpp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.