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 解析好运。
我正在创建一个小应用程序,用于在 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 解析好运。