1. 程式人生 > >java使用Rome解析Rss的實例(轉)

java使用Rome解析Rss的實例(轉)

ica cati nload summary 界面 sina uniq 作者 現在

Rome簡介

Rome是為RSS聚合而開發的開源包,它可以支持0.91、0.92、0.93、0.94、1.0、2.0,可以說rss的版本基本上都支持了。

Rss簡介

RSS是站點用來和其他站點之間共享內容的一種簡易方式(也叫聚合內容),通常被用於新聞和其他按順序排列的網站,例如Blog。
RSS就是一種用來分發和匯集網頁內容的XML格式!
RSS =Really Simple Syndication(真正簡單的聚合 )或Rich Site Summary(豐富站點摘要 )
Rss目前已經被廣泛的應用 也是xml應用中的最成功的一項。
RSS 沒有統一標準,目前被使用的版本主要有0.91、1.0、2.0

RSS的理解

拿一個新聞網站來說,如果這個網站使用了RSS技術,也即表示這個網站按照RSS標準將其新聞羅列出來,生成一個RSS文件通常稱為(RSS Feed,其實也就是一個*.xml文件)。其他網站或個人就訂閱該新聞網站的新聞 ,其實也就是讀取了新聞網站提供的RSS文件,既然說是”訂閱“即表示這個過程是動態的,即主要體現在新聞網站上的內容更新了,瀏覽者也同時得到了更新後的內容。當然這要借助工具。
目的及作用
網站內容資源共享
可以自由選擇想要瀏覽的新聞
不用一個網站一個網站,一個網頁一個網頁去逛了。只要這將你需要的內容訂閱在一個RSS閱讀器中,這些內容就會自動出現你的閱讀器裏,你也不必為了一個急切想知道的消息而不斷的刷新網頁,因為一旦有了更新,RSS閱讀器就會自己通知你!

RSS的聯合(Syndication)

發布一個RSS文件(一般稱為RSS Feed)後,這個RSS Feed中包含的信息就能直接被其他站點調用,而且由於這些數據都是標準的XML格式,所以也能在其他的終端和服務中使用,如PDA、手機、郵件列表等。而且一個網站聯盟(比如專門討論旅遊的網站系列)也能通過互相調用彼此的RSS Feed自動的顯示網站聯盟中其他站點上的最新信息,這就叫著RSS的聯合。
這種聯合就導致一個站點的內容更新越及時、RSS Feed被調用的越多,該站點的知名度就會越高,從而形成一種良性循環

RSS的聚合(Aggregation)

所謂RSS聚合,就是通過軟件工具的方法從網絡上搜集各種RSS Feed並在一個界面中提供給讀者進行閱讀。這些軟件可以是在線的WEB工具 也可以是客戶端軟件

Rss瀏覽

RSS是一個純xml文件,將RSS裏的新聞友好的顯示出來就要借助於RSS閱讀器
RSS閱讀器其實就是一個客戶端軟件或內嵌程序,將各個新聞站點提供的xml文件(RSS Feed)中內容讀取出來,將所有新聞分門別類的顯示在軟件中。分類管理也就是所謂的頻道管理。
Rss文件格式
下面是一個Rss文件(*.xml),裏面的註釋是自己加的,<!-- 和-->之間為註釋。

<?xml version="1.0" encoding="utf-8" ?>
<!-- 聲明當前文件為xml文檔【必】-->
<rss version="2.0">
    <!-- 聲明當前文件內容為rss格式文件,屬性version(必須)指定當前rss版本【必】-->
    <channel>
        <!-- 固有節點【必】    -->
        <title>新聞中心-國內焦點新聞</title>
        <!-- 對網站和當前RSS 文件的簡短描述【必】    -->
        <image>
            <!-- 為當前RSS添加圖片        -->
            <title>新聞中心-國內焦點</title>
            <!-- 圖片標題對圖片的簡單描述        -->
            <link>http://news.sina.com.cn/china</link>
            <!-- 網站鏈接地址        -->
            <url>http://image2.sina.com.cn/dy/gn/in10.jpg</url>
            <!-- 圖片的鏈接地址
            -->
        </image>
        <description>國內焦點新聞列表</description>
        <!-- 對當前RSS文件的描述【必】
      -->
        <link>http://news.sina.com.cn/china/index.shtml</link>
        <!-- 網站主頁鏈接【必】
        -->
        <language>zh-cn</language>
        <!-- 當前RSS使用的語言
        -->
        <generator>WWW.SINA.COM.CN</generator>
        <!-- 當RSS文件為自動創建時多存在此節點(RSS文件由什麽創建)
        -->
        <ttl>5</ttl>
        <!-- (ttl = time to live) 在刷新前當前RSS在cache中可以保存多長時間(分鐘)
        -->
        <copyright>Copyright 1996 - 2005 SINA Inc. All Rights Reserved</copyright>
        <!-- 聲明版權
        -->
        <pubDate>Wed, 26 Apr 2006 01:45:05 GMT</pubDate>
        <!-- 當前RSS最後發布的時間
        -->
        <category/>
        <!-- 聲明當前RSS內容的種類
        -->
        <item>
            <!-- 一條信息
            -->
            <title>最高檢:嚴懲公務員利用審批等權力索賄受賄</title>
            <!-- 新聞標題【必】
            -->
            <link>http://news.sina.com.cn/c/l/2006-04-26/08029720281.shtml</link>
            <!-- 新聞鏈接【必】
            -->
            <author>WWW.SINA.COM.CN</author>
            <!-- 新聞作者
            -->
            <guid>http://news.sina.com.cn/c/l/2006-04-26/08029720281.shtml</guid>
            <!-- guid>GUID=Globally Unique Identifier 為當前新聞指定一個全球唯一標示
            -->
            <category>國內焦點新聞</category>
            <!-- 新聞種類
            -->
            <pubDate>Wed, 26 Apr 2006 00:02:53 GMT</pubDate>
            <!-- 新聞最後發布時間
            -->
            <comments/>
            <!-- 新聞註釋
            -->
            <description>新華網沈陽4月25日電 (記者 楊維漢、範春生)
                最高人民檢察院常務副檢察長張耕說,對於國家公務員在商業活動中利用職權謀取非法利益、索賄受賄的案件,必須發現一起,堅決查處一起。特別是對國家公務員利用行政審批權、行政執法權和司法權執法犯法、貪贓枉法、索賄受賄,構成犯....
            </description>
            <!-- 新聞的簡單描述【必】
            -->
        </item>
    </channel>
