RSS简介:
RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站,例如Blog。
一段项目的介绍可能包含新闻的全部介绍等。或者仅仅是额外的内容或者简短的介绍。这些项目的链接通常都能链接到全部的内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件(例如SharpReader,NewzCrawler、FeedDemon),在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。
网站提供RSS输出,有利于让用户发现网站内容的更新。
[NextPage]
相对于BLOG来说,RSS的知名度相应会低很多,而且至今还没有一个非常贴切的中文词汇,也许以后无需中文名,大家都习惯于直接叫RSS了。RSS之所以同BLOG一样会被认为是热门词汇的一个原因,个人推测,应该是许多分析人士认识到RSS将要对互联网内容的浏览方法所产生的巨大影响。
RSS是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个RSS文件后,这个RSS Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用。 为了进一步介绍RSS的有关背景知识,下面摘录了2003年10月平文胜为时代营销撰写的有关RSS的介绍文章。仅供参考。网上此类介绍文章也不少,有兴趣的请到网上检索更多信息。
RSS简介 (时代营销 平文胜 2003-10-10)
RSS是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用。RSS应用在国外已经非常普遍,从个人博客(Blog)栏目、企业站点到世界级的门户都提供基于RSS的服务,如IBM公司站点的中文新闻RSS http://www.ibm.com/news/cn/zh/index.rss ,YAHOO站点的http://news.yahoo.com/rss ,微软MSDN站点的http://msdn.microsoft.com/aboutmsdn/rss.asp 等等。
1、 RSS的历史
那么RSS究竟代表什么呢?比较普遍的有两种说法,一种是“Rich Site Summary”或“RDF Site Summary”,另一种是“Really Simple Syndication”,之所以有这些分歧,需要从RSS发展的历史说起。
最初的0.90版本RSS是由Netscape公司设计的,目的是用来建立一个整合了各主要新闻站点内容的门户,但是0.90版本的RSS规范过于复杂,而一个简化的RSS 0.91版本也随着Netscape公司对该项目的放弃而于2000年暂停。
不久,一家专门从事博客写作软件开发的公司UserLand接手了RSS 0.91版本的发展,并把它作为其博客写作软件的基础功能之一继续开发,逐步推出了0.92、0.93和0.94版本。随着网络博客的流行,RSS作为一种基本的功能也被越来越多的网站和博客软件支持。
在UserLand公司接手并不断开发RSS的同时,很多的专业人士认识到需要通过一个第三方、非商业的组织,把RSS发展成为一个通用的规范,并进一步标准化。于是2001年一个联合小组在0.90版本RSS的开发原则下,以W3C新一代的语义网技术RDF(Resource Description Framework)为基础,对RSS进行了重新定义,发布RSS1.0,并将RSS定义为“RDF Site Summary”。但是这项工作没有与UserLand公司进行有效的沟通,UserLand公司也不承认RSS 1.0的有效性,并坚持按照自己的设想进一步开发出RSS的后续版本,到2002年9月发布了最新版本RSS 2.0,UserLand公司将RSS定义为“Really Simple Syndication”。
目前RSS已经分化为RSS 0.9x/2.0和RSS 1.0两个阵营,由于分歧的存在和RSS 0.9x/2.0的广泛应用现状,RSS 1.0还没有成为标准化组织的真正标准。
2、 RSS目前的版本和推荐
到目前为止,RSS共有七种版本,推荐使用的是RSS 1.0和RSS 2.0,对于一些基本的站点同步,也可以选用RSS 0.91。
3、 RSS的语法介绍
一个RSS文件就是一段规范的XML数据,该文件一般以rss,xml或者rdf作为后缀。下面我们选择http://msdn.microsoft.com/visualc/rss.xml中的一部分作为例子简单说(略)
4、 RSS的联合(Syndication)和聚合(Aggregation)
发布一个RSS文件(一般称为RSS Feed)后,这个RSS Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用,如PDA、手机、邮件列表等。而且一个网站联盟(比如专门讨论旅游的网站系列)也能通过互相调用彼此的RSS Feed,自动的显示网站联盟中其他站点上的最新信息,这就叫着RSS的联合。这种联合就导致一个站点的内容更新越及时、RSS Feed被调用的越多,该站点的知名度就会越高,从而形成一种良性循环。
而所谓RSS聚合,就是通过软件工具的方法从网络上搜集各种RSS Feed并在一个界面中提供给读者进行阅读。这些软件可以是在线的WEB工具,如http://my.netscape.com ,http://my.userland.com , http://www.xmltree.com ,http://www.moreover.com ,http://www.oreillynet.com/meerkat 等,也可以是下载到客户端安装的工具
5、 RSS的未来发展
随着越来越多的站点对RSS的支持,RSS已经成为目前最成功的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。相信很快我们就会看到大量基于RSS的专业门户、聚合站点和更精确的搜索引擎。
RSS类库:
1. Rome
Rome 是 java.net 上的一个开源项目,现在的版本是0.5。为什么叫Rome呢,按它的介绍上的说法,有个“条条大路通罗马”的意思,有些RSS的意味。Rome可能是 sun 公司从自己某个子项目中抽离出来的,package和类的命名就象j2sdk一样感觉规范。功能上支持RSS的所有版本及 Atom 0.3(Atom是和RSS类似的一种内容聚合的方式)。Rome 本身是提供API和功能实现,其下独立出一个 rome-fetcher 项目,专门用来读取RSS内容。正和我意啊。
参照 fetcher 上的范例,解析 RSS 相当简单,代码片断如下:
FeedFetcher fetcher = new HttpURLFeedFetcher();
SyndFeed feed = fetcher.retrieveFeed(feedUrl);
System.out.println(feedUrl + " has a title: " + new String(feed.getTitle().getBytes("iso8859-1"), "utf-8") + " and contains " + feed.getEntries().size() + " entries.");
for (Iterator iter = feed.getEntries().iterator(); iter.hasNext(); ) {
SyndEntry entry = (SyndEntry) iter.next();
System.out.println("" + entry.getTitle() + "[" + entry.getPublishedDate() + "]");
}
为什么用 new String(feed.getTitle().getBytes("iso8859-1"), "utf-8") 进行转码,是因为Rome来解析 新浪新闻 RSS的时候试图从 URLConnection 的 header 中得到编码信息,否则总是用 iso8859-1。而新浪的RSS response header 中不包含编码信息,所以要做一番转码。另外还有就是 entry.getPubDate() 也将返回null,因为Rome 用多种pattern 去试图解析时间信息,新浪的时间格式还是符合RFC822的,但是Rome 使用SimpleDateFormat 来解析时间,它忘记了一点,就是 SimpleDateFormat的解析是关联于 Locale 的,所以由于我本地locale是China,SimpleDateFormat的parse方法解析不出英文的时间字符。以上代码前加 Locale.setDefault(Locale.Englisth) 可以搞定,但总觉得不爽。
如果也不想转码的话,Rome 还提供了一个 XmlReader 的类,通过分析 header 和 xml 内容推断 encoding,修改 HttpURLFeedFetcher 的源码 :
// 改变 InputStreamReader , 换用 XmlReader
//InputStreamReader reader = new InputStreamReader(is, ResponseHandler.getCharacterEncoding(connection));
XmlReader reader = new XmlReader(connection);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(reader);
那么中文不用转码也能正确显示了,不过修改源码后我再解析 百度新闻 RSS 的时候,底层的JDOM却会抱错说xml 格式不正确。也许Rome的开发者也遇到过这样的问题,所以才没有使用 XmlReader。
2. rssutils
它是一个工具包,sun 的 develope站点上有文章 RSS Utilities: A Tutorial 专门介绍用taglib 显示RSS内容,附带的可以下载这个工具包,但我从网上搜索不到它的出处,自然也无法看到它的源码。但从反编译的代码来看,也是sun公司内部高手所做,设计精巧,代码简练。实现一个handler,用sax的方式解析xml内容,handler内部用反射和javabean的机制构造RSS元素对象并赋值。代码片断如下:
RssParser parser = new RssParserImpl();
Rss rss = parser.parse(new URL(url));
System.out.println(rss.getChannel().getTitle());
for (Iterator iter = rss.getChannel().getItems().iterator(); iter.hasNext();) {
Item item = (Item)iter.next();
System.out.println("" + item.getTitle() + " " + item.getPubDate());
}
如上所示,代码也是相当简单,没有转码的需求,时间也正确显示(因为根本没做分析,当字符串直接返回)。但是该工具包并非真正对外公布,代码中有些不严谨的地方,如System.out的输出,很不爽。而且如果 RSS 的 xml内容如果缺少部分不常用元素 ,它也会printStackTrace一大串,服了它了。另外还有一个大问题,就是当我用它解析 百度新闻 的时候,直接就报错:org.xml.sax.SAXParseException: 字符转换错误:“Unconvertible UTF-8 character beginning with 0xb0”。网上查了查,可能是 java 修改过的 UTF-8 和标准 UTF-8 些微不兼容导致。详情参看 Java 平台中的增补字符 一文。
3. rsslib4j
rsslib4j 是 sourceforget 上的项目,主页是 http://sourceforge.net/projects/rsslib4j,现在最新的版本是0.2,才0.2,可是开发状态却已经是稳定产品化了。同样支持所有RSS版本。
rsslib4j 解析 RSS 的方式和 rssutils 一样,我看了看源码,设计比较简单,代码可读性一般,大量使用if。代码片断如下:
RSSHandler hand = new RSSHandler();
RSSParser.parseXmlFile(new URL(url), hand, false);
RSSChannel ch = hand.getRSSChannel();
System.out.println(ch.toString());
LinkedList lst = hand.getRSSChannel().getItems();
for (int i = 0; i < lst.size(); i++) {
RSSItem itm = (RSSItem) lst.get(i);
System.out.println(itm.toString());
}
看起来也是相当清晰易懂,执行结果也和rssutils一样,不过用它来解析 百度新闻 却不会出现 rssutils 的utf-8编码错误,真是奇怪,两者都是调JAXP的 SAXParser 。不过它的代码也有bug,不能解析出 channel 的一些信息,查看源码,有点简单逻辑错误,修正后解决。想写封email给项目开发者可惜英文不行,通过cvs去commit一下也嫌麻烦,作罢。
总结
Rome:
优 - 1)可扩展性好,有前途。2)功能强大,除了用来解析RSS,还可以聚合和构造RSS。
劣 - 1)兼容性待加强,2)绑定jdom。
rssutils:
优 - 1)代码设计精妙,值得学习。2)附带 taglib 实现,直接可在 jsp 中应用。
劣 - 1)没有源码。 2)兼容性有待加强。 3)功能较弱,只能用来解析RSS,没有聚合和构造RSS功能。
rsslib4j:
优 - 1)简单有效,体积小。2)兼容性不错。
劣 - 1)有小bug。2)功能较弱,只能用来解析RSS,没有聚合和构造RSS功能。