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,如需轉載請自行聯系原作者