我使用com.sun.syndication apis来解析我最终需要在我的应用程序中使用的RSS源。我面临的问题是对于某些RSS,例如喜欢
http://rss.news.yahoo.com/rss/mostviewed
如果我们有一些带有某个值的标记,则以下代码将返回null作为源。
URL url = new URL("http://rss.news.yahoo.com/rss/mostviewed");
XmlReader reader = null;
try {
reader = new XmlReader(url);
SyndFeed feed = new SyndFeedInput().build(reader);
System.out.println("Feed Title: "+ feed.getTitle());
for (Iterator<SyndEntry> i =feed.getEntries().iterator(); i.hasNext();) {
SyndEntry entry = i.next();
System.out.println("entry.getSource():"+entry.getSource());
}
有人对我在这里可能缺少的东西有任何想法
答案 0 :(得分:1)
这似乎没有开箱即用,因为RSS 2.0的转换器忽略了(可选的)源元素。
您可以编写自己的转换器,并从项目的源属性中自行设置源。我将值(您提供的“AP”)放入作者字段:
public class MyConverterForRSS20 extends ConverterForRSS20 {
public MyConverterForRSS20() {
this("rss_2.0");
}
protected MyConverterForRSS20(String type) {
super(type);
}
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
Source source = item.getSource();
if (source != null) {
SyndFeed syndFeed = new SyndFeedImpl();
syndFeed.setLink(source.getUrl());
syndFeed.setAuthor(source.getValue());
syndEntry.setSource(syndFeed);
}
return syndEntry;
}
}
幸运的是,通过更改rome.properties
文件并设置MyConverterForRSS20
而不是com.sun.syndication.feed.synd.impl.ConverterForRSS20
(文件的最后一行),可以轻松地将自定义转换器插入罗马:
# Feed Conversor implementation classes
#
Converter.classes=com.sun.syndication.feed.synd.impl.ConverterForAtom10 \
com.sun.syndication.feed.synd.impl.ConverterForAtom03 \
com.sun.syndication.feed.synd.impl.ConverterForRSS090 \
com.sun.syndication.feed.synd.impl.ConverterForRSS091Netscape \
com.sun.syndication.feed.synd.impl.ConverterForRSS091Userland \
com.sun.syndication.feed.synd.impl.ConverterForRSS092 \
com.sun.syndication.feed.synd.impl.ConverterForRSS093 \
com.sun.syndication.feed.synd.impl.ConverterForRSS094 \
com.sun.syndication.feed.synd.impl.ConverterForRSS10 \
MyConverterForRSS20