Rome是一个用来操作RSS的java开源库,它可以用来读取和生成RSS。支持的RSS看版本从0.90到2.0,同时也支持Atom 0.3和Atom1.0。
如果只是用Rome读取RSS或Atom源是比较简单的,最简单的情况只要几行代码就可以了。
官方WIKI的代码
URL feedUrl = new URL(".....");
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new
inputStreamReader(feedUrl.openStream()));
这样就通过Rss或Atom的地址创建了SyndFeed对象,通过SyndFeed,我们可以获取Rss源返回的信息,如SyndFeed的getEntries方法可以返回一个List<SyndEntry>列表,用以表示Rss中的每一项内容。如:
List<SyndEntry> entries = feed.getEntries();
for (SyndEntry entry : entries) {
String title=entry.getTitle();
Date publishDate=entry.getPublishedDate();
String content=entry.getDescription().getValue();
...
}
基本上这样就可以简单的用来读取RSS和Atom了,不过有一些RSS的pubshedDate的格式比较特殊,并不在ROME的默认的支持的日期格式中。com.sun.syndication.io.impl.DateParser定义一些默认的日期格式,这可以用来満足大部分需要。
目前我遇到过两种不被支持的日期格式
1、可以用SimpleDateFormat来解悉的
拿百度空间做例子,它返回的日期格式是
<pubDate>2008-07-25 15:59</pubDate>
这个解决起来比较简单。因为ROME支持自定义的日期格式,所以只要在工程下面创建一个rome.properties文件,并在下面加上一行
datetime.extra.masks=yyyy-MM-dd hh:mm
就可以了。Rome中的DateParser类在尝试了所有的默认的日期格式以后发现还是不能解悉,就会去尝试rome.properties这文件中的的日期格式。因为DateParser最终也是通过SimpleDateFormat来解释日期的,所以自定义的日期格式应该是能被java中的SimpleDateFormat接受的才可以
2、不可以用SimpleDateFormat来解悉的
拿新浪来做例子,它返回的日期格式如下:
<pubDate>Mon, 21 Jul 2008 18:53:00 GMT+8</pubDate>
当用SimpleDateFormat来解悉这个日期时,最接近的pattern是EEE, dd MMM yyyy HH:mm:ss z
但这个是不能被解悉的,如下代码
String sDate = "Mon, 21 Jul 2008 18:53:00 GMT+8";
SimpleDateFormat df = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss z",Locale.US);
ParsePosition pp = new ParsePosition(0);
Date d = df.parse(sDate, pp);
if (pp.getIndex() != sDate.length()) {
d = null;
}
System.out.println(d);
最后显示的是null,为了符合这个标准,要将 Mon, 21 Jul 2008 18:53:00 GMT+8这个改为 Mon, 21 Jul 2008 18:53:00 GMT+08:00才可以,关于TimeZone的转换,可通过
TimeZone.getTimeZone(“GMT+8”).getID()这个方法,这样返回的字符串为GMT+08:00。
由于无法通过rome.properties方法来解决,目前我只想到了一个比较笨的方法(希望以后可以找到更好的方法),写了一个WireFeedInput的子类,并覆盖了build方法,
public WireFeed build(Reader reader) throws IllegalArgumentException, FeedException {
SAXBuilder saxBuilder = createSAXBuilder();
try {
if (getXmlHealerOn()) {
reader = new XmlFixerReader(reader);
}
Document document = saxBuilder.build(reader);
//处理日期将换
return build(document);
}
}
在ROME的xml文件解悉为Document之后,遍历Doument的元素,然后将日期元素的值进行转换。
使用时,如果是新浪的rss,则
WireFeedInput wfi = new CustomWireFeedInput(false);
WireFeed input = wfi.build(new XmlReader(url));
feed = new SyndFeedImpl(input);
这样创建WireFeed 对象。