天天看點

如何使用java代碼擷取RSS中資訊

RSS基礎知識概述:

 RSS 這個概念,伴随着“部落格(Weblog)”這個詞語的出現,已經好幾歲了。

什麼是RSS呢,它縮寫是 "Really Simple Syndication", 支撐技術是xml,作用是用于線上共享内容,訂閱新聞、部落格等等。因為部落格是“文章密集型”的,是以RSS可以把文章的概述資訊都放在一個一個的摘要(item)裡面,每個item有文章的概述,以及到文章全部内容的超級連結,是以有了RSS摘要,基本上配合RSS 閱讀器,可以很快的得到所需要的資訊。

以下是一個RSS檔案的标準結構:

<rss version="2.0"> 

<channel> 

<title>...</title> 

<link>...</link> 

<description>...</description> 

<copyright>...</copyright> 

<generator>...</generator> 

<lastBuildDate>...</lastBuildDate> 

<image>...</image> 

<item>...</item> 

... 

</channel> 

</rss> 

 其中rss元素是其根元素,它吧所有的内含資訊包含在一個頻道<channel>中,頻道有許多meta資訊,就是出現在<item>前面的所有子元素。而rss中的所有摘要,都以<item>元素的形式出現,一個<channel>可以有多個<item>。每個<item>同樣有元資訊,最重要的是描述<description>和連結<link>。

其實,不僅僅RSS閱讀器可以擷取RSS資訊,我們用java API也是可以的。比較有名的是sourceforge的rsslib4j 包,我們這裡就展示這個包的用法:

實驗部分:

我們示範2個例子,一個是讀取本地rss檔案的資訊,一個是讀取網絡上某rss檔案的資訊:

首先我們開發了一個工具類,這個類的工具方法可以分離出相關資訊并且轉為字元串形式:

package com.charles.learnrss; 

import java.util.List; 

import org.gnu.stealthp.rsslib.RSSChannel; 

import org.gnu.stealthp.rsslib.RSSHandler; 

import org.gnu.stealthp.rsslib.RSSImage; 

import org.gnu.stealthp.rsslib.RSSItem; 

/* 

 *  This file is confidential by Charles.Wang 

 *  Copyright belongs to Charles.wang 

 *  You can make contact with Charles.Wang ([email protected]

 */ 

public class RSSInfoRetriever { 

