`
guohui_fz
  • 浏览: 56223 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

目前在搞个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 够用就好,不过要自己修改和编译源码。

分享到:
评论
2 楼 geek87 2009-10-21  
太有用了
1 楼 geek87 2009-10-21  
谢谢LZ太用了。。我用 rsslib4j 其它的兼容太差了。解析日期,有问题没法用,

相关推荐

    java实现rss的发布和订阅

    在Java中实现RSS的发布和订阅,需要理解RSS的结构以及如何使用Java处理XML。 RSS的核心结构包括频道(Channel)和条目(Item)。频道包含有关整个源的信息,如标题、描述和链接,而条目则代表单独的新闻或文章,每...

    RSS.rar_RSS_Rss browser_java rss_rss java_rss阅读器

    总之,这个“RSS_Rss browser_java rss_rss java_rss阅读器”项目涵盖了RSS订阅的基本原理,Java XML解析技术,以及GUI编程的实践。通过深入理解这些知识点,不仅可以帮助你理解RSS阅读器的工作机制,还能够提升你的...

    javaRSS.zip

    Java RSS阅读器是一款基于Java开发的课程大作业项目,它主要功能是解析RSS(Really Simple Syndication) feeds,根据用户提供的URL,能够定向地读取RSS源中的新闻标题、摘要、发布日期等信息。RSS是一种内容聚合...

    rss(JAVA).zip_ rss_RSS_RSS Reader_RSS java downlo_java 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

    标题中的“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.rar_RSS_java rss”表明这是一个关于RSS(Really Simple Syndication)技术的Java实现,而RAR是一种常见的文件压缩格式,用于打包多个文件。描述提到,这个阅读器主要针对的是新浪的RSS源,意味着它能...

    基于Java的优秀RSS阅读器

    【Java RSS阅读器】是一种利用Java编程语言开发的软件应用,专门用于订阅和管理RSS(Really Simple Syndication)源。RSS是一种数据格式,允许用户在不打开网站的情况下获取最新的新闻、博客更新或其他在线内容。...

    JAVA 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阅读器 (含联网解析功能)

    java RSS 阅读器,可以从网站获取并解析Xml文件,以及解析和保存XML文件

    java实现的Rss

    Java实现的RSS是一种使用Java编程语言来创建、解析和消费RSS(Really Simple Syndication) feed的技术。RSS是一种基于XML的格式,常用于新闻聚合、博客更新和其他在线内容的发布,使得用户可以通过RSS阅读器轻松...

    Java Swing RSS阅读器

    基于JAVA SWING的RSS阅读器,使用JDOM解析本地XML文件

    Java 实现Rss阅读器

    Java实现的RSS阅读器是一个基于Java编程语言的软件应用,主要功能是解析并展示RSS(Really Simple Syndication)源中的内容。RSS是一种XML格式,用于发布新闻、博客和其他定期更新的网络内容。RSS阅读器可以帮助用户...

    Java开发的RSS项目

    【Java开发的RSS项目】是将RSS(Really Simple Syndication)功能集成到现有网站中的一个实践案例。RSS是一种用于发布和订阅内容的XML格式,它允许用户通过聚合器轻松地跟踪多个网站的更新,而无需逐个访问这些网站...

    NS.rar_java rss_rss java_交易 java_拍卖_电子商务

    “java_rss_rss_java”标签表明该系统集成了RSS(Really Simple Syndication)功能。RSS是一种XML格式,用于发布和订阅新闻、博客更新或其他定期内容。在电子商务环境中,RSS可以让用户订阅商品更新、特价促销或拍卖...

    RSS订阅器(JAVA)

    这个JAVA实现的RSS订阅器利用了Spring MVC框架,提供了一个高效且灵活的解决方案来获取和显示RSS feed内容。Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,它采用Model-View-Controller(MVC)设计...

    java实现RSS阅读器

    本项目是一个用Java语言实现的RSS阅读器,具有用户界面(UI),方便用户交互。下面将详细阐述Java开发RSS阅读器的相关知识点。 1. **Java基础知识**: - **Java编程语言**:Java是一种面向对象的、跨平台的编程...

    基于Java实现的RSS阅读器

    在这个项目中,我们基于Java语言实现了RSS阅读器,它具备了基本的RSS源加载和更新检测功能,使得用户能够方便地跟踪关注的网站动态。 首先,我们要理解RSS的本质。RSS文件通常以.xml格式存在,包含一系列频道...

    java开发的rss系统源码

    Java开发的RSS系统源码是一个基于Java编程语言构建的新闻聚合和发布系统,它主要用于抓取、处理和展示RSS(Really Simple Syndication)格式的新闻 feed。RSS是一种XML格式,用于发布经常更新的内容,如博客文章、...

    RSS阅读器java

    【RSS阅读器java】是一个基于Java编程语言开发的软件项目,其主要功能是解析和展示RSS(Really Simple Syndication)源中的内容。RSS是一种用于发布和订阅新闻、博客和其他在线内容的标准格式,使得用户可以方便地...

    RSS是RSS的jar包

    在这个压缩包中,包含了一系列与Java实现RSS相关的库和源代码,这将帮助开发者构建能够处理RSS feed的应用程序。 1. **RSSJAR**: 这可能是一个包含RSS处理核心功能的Java类库,可能包括解析、创建和管理RSS feed的...

Global site tag (gtag.js) - Google Analytics