0

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

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

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

我已在此处将 logcat 输出发布到 pastebin

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

非常感谢任何帮助

谢谢

4

3 回答 3

1

我在这里工作时遇到了几乎相同的问题。我试图解析 rss 提要 xml 文件中的 xml。同样的事情发生了,我只得到了第一个“项目”。我还在考虑将 xml 转换为 json 并更容易地将其作为 json 处理。但我终于设法让它在没有转换为 json 的情况下使用 xml 文件为我工作。这里出了问题的是没有 END_TAG 的链接,就像我的情况一样,这导致了问题:

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

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

<media:thumbnail  />

在遵循这个谷歌文档页面https://developer.android.com/training/basics/network-ops/xml.html之后,我通过获取“url”属性并调用方法解决了这个问题获取“url”属性值后直接“skip(parser)”。那一行为我解决了这个问题。我假设解析器然后退出该 TAG 并继续其余的。希望它有所帮助。

于 2017-01-28T14:07:54.207 回答
1

好的,我在尝试解析美国科学技术 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 解析,然后您点击“返回条目”;返回条目 ArrayList 的行,其中包含一项。

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

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

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

于 2017-05-30T21:39:15.960 回答
0

我从来没有设法完成这项工作。相反,我将 XML 字符串转换为 JSON 并对其进行操作(这让我感觉更舒服)。

这个答案是我如何将它从 XML 转换为 JSON。

于 2015-03-14T16:16:55.127 回答