XmlPullPaser 在 Android 中为 Rss Reader 跳过一个标签
XmlPullPaser skip one Tag for Rss Reader in Android
我正在为 rss 提要 wordpress 开发 reader。
问题是它正在拾取头像的图像,不应该。
public class RssParser {
public List<RssItem> parse(InputStream inputStream) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, "UTF-8");
parser.nextTag();
return readFeed(parser);
} finally {
inputStream.close();
}
}
private List<RssItem> readFeed(XmlPullParser parser) throws IOException, XmlPullParserException {
List<RssItem> items = new ArrayList<>();
boolean insideItem = false;
String imageUrl = null;
parser.require(XmlPullParser.START_TAG, null, "rss");
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("item")) {
insideItem = true;
} else if (name.equals("media:content")) {
if (insideItem)
imageUrl = readImage(parser);
}
if (imageUrl != null) {
RssItem item = new RssItem(imageUrl);
items.add(item);
imageUrl = null;
}
}
return items;
}
private String readImage(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, null, "media:content");
return parser.getAttributeValue(null, "url");
}
}
我想知道如何跳过这个 "media: content" 包含 gravatar 图片。
此处示例作为我的 rss 代码的一部分。
<media:content url="https://1.gravatar.com/avatar/7d261705b92edb50eaca05ed63ca453e?s=96&d=identicon&r=G" medium="image">
<media:title type="html">renangueiros</media:title>
</media:content>
<media:content url="https://correntesproinfo.files.wordpress.com/2015/08/duvidas.jpg?w=300" medium="image">
<media:title type="html">duvidas</media:title>
</media:content>
我希望我的代码跳过包含 gravatar 图像的第一个标签 media:content
,并且仅 return 包含我要使用的图像的 url 第二个标签。
如果头像的url是以https://1.gravatar.com/avatar/
开头的,那么你可以使用下面的代码:
if (name.equals("item")) {
insideItem = true;
} else if (name.equals("media:content")) {
if (insideItem) {
imageUrl = readImage(parser);
if ((imageUrl != null) && ! imageUrl.startsWith("https://1.gravatar.com/avatar/") {
RssItem item = new RssItem(imageUrl);
items.add(item);
}
}
}
另外,请注意您的 insideItem
变量未重置为 false。您可能希望检查 <item>
的 END_TAG
并执行此操作。
我正在为 rss 提要 wordpress 开发 reader。 问题是它正在拾取头像的图像,不应该。
public class RssParser {
public List<RssItem> parse(InputStream inputStream) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, "UTF-8");
parser.nextTag();
return readFeed(parser);
} finally {
inputStream.close();
}
}
private List<RssItem> readFeed(XmlPullParser parser) throws IOException, XmlPullParserException {
List<RssItem> items = new ArrayList<>();
boolean insideItem = false;
String imageUrl = null;
parser.require(XmlPullParser.START_TAG, null, "rss");
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("item")) {
insideItem = true;
} else if (name.equals("media:content")) {
if (insideItem)
imageUrl = readImage(parser);
}
if (imageUrl != null) {
RssItem item = new RssItem(imageUrl);
items.add(item);
imageUrl = null;
}
}
return items;
}
private String readImage(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, null, "media:content");
return parser.getAttributeValue(null, "url");
}
}
我想知道如何跳过这个 "media: content" 包含 gravatar 图片。
此处示例作为我的 rss 代码的一部分。
<media:content url="https://1.gravatar.com/avatar/7d261705b92edb50eaca05ed63ca453e?s=96&d=identicon&r=G" medium="image">
<media:title type="html">renangueiros</media:title>
</media:content>
<media:content url="https://correntesproinfo.files.wordpress.com/2015/08/duvidas.jpg?w=300" medium="image">
<media:title type="html">duvidas</media:title>
</media:content>
我希望我的代码跳过包含 gravatar 图像的第一个标签 media:content
,并且仅 return 包含我要使用的图像的 url 第二个标签。
如果头像的url是以https://1.gravatar.com/avatar/
开头的,那么你可以使用下面的代码:
if (name.equals("item")) {
insideItem = true;
} else if (name.equals("media:content")) {
if (insideItem) {
imageUrl = readImage(parser);
if ((imageUrl != null) && ! imageUrl.startsWith("https://1.gravatar.com/avatar/") {
RssItem item = new RssItem(imageUrl);
items.add(item);
}
}
}
另外,请注意您的 insideItem
变量未重置为 false。您可能希望检查 <item>
的 END_TAG
并执行此操作。