我的目標(biāo)是做一個(gè)簡(jiǎn)單的portlet,每次讀取新浪的RSS站點(diǎn)顯示最新的新聞條目。
花了一個(gè)下午,去sourceforge和google 上搜索 opensource 的 java rss lib,還真有不少(順便提一下,sourceforget的搜索真的很爛)。簡(jiǎn)單過濾以后,覺得以下三個(gè)類庫比較有搞頭。Rome 、rssutils和rsslib4j。具體的評(píng)測(cè)如下: 一. Rome Rome 是 java.net 上的一個(gè)開源項(xiàng)目,現(xiàn)在的版本是0.5。為什么叫Rome呢,按它的介紹上的說法,有個(gè)“條條大路通羅馬”的意思,有些RSS的意味。Rome可能是 sun 公司從自己某個(gè)子項(xiàng)目中抽離出來的,package和類的命名就象j2sdk一樣感覺規(guī)范。功能上支持RSS的所有版本及 Atom 0.3(Atom是和RSS類似的一種內(nèi)容聚合的方式)。Rome 本身是提供API和功能實(shí)現(xiàn),其下獨(dú)立出一個(gè) rome-fetcher 項(xiàng)目,專門用來讀取RSS內(nèi)容。正和我意啊。 參照 fetcher 上的范例,解析 RSS 相當(dāng)簡(jiǎn)單,代碼片斷如下: FeedFetcher fetcher = new HttpURLFeedFetcher(); 如果也不想轉(zhuǎn)碼的話,Rome 還提供了一個(gè) XmlReader 的類,通過分析 header 和 xml 內(nèi)容推斷 encoding,修改 HttpURLFeedFetcher 的源碼 : // 改變 InputStreamReader , 換用 XmlReader 那么中文不用轉(zhuǎn)碼也能正確顯示了,不過修改源碼后我再解析 百度新聞 RSS 的時(shí)候,底層的JDOM卻會(huì)抱錯(cuò)說xml 格式不正確。也許Rome的開發(fā)者也遇到過這樣的問題,所以才沒有使用 XmlReader。 二. rssutils 它是一個(gè)工具包,sun 的 develope站點(diǎn)上有文章 RSS Utilities: A Tutorial 專門介紹用taglib 顯示RSS內(nèi)容,附帶的可以下載這個(gè)工具包,但我從網(wǎng)上搜索不到它的出處,自然也無法看到它的源碼。但從反編譯的代碼來看,也是sun公司內(nèi)部高手所做,設(shè)計(jì)精巧,代碼簡(jiǎn)練。實(shí)現(xiàn)一個(gè)handler,用sax的方式解析xml內(nèi)容,handler內(nèi)部用反射和javabean的機(jī)制構(gòu)造RSS元素對(duì)象并賦值。代碼片斷如下: RssParser parser = new RssParserImpl(); 如上所示,代碼也是相當(dāng)簡(jiǎn)單,沒有轉(zhuǎn)碼的需求,時(shí)間也正確顯示(因?yàn)楦緵]做分析,當(dāng)字符串直接返回)。但是該工具包并非真正對(duì)外公布,代碼中有些不嚴(yán)謹(jǐn)?shù)牡胤?,如System.out的輸出,很不爽。而且如果 RSS 的 xml內(nèi)容如果缺少部分不常用元素 ,它也會(huì)printStackTrace一大串,服了它了。另外還有一個(gè)大問題,就是當(dāng)我用它解析 百度新聞 的時(shí)候,直接就報(bào)錯(cuò):org.xml.sax.SAXParseException: 字符轉(zhuǎn)換錯(cuò)誤:“Unconvertible UTF-8 character beginning with 0xb0”。網(wǎng)上查了查,可能是 java 修改過的 UTF-8 和標(biāo)準(zhǔn) UTF-8 些微不兼容導(dǎo)致。詳情參看 Java 平臺(tái)中的增補(bǔ)字符 一文。 三. rsslib4j rsslib4j 是 sourceforget 上的項(xiàng)目,主頁是 http:///projects/rsslib4j,現(xiàn)在最新的版本是0.2,才0.2,可是開發(fā)狀態(tài)卻已經(jīng)是穩(wěn)定產(chǎn)品化了。同樣支持所有RSS版本。 rsslib4j 解析 RSS 的方式和 rssutils 一樣,我看了看源碼,設(shè)計(jì)比較簡(jiǎn)單,代碼可讀性一般,大量使用if。代碼片斷如下: RSSHandler hand = new RSSHandler(); 看起來也是相當(dāng)清晰易懂,執(zhí)行結(jié)果也和rssutils一樣,不過用它來解析 百度新聞 卻不會(huì)出現(xiàn) rssutils 的utf-8編碼錯(cuò)誤,真是奇怪,兩者都是調(diào)JAXP的 SAXParser 。不過它的代碼也有bug,不能解析出 channel 的一些信息,查看源碼,有點(diǎn)簡(jiǎn)單邏輯錯(cuò)誤,修正后解決。想寫封email給項(xiàng)目開發(fā)者可惜英文不行,通過cvs去commit一下也嫌麻煩,作罷。 總結(jié) Rome: rssutils: rsslib4j: 編輯選擇: rsslib4j |
|