</rss>

第一行 聲明當前文件是xml文檔
第二行聲明當前文件內容為rss格式文件,屬性version(必須)指定當前rss版本為2.0
<channel>節點為Rss文檔的固有節點,必須,無屬性。
< item> 節點中即紀錄了當前RSS Feed中要顯示的內容。一個RSS文件中通常包含多個<item>節點

< channel>節點
必須節點
< title> 對網站和當前RSS 文件的簡短描述
< link> 網站主頁鏈接
< description> 對當前RSS文件的描述
可選節點
< image> 為當前RSS添加圖片
< language> 當前RSS使用的語言
< generator>當RSS文件為自動創建時多存在此節點(RSS文件由什麽創建)
< ttl>(ttl = time to live) 在刷新前當前RSS在cache中可以保存多長時間(分鐘)
< copyright>聲明版權
< pubDate> 當前RSS最後發布的時間
< category>聲明當前RSS內容的種類
等等

< item>節點
< item> 紀錄一條信息(新聞),只包含這條新聞的簡單信息,一個RSS文件中包含幾條新聞就會有幾個<item>
必須節點
< title> 新聞標題
<link> 新聞鏈接
< description> 新聞的簡單描述
可選節點
< author> 當前新聞的作者
< guid>GUID=Globally Unique Identifier 為當前新聞指定一個全球唯一標示
< category>當前新聞的類別
< pubDate>當前新聞的最後發布時間
< comments>當前新聞的註釋
等等


附上實例源碼:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.GZIPInputStream;

import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Description;
import com.sun.syndication.feed.rss.Guid;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.WireFeedOutput;
import com.sun.syndication.io.XmlReader;

