ROME读取RSS

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 对象。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值