主流java rss

主要有一下幾種:
    1:Rome: http://wiki.java.net/bin/view/Javawsxml/Rome
 Rome是 java.net 上的一個開源項目,現在的版本是0.5。爲什麼叫Rome呢,按它的介紹上的說法,有個“條條大路通羅馬”的意思,有些RSS的意味。Rome可能是 sun 公司從自己某個子項目中抽離出來的,package和類的命名就象j2sdk一樣感覺規範。功能上支持RSS的所有版本及 Atom 0.3(Atom是和RSS類似的一種內容聚合的方式)。Rome 本身是提供API和功能實現.
    2:rssutils: http://gceclub.sun.com.cn/staticcontent/html/2004-04-22/rss.html
 rssutils是一個工具包,sun 的 develope站點上有文章 RSS Utilities: A Tutorial 專門介紹用taglib 顯示RSS內容,附帶的可以下載這個工具包,但我從網上搜索不到它的出處,自然也無法看到它的源碼。但從反編譯的代碼來看,也是sun公司內部高手所做,設計精巧,代碼簡練。實現一個handler,用sax的方式解析xml內容,handler內部用反射和javabean的機制構造RSS元素對象並賦值。
    3:rsslib4j: http://sourceforge.net/projects/rsslib4j
 rsslib4j 是 sourceforget 上的項目,同樣支持所有RSS版本。
    4:rsslibj:http://enigmastation.com/rsslibj/
    5:總結
 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功能。
 rsslibj:
 優 - 1)簡單有效,體積小,才25K。2)能解析和生成RSS(動態和靜態)
 劣 - 1)有小bug。2)版本很久沒有更新了,陳舊.

 

 

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 相當簡單,代碼片斷如下:

Java代碼
  1. FeedFetcher fetcher = new HttpURLFeedFetcher();   
  2. SyndFeed feed = fetcher.retrieveFeed(feedUrl);   
  3. System.out.println(feedUrl + ” has a title: ” + new String(feed.getTitle().getBytes(”iso8859-1″), “utf-8″) + ” and contains “ + feed.getEntries().size() + ” entries.”);   
  4. for (Iterator iter = feed.getEntries().iterator(); iter.hasNext(); ) {   
  5. SyndEntry entry = (SyndEntry) iter.next();   
  6. System.out.println(”" + entry.getTitle() + “[” + entry.getPublishedDate() + “]”);   
  7. }  
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 的源碼 :

Java代碼
  1. // 改變 InputStreamReader , 換用 XmlReader   
  2. //InputStreamReader reader = new InputStreamReader(is, ResponseHandler.getCharacterEncoding(connection));   
  3. XmlReader reader = new XmlReader(connection);   
  4. SyndFeedInput input = new SyndFeedInput();   
  5. SyndFeed feed = input.build(reader);  
// 改變 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。

 

包結構
 com.sun.syndication.feed 提供RSS and Atom beans的父類
 com.sun.syndication.feed.atom 提供實現Atom feeds核心元素的beans
 com.sun.syndication.feed.module 提供處理聚合modules的beans
 com.sun.syndication.feed.rss 提供實現Rss feeds核心元素的beans
 com.sun.syndication.feed.synd 我們主要用的就是這個包,SyndFeed and SyndEntryImpl
 com.sun.syndication.io  提供對讀取和分析feeds的輸入和輸出

發佈了75 篇原創文章 · 獲贊 4 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章