gpt4 book ai didi

android - XmlPullParser - 从具有特定属性值的标签获取数据

转载 作者:行者123 更新时间:2023-11-29 17:50:27 27 4
gpt4 key购买 nike

我目前正在为一个 XML 文件创建一个解析器,并且一切正常,直到我添加一个额外的选项来检索链接。我有多个同名标签,我想要一个具有特定属性值的特定标签。

...
<artist>
<name>Venom</name>
<mbid>5ddddef1-fd5a-4ca8-8e89-df4adff4239b</mbid>
<url>Venom</url>
<image size="small">http://userserve-ak.last.fm/serve/34/35628151.png</image>
<image size="medium">http://userserve-ak.last.fm/serve/64/35628151.png</image>
<image size="large">http://userserve-ak.last.fm/serve/126/35628151.png</image>
<image size="extralarge">http://userserve-ak.last.fm/serve/252/35628151.png</image>
</artist>
...

我正在寻找“extralarge”中的链接。

我当前的代码:

...
private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "track");
String artist = null;
String artistPic = null;
String artisMbid = null;
String song = null;
String album = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("artist")) {

parser.require(XmlPullParser.START_TAG, ns, "artist");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String artistName = parser.getName();
if (artistName.equals("name")) {
artist = readArtist(parser);
} else if (artistName.equals("mbid")) {
artisMbid = readArtistMbid(parser);
} else if (artistName.equals("image")) {
artistPic = readArtistPic(parser);
} else {
skip(parser);
}
}
} else if (name.equals("name")) {
song = readSong(parser);
} else if (name.equals("album")) {
album = readAlbum(parser);
} else {
skip(parser);
}
}
return new TrackInfo(artist, artistPic, artisMbid, song, album);
}

...

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException {
String artistPic = "";
parser.require(XmlPullParser.START_TAG, ns, "image");
String tag = parser.getName();
String relType = parser.getAttributeValue(null, "size");
if (tag.equals("image")) {
if (relType.equals("extralarge")) {
artistPic = readText(parser);
parser.nextTag();
}
}
parser.require(XmlPullParser.END_TAG, ns, "image");

return artistPic;
}

...

private String readText(XmlPullParser parser) throws XmlPullParserException, IOException {
String result = "";
if (parser.next() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
return result;
}
...

错误:

E/CurrentTrackFragment logging﹕ XmlPullParserException: org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}image (position:START_TAG <image size='small'>@10:29 in java.io.InputStreamReader@52a3a014)

有人知道如何处理这个吗?

解决方法!

我开始使用 Raghunandan 给我的示例。最后我只简化了我的代码并添加了他建议的“check = true”。

private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "track");
boolean nowPlaying = false;
String artist = null;
String artistPic = null;
String artistMbid = null;
String song = null;
String songUrl = null;
String album = null;
String albumPic = null;
int playedUts = 0;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("artist")) {
parser.require(XmlPullParser.START_TAG, ns, "artist");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String artistName = parser.getName();
if (artistName.equals("name")) {
artist = readArtist(parser);
} else if (artistName.equals("mbid")) {
artistMbid = readArtistMbid(parser);
} else if (artistName.equals("image")) {
boolean check = false;
String imagesize = parser.getAttributeValue(null, "size");
if (imagesize.equals("extralarge")) {
check = true;
}
if (check) {
artistPic = readArtistPic(parser);
} else {
parser.nextText();
}
} else {
skip(parser);
}
}
} else if (name.equals("name")) {
song = readSong(parser);
} else if (name.equals("url")) {
songUrl = readSongUrl(parser);
} else if (name.equals("album")) {
album = readAlbum(parser);
} else if (name.equals("date")) {
playedUts = Integer.parseInt(readUts(parser));
} else {
skip(parser);
}
}
return new TrackInfo(nowPlaying, artist, artistPic, artistMbid, song, songUrl,
album, albumPic, playedUts);
}

...

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "image");
String artistPic = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "image");
return artistPic;
}

...

最佳答案

如果没有完整的堆栈跟踪,就很难指出错误。但是下面的工作。

 public class XMLPullParserHandler {

private String text;

public XMLPullParserHandler() {

}
public Void parse(InputStream is) { // pas the input stream
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();

parser.setInput(is, null);
boolean check =false;

//factory instantiates an object

int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("image")) {

if(parser.getAttributeValue(null, "size").equals("extralarge"))
{
check=true;
}

}


break;

case XmlPullParser.TEXT:
text = parser.getText();
break;

case XmlPullParser.END_TAG:
String val = null;
if (tagname.equalsIgnoreCase("name")) {

val=text;
Log.i(""," name is "+val);

}
else if (tagname.equalsIgnoreCase("mbid"))
{

val=text;
Log.i(""," mbid is "+val);

}
else if (tagname.equalsIgnoreCase("url"))
{

val=text;
Log.i(""," url is "+val);

}
else if (tagname.equalsIgnoreCase("image"))
{

val=text;
if(check == true)
Log.i(""," image is "+val);

}

break;

default:
break;
}
eventType = parser.next();
}

} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}
}

日志

04-24 04:39:06.906: I/(1539):  name is Venom
04-24 04:39:06.906: I/(1539): mbid is 5ddddef1-fd5a-4ca8-8e89-df4adff4239b
04-24 04:39:06.916: I/(1539): url is Venom
04-24 04:39:06.916: I/(1539): name is http://userserve-ak.last.fm/serve/252/35628151.png

替代方案:

private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "track");
boolean nowPlaying = false;
String artist = null;
String artistPic = null;
String artistMbid = null;
String song = null;
String songUrl = null;
String album = null;
String albumPic = null;
int playedUts = 0;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("artist")) {
parser.require(XmlPullParser.START_TAG, ns, "artist");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String artistName = parser.getName();
if (artistName.equals("name")) {
artist = readArtist(parser);
} else if (artistName.equals("mbid")) {
artistMbid = readArtistMbid(parser);
} else if (artistName.equals("image")) {
boolean check = false;
String imagesize = parser.getAttributeValue(null, "size");
if (imagesize.equals("extralarge")) {
check = true;
}
if (check) {
artistPic = readArtistPic(parser);
} else {
parser.nextText();
}
} else {
skip(parser);
}
}
} else if (name.equals("name")) {
song = readSong(parser);
} else if (name.equals("url")) {
songUrl = readSongUrl(parser);
} else if (name.equals("album")) {
album = readAlbum(parser);
} else if (name.equals("date")) {
playedUts = Integer.parseInt(readUts(parser));
} else {
skip(parser);
}
}
return new TrackInfo(nowPlaying, artist, artistPic, artistMbid, song, songUrl,
album, albumPic, playedUts);
}

...

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "image");
String artistPic = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "image");
return artistPic;
}

...

关于android - XmlPullParser - 从具有特定属性值的标签获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23263086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com