目前在搞个RSS的工具,gg到这个,顺便做个笔记
目标是做一个简单的portlet,每次读取新浪的RSS站点显示最新的新闻条目。
花了一个下午,去sourceforge和
google 上搜索 opensource 的 java rss
lib,还真有不少(顺便提一下,sourceforget的搜索真的很烂)。简单过滤以后,觉得以下三个类库比较有搞头。Rome
、rssutils和rsslib4j。具体的评测如下:
一. 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("<a
href=" + entry.getLink() + ">" + entry.getTitle() + "</a>[" +
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。
二. 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("<a href=" + item.getLink() + "</a>" + 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 平台中的增补字符
一文。
三. 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。为什么不喜欢 jdom呢,因为它api 老变,还很绝,搞得不兼容。
rssutils:
优 - 1)代码设计精妙,值得学习。2)附带 taglib 实现,直接可在 jsp 中应用。
劣 - 1)没有源码。 2)兼容性有待加强。 3)功能较弱,只能用来解析RSS,没有聚合和构造RSS功能。
rsslib4j:
优 - 1)简单有效,体积小。2)兼容性不错。
劣 - 1)有小bug。2)功能较弱,只能用来解析RSS,没有聚合和构造RSS功能。
编辑选择: rsslib4j
我只用来读读新浪新闻,rsslib4j 够用就好,不过要自己修改和编译源码。
分享到:
相关推荐
在Java中实现RSS的发布和订阅,需要理解RSS的结构以及如何使用Java处理XML。 RSS的核心结构包括频道(Channel)和条目(Item)。频道包含有关整个源的信息,如标题、描述和链接,而条目则代表单独的新闻或文章,每...
总之,这个“RSS_Rss browser_java rss_rss java_rss阅读器”项目涵盖了RSS订阅的基本原理,Java XML解析技术,以及GUI编程的实践。通过深入理解这些知识点,不仅可以帮助你理解RSS阅读器的工作机制,还能够提升你的...
Java RSS阅读器是一款基于Java开发的课程大作业项目,它主要功能是解析RSS(Really Simple Syndication) feeds,根据用户提供的URL,能够定向地读取RSS源中的新闻标题、摘要、发布日期等信息。RSS是一种内容聚合...
标题中的"rss(JAVA).zip_ rss_RSS_RSS Reader_RSS java downlo_java rss"揭示了这个压缩包是一个使用Java语言开发的RSS阅读器项目。RSS(Really Simple Syndication)是一种数据格式,用于发布新闻、博客和其他定期...
标题中的“RSS.zip_Rome.jar_java r_java rss_rss feed jar_rss java”表明这是一个与Java RSS处理相关的资源包,其中包含了Rome库的jar文件和其他可能的Java代码示例。Rome是Java社区中一个流行的RSS和Atom聚合库,...
标题中的“RSS.rar_RSS_java rss”表明这是一个关于RSS(Really Simple Syndication)技术的Java实现,而RAR是一种常见的文件压缩格式,用于打包多个文件。描述提到,这个阅读器主要针对的是新浪的RSS源,意味着它能...
【Java RSS阅读器】是一种利用Java编程语言开发的软件应用,专门用于订阅和管理RSS(Really Simple Syndication)源。RSS是一种数据格式,允许用户在不打开网站的情况下获取最新的新闻、博客更新或其他在线内容。...
import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedInput; ...
java RSS 阅读器,可以从网站获取并解析Xml文件,以及解析和保存XML文件
Java实现的RSS是一种使用Java编程语言来创建、解析和消费RSS(Really Simple Syndication) feed的技术。RSS是一种基于XML的格式,常用于新闻聚合、博客更新和其他在线内容的发布,使得用户可以通过RSS阅读器轻松...
基于JAVA SWING的RSS阅读器,使用JDOM解析本地XML文件
Java实现的RSS阅读器是一个基于Java编程语言的软件应用,主要功能是解析并展示RSS(Really Simple Syndication)源中的内容。RSS是一种XML格式,用于发布新闻、博客和其他定期更新的网络内容。RSS阅读器可以帮助用户...
【Java开发的RSS项目】是将RSS(Really Simple Syndication)功能集成到现有网站中的一个实践案例。RSS是一种用于发布和订阅内容的XML格式,它允许用户通过聚合器轻松地跟踪多个网站的更新,而无需逐个访问这些网站...
“java_rss_rss_java”标签表明该系统集成了RSS(Really Simple Syndication)功能。RSS是一种XML格式,用于发布和订阅新闻、博客更新或其他定期内容。在电子商务环境中,RSS可以让用户订阅商品更新、特价促销或拍卖...
这个JAVA实现的RSS订阅器利用了Spring MVC框架,提供了一个高效且灵活的解决方案来获取和显示RSS feed内容。Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,它采用Model-View-Controller(MVC)设计...
本项目是一个用Java语言实现的RSS阅读器,具有用户界面(UI),方便用户交互。下面将详细阐述Java开发RSS阅读器的相关知识点。 1. **Java基础知识**: - **Java编程语言**:Java是一种面向对象的、跨平台的编程...
在这个项目中,我们基于Java语言实现了RSS阅读器,它具备了基本的RSS源加载和更新检测功能,使得用户能够方便地跟踪关注的网站动态。 首先,我们要理解RSS的本质。RSS文件通常以.xml格式存在,包含一系列频道...
Java开发的RSS系统源码是一个基于Java编程语言构建的新闻聚合和发布系统,它主要用于抓取、处理和展示RSS(Really Simple Syndication)格式的新闻 feed。RSS是一种XML格式,用于发布经常更新的内容,如博客文章、...
【RSS阅读器java】是一个基于Java编程语言开发的软件项目,其主要功能是解析和展示RSS(Really Simple Syndication)源中的内容。RSS是一种用于发布和订阅新闻、博客和其他在线内容的标准格式,使得用户可以方便地...
在这个压缩包中,包含了一系列与Java实现RSS相关的库和源代码,这将帮助开发者构建能够处理RSS feed的应用程序。 1. **RSSJAR**: 这可能是一个包含RSS处理核心功能的Java类库,可能包括解析、创建和管理RSS feed的...