Android XML 解析器仅从提要中检索第一项

Android XML parser only retrieving the first item from feed

我正在创建一个小应用程序,用于在 android 中阅读 BBC f1 新闻提要并显示在 ListView 中。我按照 Android Developer Tutorial 创建了以下解析函数。

items ArrayList 返回到 activity 时,它只有一项,即最新的新闻报道。当我登录

这些函数在通过异步调用成功检索数据后调用。在倒数第二行,输出标题与返回的数组项相同。

我已将 logcat 输出发布到 pastebin here

RSS 结构

<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        // unrequired tags (title, description, lang etc)
        <item>
            <title></title>
            <description></description>
            <link></link>
            <guid isPermaLink="false"></guid>
            <pubDate></pubDate>
            <media:thumbnail  />
            <media:thumbnail  />
        </item>
        <item>
            <title></title>
            <description></description>
            <link></link>
            <guid isPermaLink="false"></guid>
            <pubDate></pubDate>
            <media:thumbnail  />
            <media:thumbnail  />
        </item>
    </channel>
</rss>

阅读提要功能

private static ArrayList<BBCItem> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    //Log.d("read feed", "");
    ArrayList<BBCItem> items = new ArrayList();

    parser.require(XmlPullParser.START_TAG, ns, "rss");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        // Starts by looking for the channel tag
        if (name.equals("channel")) {
            // navigate to the item tag here
            parser.require(XmlPullParser.START_TAG, ns, "channel");
            while (parser.next() != XmlPullParser.END_TAG){
                if (parser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }
                name = parser.getName();
                if (name.equals("item")){
                    items.add(bbcReadEntry(parser));
                }
                else {
                    skip(parser);
                }
            }
        } else {
            skip(parser);
        }
    }
    return items;
}

阅读单个供稿项目

public static BBCItem bbcReadEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "item");
    String title = null;
    String description = null;
    String url = null;
    String pubDate = null;
    String thumbnailURL = null;
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        if (name.equals("title")) {
            title = readString(parser, "title");
        } else if (name.equals("description")) {
            description = readString(parser, "description");
        } else if (name.equals("link")) {
            url = readString(parser, "link");
        } else if (name.equals("pubDate")) {
            pubDate = readString(parser, "pubDate");
        } else if (name.equals("media:thumbnail")) {
            //thumbnailURL = readThumbnail(parser);
            thumbnailURL = "http://news.bbcimg.co.uk/media/images/81615000/jpg/_81615988_nicorosberg.jpg";
        }
        else {
            skip(parser);
        }
    }
    Log.d("News item title", title);
    return new BBCItem(title, description, url, pubDate, thumbnailURL);
}

非常感谢任何帮助

谢谢

我从来没有设法完成这项工作。相反,我将 XML 字符串转换为 JSON 并对其进行了操作(我更喜欢这样做)。

This answer 是我将它从 XML 转换为 JSON 的方式。

我 运行 在这里处理某事时遇到了几乎相同的问题。我试图解析 rss 提要 xml 文件中的 xml。同样的事情发生了,我只得到了第一个 "item"。我也在考虑将 xml 转换为 json 并且更容易将其作为 json 处理。但我终于设法使 xml 文件对我有用,而无需转换为 json。这里出了什么问题是没有 END_TAG 的链接,就像我的情况一样,这导致了问题:

<enclosure url="http:/blabla....mp3" length="123456" type="audio/mpeg" />

在您的情况下,这可能会导致同样的问题:

<media:thumbnail  />

在关注此 google 文档页面 https://developer.android.com/training/basics/network-ops/xml.html 之后,经过大量测试和摸不着头脑,我通过在获取 "url" 属性后调用方法 "skip(parser)" 解决了这个问题在获取 "url" 属性值后直接。那一行解决了我的问题。我假设解析器随后会退出该 TAG 并继续处理其余的 TAG。希望对你有所帮助。

好的,我刚刚在尝试解析科学美国人技术 RSS 提要时遇到了类似的问题。在 Android 开发人员文档中,readFeed() 方法如下所示:

private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
List entries = new ArrayList();

parser.require(XmlPullParser.START_TAG, ns, "feed");
while (parser.next() != XmlPullParser.END_TAG) {
    if (parser.getEventType() != XmlPullParser.START_TAG) {
        continue;
    }
    String name = parser.getName();
    // Starts by looking for the entry tag
    if (name.equals("entry")) {
        entries.add(readEntry(parser));
    } else {
        skip(parser);
    }
}
return entries;}

我的代码只发回 RSS 提要中的第一项的原因是(在记录 "entries.add(readEntry(parser));" 行中的条目后,它到达 RSS 条目条目的末尾并命中该行:

while (parser.next() != XmlPullParser.END_TAG) {

这实际上终止了 RSS 解析,然后您点击 "return entries;" 行,returns 条目 ArrayList 中有一项。

要修复它(至少它对我有用),只需将 "END_TAG" 修改为 "END_DOCUMENT" 即可完美运行。

while (parser.next() != XmlPullParser.END_DOCUMENT) {

我只是希望这对某人有所帮助,因为我整天都在为这个问题烦恼:-)祝你 XML 解析好运。