`
chenhao_yssy
  • 浏览: 32968 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论
阅读更多

一:什么是RSS
 RSS(really simple syndication) :网页内容聚合器。RSS的格式是XML。必须符合XML 1.0规范。
 RSS的作用:订阅BLOG,订阅新闻
二:RSS的历史版本:
 http://blogs.law.harvard.edu/tech/rssVersionHistory
 RSS的版本有很多个,0.90、0.91、0.92、0.93、0.94、1.0 和 2.0。与RSS相对的还有ATOM。
 国内主要是RSS2.0,国外主要用ATOM0.3.
 由于RSS出现2派,导致混乱场面。其中RSS2.0规范由哈佛大学定义并锁定。
 地址:http://blogs.law.harvard.edu/tech/rss
三:RSS 文件形式
    1:例子:
 <?xml version="1.0"?>
 <rss version="2.0">
    <channel>
    <title>The channel's name goes here</title>
    <link>http://www.urlofthechannel.com/</link>
    <description>This channel is an example channel for an article.
    </description>
    <language>en-us</language>
    <image>
      <title>The image title goes here</title>
      <url>http://www.urlofthechannel.com/images/logo.gif</url>
      <link>http://www.urlofthechannel.com/</link>
    </image>
    <item>
      <title>The Future of content</title>
      <link>http://www.itworld.com/nl/ecom_in_act/11122003/</link>
      <description> The issue of people distributing and reusing
      digital media is a problem for many businesses. It may also be
      a hidden opportunity. Just as open source licensing has opened
      up new possibilities in the world of technology, it promises to do
      the same in the area of creative content.</description>
    </item>
    <item>
      <title>Online Music Services - Better than free?</title>
      <link>http://www.itworld.com/nl/ecom_in_act/08202003/</link>
      <description>More people than ever are downloading music from 
      the Internet. Many use person-to-person file sharing programs like 
      Kazaa to share and download music in MP3 format, paying nothing. 
      This has made it difficult for companies to setup online music 
      businesses. How can companies compete against free?</description>
    </item>
  </channel>
 </rss>
    2:RSS文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 
 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。
 项通常是频道的主要部分,包含经常变化的内容。
    3:频道(channel)用<channel>表示
 频道一般有三个元素,提供关于频道本身的信息:
 <title>:频道或提要的名称。 
 <link>:与该频道关联的 Web 站点或者站点区域的 URL。 
 <description>:简要介绍该频道是做什么的。 
 许多频道子元素都是可选的。常用的 <image> 元素包含三个必需的子元素:
 <url>:表示该频道的 GIF、JPEG 或 PNG 图像的 URL。 
 <title>:图象的描述。当频道以 HTML 呈现时,用作 HTML <image> 标签的 ALT 属性。 
 <link>:站点的 URL。如果频道以 HTML 呈现,该图像作为到这个站点的链接。 
 <image> 还有三个可选的子元素:
 <width>:数字,表示图象的像素宽度,最大值是 188,默认值为 88。 
 <height>:数字,表示图象的像素高度。最大值是 400,默认值为 31。 
 <description>:包含文本,在呈现时可以作为围绕着该图像形成的链接元素的 title 属性。 
 此外还可以使用许多其他可选的频道元素。多数都是不言自明的:
 <language>:en-us 
 <copyright>:Copyright 2003, James Lewin 
 <managingEditor>:dan@spam_me.com (Dan Deletekey) 
 <webMaster>:dan@spam_me.com (Dan Deletekey) 
 <pubDate>:Sat, 15 Nov 2003 0:00:01 GMT 
 <lastBuildDate>:Sat, 15 Nov 2003 0:00:01 GMT 
 <category>:ebusiness 
 <generator>:Your CMS 2.0 
 <docs>:http://blogs.law.harvard.edu/tech/rss 
 <cloud>:允许进程注册为“cloud”,频道更新时通知它,为 RSS 提要实现了一种轻量级的发布-订阅协议。 
 <ttl>:存活时间 是一个数字,表示提要在刷新之前缓冲的分钟数。 
 <rating>:关于该频道的 PICS 评价。 
 <textInput>:定义可与频道一起显示的输入框。 
 <skipHours>:告诉聚集器哪些小时的更新可以忽略。 
 <skipDays>:告诉聚集器那一天的更新可以忽略。 
    4:摘要(feed)用<item>表示,<item>的格式如下:
 每个摘要通常包含三个元素:
 <title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。 
 <link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL。 
 <descriptin>:通常作为 link 中所指向的 URL 的摘要或者补充。 
 所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
 项还有其他一些可选的元素:
 <author>:作者的 e-mail 地址。 
 <category>:支持有组织的记录。 
 <comments>:关于项的注释页的 URL。 
 <enclosure>:支持和该项有关的媒体对象。 
 <guid>:唯一与该项联系在一起的永久性链接。 
 <pubDate>:该项是什么时候发布的。 
 <source>:该项来自哪个 RSS 频道,当
四:主流java rss lib及其评测:
 主要有一下几种:
    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作为RSS实现工具
 在官网http://wiki.java.net/bin/view/Javawsxml/Rome下载rome-0.8.jar,
 rome用到了jdom1.0,下载地址:http://www.jdom.org
 rome支持:rss_0.9 
   rss_0.91 
   rss_0.92 
   rss_0.93 
   rss_0.94 
   rss_1.0 
   rss_2.0 
   atom_0.3 
   atom_1.0 
 生成RSS类新需要在程序中指定,如:rss_2.0
六:包结构
 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的输入和输出
七:实例:
1:读取远端url的rss,然后输出到控制台:
/**
 * 关键代码:
 * SyndFeedInput input = new SyndFeedInput();
 * SyndFeed feed = input.build(new XmlReader(feedUrl));
 */
package com.sun.syndication.samples;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
import java.net.URL;
/**
 * It Reads and prints any RSS/Atom feed type.
 */
public class FeedReader {
    public static void main(String[] args) {
        boolean ok = false;
        if (args.length==0) {
            try {
                URL feedUrl = new URL("http://seu.org.cn/bbs/rss.php");
  //SyndFeedInput:从远程读到xml结构的内容转成SyndFeedImpl实例
                SyndFeedInput input = new SyndFeedInput();
  //rome按SyndFeed类型生成rss和atom的实例,
  //SyndFeed是rss和atom实现类SyndFeedImpl的接口
                SyndFeed feed = input.build(new XmlReader(feedUrl));
  //打印到控制台
                System.out.println(feed);
                ok = true;
            }
            catch (Exception ex) {
                ex.printStackTrace();
                System.out.println("ERROR: "+ex.getMessage());
            }
        }
        if (!ok) {
            System.out.println();
            System.out.println("FeedReader reads and prints any RSS/Atom feed type.");
            System.out.println("The first parameter must be the URL of the feed to read.");
            System.out.println();
        }
    }
}
2:将多个远程RSS在本地聚集成一个RSS
package com.sun.syndication.samples;
import java.net.URL;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List;
import java.util.ArrayList;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
/**
 * It aggregates a list of RSS/Atom feeds (they can be of different types)
 * into a single feed of the specified type.
 * <p>
 * @author Alejandro Abdelnur
 *
 */
public class FeedAggregator {
    public static void main(String[] args) {
        boolean ok = false;
        if (args.length>=2) {
            try {
                String outputType = args[0];
                SyndFeed feed = new SyndFeedImpl();
                feed.setFeedType(outputType);
      &nbs;         feed.setTitle("Aggregated Feed");
                feed.setDescription("Anonymous Aggregated Feed");
                feed.setAuthor("anonymous");
                feed.setLink("http://www.anonymous.com");
                List entries = new ArrayList();
                feed.setEntries(entries);
                for (int i=1;i<args.length;i++) {
                    URL inputUrl = new URL(args[i]);
                    SyndFeedInput input = new SyndFeedInput();
                    SyndFeed inFeed = input.build(new XmlReader(inputUrl));
                    entries.addAll(inFeed.getEntries());
                }
                SyndFeedOutput output = new SyndFeedOutput();
                output.output(feed,new PrintWriter(System.out));
                ok = true;
            }
            catch (Exception ex) {
                System.out.println("ERROR: "+ex.getMessage());
            }
        }
        if (!ok) {
            System.out.println();
            System.out.println("FeedAggregator aggregates different feeds into a single one.");
            System.out.println("The first parameter must be the feed type for the aggregated feed.");
            System.out.println(" [valid values are: rss_0.9, rss_0.91U, rss_0.91N, rss_0.92, rss_0.93, ]");
            System.out.println(" [                  rss_0.94, rss_1.0, rss_2.0 & atom_0.3  ]");
            System.out.println("The second to last parameters are the URLs of feeds to aggregate.");
            System.out.println();
        }
    }
}
3:将动态生成的RSS存盘,形成静态RSS
package com.sun.syndication.samples;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.SyndFeedOutput;
import java.io.FileWriter;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
 * It creates a feed and writes it to a file.
 * <p>
 * @author Alejandro Abdelnur
 *
 */
public class FeedWriter {
    private static final String DATE_FORMAT = "yyyy-MM-dd";
    public static void main(String[] args) {
        boolean ok = false;
        if (args.length==0) {
            try {
                String feedType = "rss_2.0";//指定rss类型
                String fileName = "F:\\ss.xml";//静态rss存放目录
                DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);
  //feed是通过SyndFeedImpl的实例 
                SyndFeed feed = new SyndFeedImpl();
                feed.setFeedType(feedType);
                feed.setTitle("Sample Feed (created with Rome)");
                feed.setLink("http://rome.dev.java.net");
                feed.setDescription("This feed has been created using Rome (Java syndication utilities");
  
  //entries就是item集合
                List entries = new ArrayList();
  //一个entry就是一个item
                SyndEntry entry;
                SyndContent description;
  
  //第一个item
                entry = new SyndEntryImpl();
                entry.setTitle("Rome v1.0");
                entry.setLink("http://wiki.java.net/bin/view/Javawsxml/Rome01");
                entry.setPublishedDate(dateParser.parse("2004-06-08"));
                description = new SyndContentImpl();
                description.setType("text/plain");
                description.setValue("Initial release of Rome");
                entry.setDescription(description);
                entries.add(entry);
  //第二个item
                entry = new SyndEntryImpl();
       &nbs;        entry.setTitle("Rome v2.0");
                entry.setLink("http://wiki.java.net/bin/view/Javawsxml/Rome02");
                entry.setPublishedDate(dateParser.parse("2004-06-16"));
                description = new SyndContentImpl();
                description.setType("text/xml");
                description.setValue("Bug fixes, <xml>XML</xml> minor API changes and some new features");
                entry.setDescription(description);
                entries.add(entry);
  //第三个item
                entry = new SyndEntryImpl();
                entry.setTitle("Rome v3.0");
                entry.setLink("http://wiki.java.net/bin/view/Javawsxml/Rome03");
                entry.setPublishedDate(dateParser.parse("2004-07-27"));
                description = new SyndContentImpl();
                description.setType("text/html");
                description.setValue("<p>More Bug fixes, mor API changes, some new features and some Unit testing</p>"+
                                     "<p>For details check the <a href=\"Changes">http://wiki.java.net/bin/view/Javawsxml/RomeChangesLog#RomeV03\">Changes Log</a></p>");
                entry.setDescription(description);
  
  //将所有item存入entries
                entries.add(entry);
  
  //将entries加入channel
                feed.setEntries(entries);
                Writer writer = new FileWriter(fileName);
                SyndFeedOutput output = new SyndFeedOutput();
  //存盘,形成静态rss
                output.output(feed,writer);
                writer.close();
               
                System.out.println("The feed has been written to the file ["+fileName+"]");
                System.out.println(feed);
分享到:
评论
1 楼 zzzz3621 2012-03-26  

相关推荐

    RSS代码RSS 代码RSS 代码RSS 代码

    【标题】:“RSS代码解析与应用” 【描述】:“RSS(Really Simple Syndication)是一种用于发布和订阅信息的XML格式,它使得用户可以方便地获取网站的更新内容,如新闻、博客文章等。RSS代码是实现RSS订阅功能的...

    Rss插件-帝国CMS

    【Rss插件-帝国CMS】是专门为帝国内容管理系统(Empire CMS)设计的一款扩展功能插件,旨在增强系统对RSS(Really Simple Syndication)的支持。RSS是一种互联网内容发布格式,它允许用户订阅网站更新,无需频繁访问...

    一个基于新浪RSS的android RSS阅读器源码

    《基于新浪RSS的Android RSS阅读器源码解析与学习指南》 RSS(Really Simple Syndication)是一种内容聚合格式,常用于新闻、博客等网站,让用户能够方便地获取和订阅更新内容。在移动设备上,RSS阅读器应用是访问...

    phpcms rss调取内容,rss 全文输出怎么修改.doc

    【phpcms RSS全文输出修改详解】 在PHP CMS系统中,RSS(Really Simple Syndication)是一种标准,用于聚合网站内容,让订阅者通过RSS阅读器获取更新。然而,默认情况下,phpcms的RSS功能可能只提供文章的摘要,而...

    java实现rss的发布和订阅

    RSS(Really Simple Syndication)是一种基于XML的网络内容聚合格式,它允许用户通过RSS阅读器或聚合器获取网站的更新信息,如新闻、博客文章等。在Java中实现RSS的发布和订阅,需要理解RSS的结构以及如何使用Java...

    MFC编写的RSS简单阅读器

    标题 "MFC编写的RSS简单阅读器" 涉及的知识点主要集中在使用Microsoft Foundation Class (MFC) 库来开发一个简单的RSS阅读器应用程序。MFC是微软为Windows平台提供的一个C++类库,它封装了Windows API,使得开发者...

    提交RSS工具英文站RSS提交,英文站RSS提交

    标题中的“提交RSS工具英文站RSS提交,英文站RSS提交”和描述中的“提交RSS工具搜索引擎的RSS方式的提交提交RSS工具”都指向了一个主题,即利用RSS(Really Simple Syndication)工具向英文网站和搜索引擎提交RSS ...

    C# RSS阅读器 能添加和阅读订阅

    C# RSS阅读器是一款基于C#编程语言开发的应用程序,专为用户管理和阅读RSS(Really Simple Syndication)订阅而设计。RSS是一种XML格式,用于发布新闻、博客和其他定期更新的内容,使得用户可以方便地获取并聚合来自...

    Rss全国各省市天气预报

    【Rss全国各省市天气预报】项目是一个利用RSS(Really Simple Syndication)技术获取并解析全国各地天气信息的应用。RSS是一种基于XML的格式,用于发布和订阅新闻、博客、天气等实时信息,使得用户能轻松地获取和...

    RSS是RSS的jar包

    RSS(Really Simple Syndication)是一种基于XML的网络内容发布协议,它允许网站提供自己的新闻提要,以便用户可以通过RSS阅读器订阅和获取更新。在这个压缩包中,包含了一系列与Java实现RSS相关的库和源代码,这将...

    RSS DEMO 支持RSS定阅

    【RSS模型】 RSS,全称Really Simple Syndication(真正简单的聚合),是一种用于发布和获取网站内容的标准化格式。它允许用户通过订阅RSS feed来跟踪更新,无需频繁地访问各个网站。RSS订阅使得新闻、博客文章和...

    Ultimate Reader(Rss Reader)Rss阅读器

    Ultimate Reader——Our Own Rss Reader 随着越来越多的Web站点对RSS的支持,RSS已经成为目前最成功的XML应用。RSS搭建了一个信息迅速传播的技术平台,使得每个人都成为潜在的信息提供和获取者。在知识爆炸的当今...

    常用Rss,生成解析Rss,

    RSS(Really Simple Syndication)是一种基于XML的网络内容发布协议,它使得用户能够轻松地获取网站的更新信息,如新闻、博客文章等。RSS通过订阅(subscribe)和发布(publish)的方式,允许用户无需直接访问网站就...

    ad-rss-lib-1.1.0.tar.gz

    标题中的"ad-rss-lib-1.1.0.tar.gz"是一个开源库的压缩包,版本号为1.1.0,格式为tar.gz。在IT行业中,这种格式通常是Linux或Unix系统中用来打包和压缩文件的常见方式。tar命令用于打包多个文件和目录到一个单一的...

    RSS Announcer(国外RSS推广)

    RSS Announcer是一款专门针对国外市场设计的RSS推广工具,它为用户提供了一种高效的方式来分发和宣传他们的RSS(Really Simple Syndication) feed,以扩大在线影响力和吸引更多的读者。RSS是一种标准格式,允许用户...

    新浪RSS 阅读器 android源码

    新浪RSS阅读器是一款基于Android平台的应用程序,它允许用户订阅并阅读来自新浪的RSS新闻源。源码分析有助于开发者理解RSS订阅和解析的过程,以及如何在Android环境下构建一个功能完善的新闻阅读应用。以下是对该...

    使用RSS订阅喜欢的bilibiliup主和番剧

    在IT行业中,RSS(Really Simple Syndication)是一种广泛使用的数据格式,它允许用户订阅并获取网站更新,无需频繁地手动检查。在这个场景中,我们关注的是如何利用RSS订阅B站(哔哩哔哩,bilibili)上的UP主(内容...

    Node.js-使用RSS分类订阅稀土掘金

    标题 "Node.js-使用RSS分类订阅稀土掘金" 指出我们将探讨如何利用Node.js技术来构建一个RSS订阅系统,特别关注于稀土掘金(Juejin)这个平台的特定分类内容。RSS(Really Simple Syndication)是一种内容发布协议,...

    室内定位RSS位置指纹法-KNN(代码与数据),RSS指纹,matlab

    RSS(Received Signal Strength,接收到的信号强度)位置指纹法是其中一种常用且有效的定位策略。本压缩包文件提供了关于RSS指纹定位的实现,采用KNN(K-Nearest Neighbors,K近邻算法)作为核心算法,并使用MATLAB...

Global site tag (gtag.js) - Google Analytics