XmlPullParser-从具有特定attributevalue的标记中获取数据



我目前正在为一个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>
...

我正在寻找"特大号"中的链接。

我当前的代码:

...
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)

有人知道怎么处理吗?

解决方案

我开始使用Raghunadan给我的例子。最后,我只是简化了代码,并添加了他建议的"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;
}
...

相关内容

  • 没有找到相关文章

最新更新