//http://rss.webofknowledge.com/rss?e=4f1b64b6b221ea05&c=8c6909b93bf3eb38a2066a826b61a412
public class Test {
    public static void main(String[] args) {
        try {
            // parseXml(new
            // URL("http://rss.webofknowledge.com/rss?e=4f1b64b6b221ea05&c=8c6909b93bf3eb38a2066a826b61a412"));
            parseXml(new URL("http://127.0.0.1:8080/xd/rss?q=java&t=atom&h=50&s=50"));
            String xml = createXml();
            parseString(xml);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static void parseString(String xml) throws Exception {

        SyndFeedInput input = new SyndFeedInput();
        SyndFeed feed = null;
        ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
        feed = input.build(new XmlReader(inputStream));
        List entries = feed.getEntries();// 得到所有的標題<title></title>
        for (int i = 0; i < entries.size(); i++) {
            SyndEntry entry = (SyndEntry) entries.get(i);
            System.out.println(entry.getTitle());
        }
        System.out.println("feed size:" + feed.getEntries().size());
    }

    /**
     * 根據鏈接地址得到數據
     */
    public static void parseXml(URL url) throws IllegalArgumentException,
            FeedException {
        try {
            SyndFeedInput input = new SyndFeedInput();
            SyndFeed feed = null;
            URLConnection conn;
            conn = url.openConnection();
            String content_encoding = conn.getHeaderField("Content-Encoding");
            if (content_encoding != null && content_encoding.contains("gzip")) {
                System.out.println("conent encoding is gzip");
                GZIPInputStream gzin = new GZIPInputStream(
                        conn.getInputStream());
                feed = input.build(new XmlReader(gzin));
            } else {
                feed = input.build(new XmlReader(conn.getInputStream()));
            }

            List entries = feed.getEntries();// 得到所有的標題<title></title>
            for (int i = 0; i < entries.size(); i++) {
                SyndEntry entry = (SyndEntry) entries.get(i);
                System.out.println(entry.getTitle());
            }
            System.out.println("feed size:" + feed.getEntries().size());

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static String createXml() throws Exception {
         /* 根據Channel源碼提供的英文,Channel對象有兩個構造器,一個默認的無參構造器用於clone對象,一個是有參的
         * 我們自己指定的必須使用有參數的(因為我們需要許可證),指構造方法必須要創建一個type(版本),這個type不能隨便寫,必須要以rss_開頭的版本號
         * Licensed under the Apache License, Version 2.0 (the "License");
         * 因為當前版本是2.0,所以就是rss_2.0,必須是rss_2.0否則會拋異常,該源碼中寫的已經很明白。
         */
        Channel channel = new Channel("rss_2.0");
        channel.setTitle("channel標題");//網站標題
        channel.setDescription("channel的描述");//網站描述
        channel.setLink("www.shlll.net");//網站主頁鏈接
        channel.setEncoding("utf-8");//RSS文件編碼
        channel.setLanguage("zh-cn");//RSS使用的語言
        channel.setTtl(5);//time to live的簡寫,在刷新前當前RSS在緩存中可以保存多長時間(分鐘)
        channel.setCopyright("版權聲明");//版權聲明
        channel.setPubDate(new Date());//RSS發布時間
        List<Item> items = new ArrayList<Item>();//這個list對應rss中的item列表
        Item item = new Item();//新建Item對象,對應rss中的<item></item>
        item.setAuthor("hxliu");//對應<item>中的<author></author>
        item.setTitle("新聞標題");//對應<item>中的<title></title>
        item.setGuid(new Guid());//GUID=Globally Unique Identifier 為當前新聞指定一個全球唯一標示,這個不是必須的
        item.setPubDate(new Date());//這個<item>對應的發布時間
        item.setComments("註釋");//代表<item>節點中的<comments></comments>
        //新建一個Description,它是Item的描述部分
        Description description = new Description();
        description.setValue("新聞主題");//<description>中的內容
        item.setDescription(description);//添加到item節點中
        items.add(item);//代表一個段落<item></item>,
        channel.setItems(items);
        //用WireFeedOutput對象輸出rss文本
        WireFeedOutput out = new WireFeedOutput();
        try {
            String xml = out.outputString(channel);
            System.out.println(xml);
            return xml;
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (FeedException e) {
            e.printStackTrace();
        }
        return null;
    }
}  
import java.net.URL;
import java.util.List;

import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

//http://zmfkplj.iteye.com/blog/461398  
public class TestParse {
    public static void main(String[] args) {
        TestParse test = new TestParse();
        test.parseRss();
    }

    public void parseRss() {
        //String rss = "http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss&sub=0]http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss&sub=0";  
        String rss = "http://rss.sina.com.cn/ent/hot_roll.xml";
        try {
            URL url = new URL(rss);
            // 讀取Rss源     
            XmlReader reader = new XmlReader(url);
            System.out.println("Rss源的編碼格式為:" + reader.getEncoding());
            SyndFeedInput input = new SyndFeedInput();
            // 得到SyndFeed對象,即得到Rss源裏的所有信息     
            SyndFeed feed = input.build(reader);
            //System.out.println(feed);           
            // 得到Rss新聞中子項列表     
            List entries = feed.getEntries();
            // 循環得到每個子項信息     
            for (int i = 0; i < entries.size(); i++) {
                SyndEntry entry = (SyndEntry) entries.get(i);
                // 標題、連接地址、標題簡介、時間是一個Rss源項最基本的組成部分     
                System.out.println("標題:" + entry.getTitle());
                System.out.println("連接地址:" + entry.getLink());
                SyndContent description = entry.getDescription();
                System.out.println("標題簡介:" + description.getValue());
                System.out.println("發布時間:" + entry.getPublishedDate());
                // 以下是Rss源可先的幾個部分     
                System.out.println("標題的作者:" + entry.getAuthor());
                // 此標題所屬的範疇     
                List categoryList = entry.getCategories();
                if (categoryList != null) {
                    for (int m = 0; m < categoryList.size(); m++) {
                        SyndCategory category = (SyndCategory) categoryList.get(m);
                        System.out.println("此標題所屬的範疇:" + category.getName());
                    }
                }
                // 得到流媒體播放文件的信息列表     
                List enclosureList = entry.getEnclosures();
                if (enclosureList != null) {
                    for (int n = 0; n < enclosureList.size(); n++) {
                        SyndEnclosure enclosure = (SyndEnclosure) enclosureList.get(n);
                        System.out.println("流媒體播放文件:" + entry.getEnclosures());
                    }
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}  

附上源碼下載:http://download.csdn.net/detail/earbao/7540321

轉載自:http://blog.csdn.net/earbao/article/details/33741185#comments

java使用Rome解析Rss的實例(轉)