    public static String getRSSInfo(RSSHandler handler){ 

        StringBuffer rssInfo = new StringBuffer(); 

        //取得rss提要的頻道資訊(Channel) 

        RSSChannel channel = handler.getRSSChannel(); 

        //Part1: 分離出rss頻道的元資訊 

        //(1)頻道的标題 

        String titleInfo = channel.getTitle(); 

        //(2)頻道的連結資訊 

        String linkInfo = channel.getLink(); 

        //(3)頻道的描述資訊  

        String descriptionInfo = channel.getDescription(); 

        //(4)頻道使用的語言 

        String languageInfo = channel.getLanguage(); 

        //(5)頻道版權資訊 

        String copyrightInfo = channel.getCopyright(); 

        //(6)頻道的generator的資訊 

        String generatorInfo = channel.getGenerator(); 

        //(7)頻道的image資訊 

        RSSImage channelImage = channel.getRSSImage(); 

        String channelImageUrl = channelImage.getUrl(); 

        rssInfo.append("頻道标題: "+titleInfo+"\n"); 

        rssInfo.append("頻道相關Link資訊: "+linkInfo+"\n"); 

        rssInfo.append("頻道描述資訊: "+descriptionInfo+"\n"); 

        rssInfo.append("頻道使用的語言: "+languageInfo+"\n"); 

        rssInfo.append("頻道版權資訊: "+copyrightInfo+"\n"); 

        rssInfo.append("頻道産生器資訊: "+generatorInfo+"\n"); 

        rssInfo.append("頻道圖檔URL: "+channelImageUrl+"\n"); 

        //Part2: 分離出rss頻道的所有摘要(feed),這裡用item表示 

        List channelItems = channel.getItems(); 

        int itemSize= channelItems.size(); 

        if(itemSize >=1){ 

            rssInfo.append("\n"); 

            rssInfo.append("一共有 "+itemSize+"個摘要在這個頻道中"); 

            for (int i=0;i<itemSize;i++){ 

                int itemNo = i+1; 

                RSSItem item = (RSSItem)channelItems.get(i); 

                rssInfo.append("\n"); 

                rssInfo.append("摘要"+itemNo+":"); 

                //(1)摘要的作者 

                String itemAuthor = item.getAuthor(); 

                //(2)摘要的标題 

                String itemTitle = item.getTitle(); 

                //(3)摘要的描述 

                String itemDescription = item.getDescription(); 

                //(4)摘要的連結 

                String itemLink = item.getLink(); 

                //(5)摘要的釋出日期 

                String itemPubDate = item.getPubDate(); 

                rssInfo.append("作者: "+itemAuthor+"\n"); 

                rssInfo.append("标題: "+itemTitle+"\n"); 

                rssInfo.append("描述: "+itemDescription+"\n"); 

                rssInfo.append("連結: "+itemLink+"\n"); 

                rssInfo.append("釋出日期: "+itemPubDate+"\n"); 

            } 

        } 

        return rssInfo.toString(); 

    } 

然後我們寫了一個驅動類,這個驅動類封裝了2個實驗:

package com.charles.demo; 

import java.net.URL; 

import org.gnu.stealthp.rsslib.RSSException; 

import org.gnu.stealthp.rsslib.RSSParser; 

import com.charles.learnrss.RSSInfoRetriever; 

/** 

 *  

 * Description: 

 * @author charles.wang 

 * @created May 10, 2012 9:07:13 AM 

public class RSSInfoRetrieverDemo { 

    // 這裡定義一個本地的rss摘要,(對應我的部落格空間) 

    public static final String localRSS = "charles.rss"; 

    //這裡定義一個遠端的rss摘要的位址(對應人民網) 

    public static final String remoteRSS="http://www.people.com.cn/rss/politics.xml"; 

    public static void main(String[] args) throws Exception { 

        // DEMO 1: 讓RSSParser去解析本地某個rss檔案 

        // 取得本地的rss 

        RSSHandler localRSSHandler = new RSSHandler(); 

        RSSParser.parseXmlFile(localRSS, localRSSHandler, false); 

        // 取得rss元素的資訊并且列印在控制台上 

        String localRSSInfo=RSSInfoRetriever.getRSSInfo(localRSSHandler); 

        System.out.println("*************Charles部落格的 rss資訊如下****************"); 

        System.out.println(localRSSInfo); 

        System.out.println("****************************************************"); 

        // DEMO 2: 讓RSSParser去解析遠端rss的url 

        // 取得遠端的rss 

        RSSHandler remoteRSSHandler = new RSSHandler(); 

        RSSParser.parseXmlFile(new URL(remoteRSS), remoteRSSHandler, false); 

        String remoteRSSInfo=RSSInfoRetriever.getRSSInfo(remoteRSSHandler); 

        System.out.println("****************人民網的 rss資訊如下******************"); 

        System.out.println(remoteRSSInfo); 

實驗1:讀取本地的rss檔案(charles.rss)

這個檔案部分内容為:

<title> 

<![CDATA[ 平行線的凝聚-51CTO技術部落格 ]]> 

</title> 

<link> 

<![CDATA[ http://supercharles888.blog.51cto.com ]]> 

</link> 

<description> 

<![CDATA[ Latest 20 blogs of charles_wang8888 ]]> 

</description> 

<copyright> 

<![CDATA[ Copyright(C) 51CTO技術部落格-領先的IT技術部落格 ]]> 

</copyright> 

<generator> 

<![CDATA[ 51CTO BLOG by 51CTO Studio ]]> 

</generator> 

<lastBuildDate>Thu, 01 Jan 1970 00:00:00 GMT</lastBuildDate> 

<image> 

<url> 

<![CDATA[ http://img1.51cto.com/image/skin/1/rss.gif ]]> 

</url> 

<![CDATA[ 51CTO BLOG ]]> 

<![CDATA[ http://blog.51cto.com ]]> 

<![CDATA[ 51CTO技術部落格-領先的IT技術部落格 ]]> 

</image> 

<item> 

<![CDATA[ 跨域通路的解決方案(非HTML5的方法1:JSONP) ]]> 

<![CDATA[ 

跨域通路一直是困擾很多開發者的問題之一。因為涉及到安全性問題,是以跨域通路預設是不可以進行的,否則假設今天我寫了一段js去更改google的圖示,明天他寫了一段代碼去吧google首頁的文字全部變成梵文,那還得..【<a href="http://supercharles888.blog.51cto.com/609344/856886" target="_blank">繼續閱讀全文</a>】 

]]> 

http://supercharles888.blog.51cto.com/609344/856886 

<author> 

<![CDATA[ charles_wang8888 ]]> 

</author> 

<category> 

<![CDATA[ Web開發 ]]> 

</category> 

<pubDate>Tue, 08 May 2012 04:02:42 GMT</pubDate> 

</item> 

最終結果如下(因為很長,是以隻顯示部分):

本地rss的控制台輸出結果:

*************Charles部落格的 rss資訊如下**************** 

頻道标題: 平行線的凝聚-51CTO技術部落格 

頻道相關Link資訊: http://supercharles888.blog.51cto.com 

頻道描述資訊: Latest 20 blogs of charles_wang8888 

頻道使用的語言: null 

頻道版權資訊: Copyright(C) 51CTO技術部落格-領先的IT技術部落格 

頻道産生器資訊: 51CTO BLOG by 51CTO Studio 

頻道圖檔URL: http://img1.51cto.com/image/skin/1/rss.gif 

一共有 20個摘要在這個頻道中 

摘要1:作者: charles_wang8888 

标題: 跨域通路的解決方案(非HTML5的方法1:JSONP) 

描述: 跨域通路一直是困擾很多開發者的問題之一。因為涉及到安全性問題,是以跨域通路預設是不可以進行的,否則假設今天我寫了一段js去更改google的圖示,明天他寫了一段代碼去吧google首頁的文字全部變成梵文,那還得..【<a href="http://supercharles888.blog.51cto.com/609344/856886" target="_blank">繼續閱讀全文</a>】 

連結: http://supercharles888.blog.51cto.com/609344/856886 

釋出日期: Tue, 08 May 2012 04:02:42 GMT 

摘要20:作者: charles_wang8888 

标題: 軟體過程模型-瀑布模型 

描述: 瀑布模型(waterfall)是将開發階段描述為從一個階段瀑布般的轉化到另外一個階段,一個開發階段必須在另外一個開發階段之前完成。它的特點是有裡程碑+可傳遞産品。 

 瀑布模型中,軟體開發分為如下的階段: 

 需求分..【<a href="http://supercharles888.blog.51cto.com/609344/848535" target="_blank">繼續閱讀全文</a>】 

連結: http://supercharles888.blog.51cto.com/609344/848535 

釋出日期: Tue, 01 May 2012 02:49:07 GMT 

**************************************************** 

遠端rss的控制台輸出結果如下:

****************人民網的 rss資訊如下****************** 

頻道标題: 國内新聞 

頻道相關Link資訊: http://politics.people.com.cn 

頻道描述資訊: null 

頻道使用的語言: zh_CN 

頻道版權資訊: Copyright 1997-2012 by www.people.com.cn. all rights reserved 

頻道産生器資訊: null 

頻道圖檔URL: http://www.people.com.cn/img/2004people/logo.gif 

一共有 100個摘要在這個頻道中 

摘要1:作者: null 

标題: 烏魯木齊暫封黨政機關一半公車緩解擁堵 

描述:   本報烏魯木齊5月9日電 記者潘從武 記者今天從新疆烏魯木齊市黨政機關、企事業機關暫時封存50%公務用車緩解交通擁堵動員大會上了解到,從5月15日到9月5日,烏市将控制全市機動車出行總量,暫時封存全市各級黨政機關和 ... 

連結: http://politics.people.com.cn/GB/17852009.html 

釋出日期: 2012-05-10 08:43:50 

摘要100:作者: null 

标題: 四部門規範國企負責人職務消費行為 禁公款買房等 

描述:   中新網5月8日電 據财政部網站消息,日前财政部會同監察部、審計署和國資委聯合釋出了《國有企業負責人職務消費行為監督管理暫行辦法》的通知,通知要求嚴格規範國有企業負責人職務消費行為,并明确列出了國企負責 ... 

連結: http://politics.people.com.cn/GB/17841114.html 

釋出日期: 2012-05-09 08:29:10 

本文轉自 charles_wang888 51CTO部落格,原文連結:http://blog.51cto.com/supercharles888/859470,如需轉載請自行聯系原作者