XmlPullParser - 从特定的AttributeValue标签获取数据(XmlPullP

2019-10-19 23:45发布

我目前正在创建一个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)

有谁知道如何来处理呢?

解!

我开始与Raghunandan给我的例子工作。 最后,我只是简化我的代码,并添加了“检查=真”他建议说。

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;
}

...

Answer 1:

如果没有完整的堆栈跟踪它很难指出错误。 然而,下面的作品。

 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;
}

...


文章来源: XmlPullParser - get data from tag with specific attributevalue