æˆ‘çš„ç›®æ ‡æ˜¯åšä¸€ä¸ªç®€å•çš„portletåQŒæ¯‹Æ¡è¯»å–æ–°‹¹ªçš„RSS站点昄¡¤ºæœ€æ–°çš„æ–°é—»æ¡ç›®ã€?br />
èŠ×ƒº†ä¸€ä¸ªä¸‹åˆï¼ŒåŽ»sourceforgeå’Œgoogle 上æœç´?opensource çš?java rss libåQŒè¿˜çœŸæœ‰ä¸å°‘åQˆé¡ºä¾¿æä¸€ä¸‹ï¼Œsourceforgetçš„æœç´¢çœŸçš„很烂)。简å•过滤以åŽï¼Œè§‰å¾—以下三个¾cÕdº“比较有æžå¤´ã€‚Rome ã€rssutilså’Œrsslib4j。具体的评测如下åQ?br />
一. Rome
Rome æ˜?java.net 上的一个开æºé¡¹ç›®ï¼ŒçŽ°åœ¨çš„ç‰ˆæœ¬æ˜¯0.5ã€‚äØ“ä»€ä¹ˆå«Rome呢,按它的介¾l上的说法,有个“æ¡æ¡å¤§èµ\通罗é©?#8221;çš„æ„æ€ï¼Œæœ‰äº›RSSçš„æ„呟뀂Romeå¯èƒ½æ˜?sun å…¬å¸ä»Žè‡ªå·±æŸä¸ªå™å¹ç›®ä¸æŠ½¼›Õd‡ºæ¥çš„åQŒpackage和类的命å就象j2sdk一æ äh„Ÿè§‰è§„范。功能上支æŒRSSçš„æ‰€æœ‰ç‰ˆæœ¬åŠ Atom 0.3(Atom是和RSS¾cÖM¼¼çš„一¿U内容èšåˆçš„æ–¹å¼)。Rome 本èín是æä¾›API和功能实玎ͼŒå…¶ä¸‹ç‹¬ç«‹å‡ÞZ¸€ä¸?rome-fetcher ™å¹ç›®åQŒä¸“门用æ¥è¯»å–RSS内容。æ£å’Œæˆ‘æ„啊ã€?br />
å‚ç…§ fetcher 上的范例åQŒè§£æž?RSS 相当½Ž€å•,代ç 片æ–如下åQ?br />
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() + "]");
}
ä¸ÞZ»€ä¹ˆç”¨ new String(feed.getTitle().getBytes("iso8859-1"), "utf-8") ˜q›è¡Œè½¬ç åQŒæ˜¯å› 䨓Romeæ¥è§£æž?新浪新闻 RSS的时候试图从 URLConnection çš?header ä¸å¾—到编ç ä¿¡æ¯ï¼Œå¦åˆ™æ€ÀL˜¯ç”?iso8859-1。而新‹¹ªçš„RSS response header ä¸ä¸åŒ…嫾~–ç ä¿¡æ¯åQŒæ‰€ä»¥è¦åšä¸€ç•ªè{ç 。å¦å¤–还有就æ˜?entry.getPubDate() 也将˜q”回nullåQŒå› 为Rome 用多¿Upattern åŽ»è¯•å›¾è§£æžæ—¶é—´ä¿¡æ¯ï¼Œæ–°æµªçš„æ—¶é—´æ ¼å¼è¿˜æ˜¯ç¬¦åˆRFC822的,但是Rome 使用SimpleDateFormat æ¥è§£æžæ—¶é—ß_¼Œå®ƒå¿˜è®îCº†ä¸€ç‚¹ï¼Œž®±æ˜¯ SimpleDateFormatçš„è§£æžæ˜¯å…Œ™”äº?Locale 的,所以由于我本地locale是ChinaåQŒSimpleDateFormatçš„parseæ–ÒŽ³•è§£æžä¸å‡ºè‹±æ–‡çš„æ—¶é—´å—½W¦ã€‚以上代ç å‰åŠ?Locale.setDefault(Locale.Englisth) å¯ä»¥æžå®šåQŒä½†æ€»è§‰å¾—ä¸çˆ½ã€?br />
å¦‚æžœä¹Ÿä¸æƒŒ™{ç çš„è¯ï¼ŒRome ˜q˜æä¾›äº†ä¸€ä¸?XmlReader 的类åQŒé€šè¿‡åˆ†æž header å’?xml å†…å®¹æŽ¨æ– encodingåQŒä¿®æ”?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);
é‚£ä¹ˆä¸æ–‡ä¸ç”¨è½¬ç 也能æ£ç¡®æ˜„¡¤ºäº†ï¼Œä¸è¿‡ä¿®æ”¹æºç åŽæˆ‘å†è§£æž?nbsp;癑ֺ¦æ–°é—» RSS 的时候,底层的JDOMå´ä¼šæŠ±é”™è¯´xml æ ¼å¼ä¸æ£¼‹®ã€‚也许Rome的开å‘者也é‡åˆ°˜q‡è¿™æ ïLš„问题åQŒæ‰€ä»¥æ‰æ²¡æœ‰ä½¿ç”¨ XmlReaderã€?br />
� rssutils
它是一个工具包åQŒsun çš?developeç«™ç‚¹ä¸Šæœ‰æ–‡ç« RSS Utilities: A Tutorial 专门介ç»ç”¨taglib 昄¡¤ºRSS内容åQŒé™„带的å¯ä»¥ä¸‹è²˜q™ä¸ªå·¥å…·åŒ…,但我从网上æœç´¢ä¸åˆ°å®ƒçš„å‡ºå¤„ï¼Œè‡ªç„¶ä¹Ÿæ— æ³•çœ‹åˆ°å®ƒçš„æºç 。但从å¾~–è¯‘çš„ä»£ç æ¥çœ‹ï¼Œä¹Ÿæ˜¯sunå…¬å¸å†…部高手所åšï¼Œè®¾è®¡¾_‘ÖéyåQŒä»£ç 简¾lƒã€‚实çŽîC¸€ä¸ªhandleråQŒç”¨sax的方å¼è§£æžxml内容åQŒhandler内部用垮„å’Œjavabeançš„æœºåˆ¶æž„é€ RSSå…ƒç´ å¯¹è±¡òq¶èµ‹å€¹{€‚代ç 片æ–如下:
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());
}
如上所½Cºï¼Œä»£ç 也是相当½Ž€å•,没有转ç 的需求,旉™—´ä¹Ÿæ£¼‹®æ˜¾½Cºï¼ˆå› 䨓æ ÒŽœ¬æ²¡åšåˆ†æžåQŒå½“å—ç¬¦ä¸²ç›´æŽ¥è¿”å›žï¼‰ã€‚ä½†æ˜¯è¯¥å·¥å…·åŒ…åÆˆéžçœŸæ£å¯¹å¤–公布,代ç 䏿œ‰äº›ä¸ä¸¥è°}的地方,如System.out的输出,很ä¸çˆ½ã€‚而且如果 RSS çš?xml内容如果¾~ºå°‘部分ä¸å¸¸ç”¨å…ƒç´?åQŒå®ƒä¹Ÿä¼šprintStackTrace一大串åQŒæœäº†å®ƒäº†ã€‚å¦å¤–还有一个大问题åQŒå°±æ˜¯å½“我用它解æž?癑ֺ¦æ–°é—» 的时候,直接ž®±æŠ¥é”™ï¼šorg.xml.sax.SAXParseException: å—符转æ¢é”™è¯¯åQ?#8220;Unconvertible UTF-8 character beginning with 0xb0”。网上查了查åQŒå¯èƒ½æ˜¯ java 修改˜q‡çš„ UTF-8 å’Œæ ‡å‡?UTF-8 些微ä¸å…¼å®¹å¯¼è‡´ã€‚详情å‚çœ?Java òq›_°ä¸çš„增补å—符 一文ã€?br />
� rsslib4j
rsslib4j æ˜?sourceforget 上的™å¹ç›®åQŒä¸»™å‰|˜¯ http://sourceforge.net/projects/rsslib4jåQŒçŽ°åœ¨æœ€æ–°çš„ç‰ˆæœ¬æ˜?.2åQŒæ‰0.2åQŒå¯æ˜¯å¼€å‘状æ€å´å·²ç»æ˜¯ç¨³å®šäñ”å“åŒ–äº†ã€‚åŒæ äh”¯æŒæ‰€æœ‰RSS版本ã€?br />
rsslib4j è§£æž RSS 的方å¼å’Œ rssutils ä¸€æ øP¼Œæˆ‘看了看æºç åQŒè®¾è®¡æ¯”较简å•,代ç å¯è¯»æ€§ä¸€èˆ¬ï¼Œå¤§é‡ä½¿ç”¨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());
}
看è“væ¥ä¹Ÿæ˜¯ç›¸å½“清晰易懂,执行¾l“果也和rssutilsä¸€æ øP¼Œä¸è¿‡ç”¨å®ƒæ¥è§£æž?癑ֺ¦æ–°é—» å´ä¸ä¼šå‡ºçŽ?rssutils çš„utf-8¾~–ç 错误åQŒçœŸæ˜¯å¥‡æ€ªï¼Œä¸¤è€…都是调JAXPçš?SAXParser 。丘q‡å®ƒçš„代ç 也有bugåQŒä¸èƒ½è§£æžå‡º channel 的一些信æ¯ï¼ŒæŸ¥çœ‹æºç åQŒæœ‰ç‚¹ç®€å•逻辑错误åQŒä¿®æ£åŽè§£å†³ã€‚想写å°email¾l™é¡¹ç›®å¼€å‘è€…å¯æƒœè‹±æ–‡ä¸è¡Œï¼Œé€šè¿‡cvs去commit一下也嫌麻烦,作çÅžã€?br />
æ€È»“
Rome:
ä¼?- 1åQ‰å¯æ‰©å±•性好åQŒæœ‰å‰é€”ã€?åQ‰åŠŸèƒ½å¼ºå¤§ï¼Œé™¤äº†ç”¨æ¥è§£æžRSSåQŒè¿˜å¯ä»¥èšåˆå’Œæž„é€ RSSã€?br />
åŠ?- 1åQ‰å…¼å®ÒŽ€§å¾…åŠ å¼ºåQ?åQ‰ç»‘定jdomã€‚äØ“ä»€ä¹ˆä¸å–œæ¬¢ jdomå‘¢ï¼Œå› äØ“å®ƒapi è€å˜åQŒè¿˜å¾ˆç»åQŒæžå¾—ä¸å…¼å®¹ã€?br />
rssutils:
ä¼?- 1åQ‰ä»£ç 设计精妙,值得å¦ä¹ ã€?åQ‰é™„å¸?taglib 实现åQŒç›´æŽ¥å¯åœ?jsp ä¸åº”用ã€?br />
åŠ?- 1åQ‰æ²¡æœ‰æºç ã€?2åQ‰å…¼å®ÒŽ€§æœ‰å¾…åŠ å¼ºã€?3åQ‰åŠŸèƒ½è¾ƒå¼±ï¼Œåªèƒ½ç”¨æ¥è§£æžRSSåQŒæ²¡æœ‰èšåˆå’Œæž„é€ RSS功能ã€?br />
rsslib4j:
ä¼?- 1åQ‰ç®€å•有效,体积ž®ã€?åQ‰å…¼å®ÒŽ€§ä¸é”™ã€?br />
åŠ?- 1åQ‰æœ‰ž®bugã€?åQ‰åŠŸèƒ½è¾ƒå¼±ï¼Œåªèƒ½ç”¨æ¥è§£æžRSSåQŒæ²¡æœ‰èšåˆå’Œæž„é€ RSS功能ã€?br />
¾~–辑选择åQ?rsslib4j
我åªç”¨æ¥è¯»è¯»æ–°æµªæ–°é—»åQŒrsslib4j 够用ž®±å¥½åQŒä¸˜q‡è¦è‡ªå·±ä¿®æ”¹å’Œç¼–译æºç ã€?br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=282333

]]>