rss 介绍及开发

一个网站,为了让更多的访问者能够看到自己的网页,做了一个文件,叫做RSS文件。该文件的格式与一般的网页有所不同,它把网页的标题、发布日期、摘要、作者、链接等单独标识出来。

RSS是站点用来和其他站点之间共享内容的一种简易方式(聚合内容),通常被用于新闻和其他按顺序排列的网站,例如Blog。

一 段项目的介绍可能包含新闻的全部介绍等。或者仅仅是额外的内容或者简短的介绍。这些项目的链接通常都能链接到全部的内容。网络用户可以在客户端借助于支持 RSS的新闻聚合软件(如FeedDemon、SharpReader,NewzCrawler),在不打开网站内容页面的情况下阅读支持RSS输出的网 站内容。网站提供RSS输出,有利于让用户发现网站内容的更新。

RSS如何工作?

首先您一般需要下载和安装一个RSS新闻阅读器,然后从网站提供的聚合新闻目录列表中订阅您感兴趣的新闻栏目的内容。订阅后,您将会及时获得所订阅新闻频道的最新内容。

阅读RSS新闻的特点

1.没有广告或者图片来影响标题或者文章概要的阅读。
2.RSS阅读器自动更新你定制的网站内容,保持新闻的及时性。 
3.用户可以加入多个定制的RSS提要,从多个来源搜集新闻整合到单个数据流中。

访问者使用特定的RSS阅读器软件,不必登录这个网站就可以读取RSS文件,看到文件中标示的所有网页的标题、摘要、链接等信息,并且点击浏览网页。

通过上述方式,访问者可以在自己的阅读器里分门别类地收集许多来自不同网站的自己感兴趣的RSS文件,而不必一个一个地访问这些网站。RSS阅读器实际上成了读者自己的个性化信息库。

对于网站来说,RSS方式也有好处。它扩大了网站内容的传播面,也增加了网站访问量,因为访问者调阅的RSS文件和浏览的网页,都是从网站服务器上下载的。

RSS文件的网址是固定不变的,网站可以随时改变其中的内容。RSS内容一旦更新,浏览者看到的内容也随即更新了。

RSS的字面意思是什么呢?它是一个词组的所写,具体是什么?说法有三种:
1、Really Simple Syndication(真正简易的聚合)的缩写。
2、Rich Site Summary(丰富的站点摘要)的缩写。
3、RDF Site Summary(RDF站点摘要)的缩写。

一 般情况下,RSS文件包括了两部分:前半部分标示了RSS标题、图片、描述、语言、发布者、版权、发布日期等信息,后半部分是文章的基本信息,包括标题、 链接地址、作者、类别、发布、文章日期、描述等。其中,后半部分是可以重复的,只不过具体内容可以是有关其他文章的。这些文章地址分别指向不同的网页。


RSS 开发教程

RSS

RSS (Really Simple Syndication,真正简单的连锁)是一种 Web 内容连锁格式。RSS 成为通过 Web 连锁新闻内容的标准格式。作为最近与 Sun Microsystems 签署合同的一部分,我负责开发任何懂得 RSS、JavaServer Pages 和 HTML 的人便可以使用的“JSP 标签库”。taglib 主要面向用 RSS 收集新闻内容的 Web 站点的非技术性编辑人员。我的目标是开发在 Web 页中将简化使用 RSS 内容(0.91、0.92 和 2.0 版本)的 JSP 标签库。 RSS Utilities Package 是该项目的结果。它包括一套自定义 JSP 标签,这些标签弥补了 RSS Utilities Tag library 和灵活的 RSS 语法分析器。该文档说明了如何使用该语法分析器和 RSS Utilities Package 提供的库。在这里单击便可以下载第一个版本。该 zip 文件包含一个 jar 文件 rssutils.jar(该文件包含使用该工具所需的类)和一个 tld 文件(该文件定义从 RSS 文档中提取信息的 JSP 自定义标签)。 安装 taglib 尽管使用标签库很容易,但在安装时要求您了解 Web 服务器的工作原理和如何去配置它。第一步是下载并解压包。一旦 zip 文件已经解压了,在 Web 应用程序的 /WEB-INF/lib 目录中放置一份 rssutils.jar 和 rsstaglib.tld 的副本。将下面的 taglib 定义添加至 Web 应用程序的 /WEB-INF/web.xml 文件:
<taglib>
<taglib-uri>/WEB-INF/rssutils.tld</taglib-uri>
<taglib-location>/WEB-INF/rssutils.tld</taglib-location>
</taglib>
使用 taglib 一旦 taglib 已经安装在 Web 应用程序中,按照以下步骤便可以在 JSP 页面中使用 taglib。首先,将下面一行添加至 JSP 页面的顶部:
<%@ taglib uri="/WEB-INF/rssutils.tld" prefix="rss" %>
其次,使用 feed 标签将 RSS feed 添加至 JSP 页面,如下例所示:
<rss:feed url="http://servlet.java.sun.com/syndication/rss_java_highlights-10.xml" feedId="javaSunCom"/>
"feed" 标签的 url 属性必须包含到 RSS 文档的 URL。"feed" 标签的 feedId 属性是任意的,可以设置为任何值。然而,我们建议该属性在标识 RSS feed 时要直观。如果应用程序在防火墙后面,可以使用名为 proxyAddress 和 proxyPort 的 "feed" 标签代理属性来设置代理属性。如果不知道代理服务器地址代理端口,请与网络管理员联系。下面是一个例子:
<rss:feed url="http://servlet.java.sun.com/syndication/rss_java_highlights-10.xml" feedId="example1" proxyAddress="129.149.246.4" proxyPort="8080"/>
一旦将一个或多个 RSS feed 添加到页面,您应能使用剩余的一套标签来从 feed 中提取几乎任何信息。下面是一个例子,说明如何提取在上面添加的 RSS feed 频道的标题:
<rss:channelTitle feedId="javaSunCom"/>
Taglib 示例 例 1 (RSS 0.91):
<rss:feed
url="http://servlet.java.sun.com/syndication/rss_java_highlights-XYZCompany-10.xml"
feedId="example1"/>
Image: <rss:channelImage feedId="example1" asLink="true"/>

Title: <rss:channelTitle feedId="example1"/>

Link: <rss:channelLink feedId="example1" asLink="true"/>

Description: <rss:channelDescription feedId="example1"/>

  • <rss:itemTitle feedId="example1" index="0"/>

    <rss:itemDescription feedId="example1" index="0"/>


  • <rss:itemTitle feedId="example1" index="1"/>

    <rss:itemDescription feedId="example1" index="1"/>

例 2 (RSS 0.92):
<rss:feed
url="http://static.userland.com/gems/backend/gratefulDead.xml" feedId="example2"/>
Image: <rss:channelImage feedId="example2"/>

Title: <rss:channelTitle feedId="example2"/>

Link: <rss:channelLink feedId="example2" asLink="true"/>

Description: <rss:channelDescription feedId="example2"/>


  • <rss:forEachItem feedId="example2">
  • <rss:itemDescription feedId="example2"/>


    </rss:forEachItem>
例 3 (RSS 2.0):
<rss:feed
url="http://static.userland.com/gems/backend/rssTwoExample2.xml"
feedId="example3"/>
Image: <rss:channelImage feedId="example3"/>

Title: <rss:channelTitle feedId="example3"/>

Link: <rss:channelLink feedId="example3" asLink="true"/>

Description: <rss:channelDescription feedId="example3"/>

Copyright: <rss:channelCopyright feedId="example3"/>

Docs: <rss:channelDocs feedId="example3"/>

Generator: <rss:channelGenerator feedId="example3"/>

Language: <rss:channelLanguage feedId="example3"/>

Last Build Date: <rss:channelLastBuildDate
X-Virus: 1
feedId="example3"/>

Managing Editor: <rss:channelManagingEditor
feedId="example3"/>

Pub Date: <rss:channelPubDate feedId="example3"/>

X-Virus: 1
Skip Days: <rss:channelSkipDays feedId="example3"/>

Skip Hours: <rss:channelSkipHours feedId="example3"/>

TTL: <rss:channelTTL feedId="example3"/>


  • <rss:forEachItem feedId="example3" startIndex="2" endIndex="4">
  • <rss:itemDescription feedId="example3"/>


    </rss:forEachItem>
如何使用 RssParser? 从某种程度上看,语法分析器是该项目的副产品。尽管语法分析器是用标签库来开发的,但是它完全是自包含的,它可以在 Java 应用程序中使用。然而,要做到这一点,显然您至少需要了解如何编写基本的 Java 代码。(如果您了解如何用 Java 语言编写 Hello World,就没什么问题了。) 首先下载并解压包。一旦将 rssutils.jar 添加至您的类路径,就请使用 RssParserFactory 创建 RssParser 接口的实例:
RssParser parser = RssParserFactory.createDefault();
Rss rss = parser.parse(new
URL("http://mydomain.com/document.rss"));
结 束语 RSS 提供了一种简单的方法来添加和维护您的 Web 站点上来自所有 Web 的新闻及其它内容。即使 RSS 是简单的 XML 格式,在 Web 上的其他任何地方从 XML 文档中分析并提取数据都可能有点棘手——或者至少单调乏味——如果您不得不一遍又一遍地去做的话。RSS Utilities Package 利用 Custom Tag 和 XML Parsing 技术使 "Real Simple Syndication" 格式真正做到文如其名。 另请参阅 A good blog on RSS from Harvard O'Reilly XML.com RSS info Sun's Developer Content Syndication Program: Get Your RSS Feeds



使用dom4j对rss的xml文件分析 <script language="javascript" type="text/javascript"> document.title="使用dom4j对rss的xml文件分析 - "+document.title </script>

Rss-web开始了,今天我的工作就是做对Rss文件的分析,想起前几天刚刚试用了一下的 dom4j,今天就拿他来分析xml.用的的确很方便!顶一个!

由于我只需要从xml中读取必要的信息,所以写的代码不具有通用性,不过对大多数基本应用,这个类应该够用了!先贴代码和运行结果:

 

package org.ibmclub.hust.Rss;

 

import java.io.File;

import java.util.ArrayList;

import java.util.List;

 

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Node;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.ibmclub.hust.Rss.bean.Item;

 

public class RssFile {

       private Document doc;

 

       private String channelName;

 

       private String channelLink;

 

       private String channelDes;

 

       private ArrayList<Item> items = new ArrayList<Item>();

 

       public RssFile(File f) {

              parseFile(f);

       }

 

       private void parseFile(File f) {

              try {

                     SAXReader reader = new SAXReader();

                     doc = reader.read(f);

 

                     List l = doc.selectNodes("rss/channel");

 

                     if (l.size() == 0) {

                            throw new Exception("not a good rss-xml file");

                     }

                     Node channel = (Node) l.get(0);

                     channelName = ((Element) channel.selectNodes("title").get(0))

                                   .getText();

                     channelLink = ((Element) channel.selectNodes("link").get(0))

                                   .getText();

                     channelDes = ((Element) channel.selectNodes("description").get(0))

                                   .getText();

                    

                     //封装item信息

                     List itemList = channel.selectNodes("item");

                     for(Object item : itemList){

                            Item i = new Item((Node)item);

                            items.add(i);

                     }

                    

                     //查看输出

                     System.out.println("channelName:" + channelName);

                     System.out.println("channelLink:" + channelLink);

                     System.out.println("channeDes:" + channelDes);

                     for(Item i : items){

                            System.out.println(" title:"+i.getTitle());

                     //     System.out.println(" link:"+i.getLink());

                     //     System.out.println(" pubtime:"+i.getPubTime());

                     //     System.out.println(" des:"+i.getDes());

                     }

              } catch (Exception e) {

                     System.out.println("message:"+e.getMessage());

              }

       }

 

       public String getChannelName() {

              return channelName;

       }

 

       public String getChannelLink() {

              return channelLink;

       }

 

       public String getDescription() {

              return channelDes;

       }

 

       public ArrayList<Item> getItems() {

              return items;

       }

 

       public static void main(String[] args) {

              long start = System.currentTimeMillis();

              RssFile rssfile = new RssFile(new File("c://Rss.xml"));

              System.out.println(System.currentTimeMillis() - start);

       }

}

 

package org.ibmclub.hust.Rss.bean;

 

import java.sql.Timestamp;

import org.dom4j.Element;

import org.dom4j.Node;

 

public class Item {

       private String title;

 

       private String link;

 

       private String des;

 

       private String pubTime;

 

       public Item() {

       }

 

       public Item(Node itemNode) {

              title = ((Element) itemNode.selectNodes("title").get(0)).getText();

              link = ((Element) itemNode.selectNodes("link").get(0)).getText();

              des = ((Element) itemNode.selectNodes("description").get(0)).getText();

              pubTime = ((Element) itemNode.selectNodes("pubDate").get(0)).getText();

       }

 

       public String getTitle() {

              return title;

       }

 

       public void setTitle(String title) {

              this.title = title;

       }

 

       public String getLink() {

              return link;

       }

 

       public void setLink(String link) {

              this.link = link;

       }

 

       public String getPubTime() {

              return pubTime;

       }

      

       public void setPubTime(String pubTime) {

              this.pubTime = pubTime;

       }

      

       public String getDes(){

              return des ;

       }

       public void setDes(String des){

              this.des = des ;

       }

}

 

运行结果:

channelName:CQ的专栏

channelLink:http://blog.csdn.net/cq8587/

channeDes:

 title:今天上课了

 title:拓扑排序

 title:俄罗斯农夫算法

 title:影评:雨天的水彩画 《爱有天意》观感(转)

 title:java处理压缩文件

 title:第一篇文章

532

 

用的时间还真不少 532ms,不过写起代码来还真是简单方便,鱼和熊掌不可兼得!





RSS 2.0规范

 
RSS 2.0规范
RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)
  RSS 基于XML,所有的 RSS 必须遵循w3c网站上公布的XML 1.0 规范。
  在一个RSS文档中,根元素是<rss>,带有一个必备属性version,用以指明该文档遵循的rss规范,如果rss文档遵循本规范,则version值必须是2.0。
  <rss>元素只有一个子元素,包含关于频道的一些信息。频道(channel)是整个blog,项(item)指一篇文章或日志(也有称这为post)。

 

RSS2.0元素channel的子元素列表

元素(Element) 描述(Description) 值域 重要性 举例(Example)
title 频道名称 必备 GoUpstate.com News Headlines
link 频道的URL 必备 http://www.goupstate.com/
Description 频道的描述 必备 The latest news from GoUpstate.com, a Spartanburg Herald-Journal Web site.

language 频道文章所用语言, 可用netscape或w3c推荐的列表 可选 en-us
copyright 频道内容的版权说明 可选 Copyright 2002, Spartanburg Herald-Journal
managingEditor 责任编辑的email 可选 geo@herald.com (George Matesky)
webMaster 负责频道技术事务的网站管理员email 可选 betty@herald.com (Betty Guernsey)
pubDate 频道内容发布日期,格式遵循RFC822格式(年份可为2们或4位) 可选 Sat, 07 Sep 2002 00:00:01 GMT
lastBuildDate 频道内容最后的修改日期 可选 Sat, 07 Sep 2002 09:42:31 GMT
category 指定频道所属的一个或几个类别 可选 <category>Newspapers</category>
generator 生成该频道的程序名 可选 MightyInHouse Content System v2.3
docs 指向该RSS文件所用格式说明的URL 可选 http://blogs.law.harvard.edu/tech/rss
cloud Allows processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds. More info here. 可选 <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>
ttl 有效期,用以指明该频道可被缓存的最长时间 分钟为单位 可选 <ttl>60</ttl>
image 指定一个 GIF或JPEG或PNG图片,用以与频道一起显示 可选
rating 这个频道的分级(主要指成人、限制、儿童等) 可选
textInput 指定一个text输入框供用户输入,具体信息及功能未定。 可选
skipHours 提示新闻聚合器,那些小时时段它可以跳过。 可选
skipDays 提示新闻聚合器,那些天它可以跳过。 可选

 

RSS2.0元素channel的子元素image的子元素列表

元素(Element) 描述(Description) 值域 重要性 举例(Example)
url 图片的url 必备
title 图片的标题,用于http的alt属性 必备
link 网站的url(实际中常以频道的url代替) 必备
width 图片的宽度(象素为单位) 最大144,默认88 可选
height 图片的高度(象素为单位) 最大400,默认31 可选
description 用于link的title属性 可选


RSS2.0元素channel的子元素cloud的子元素列表

元素(Element) 描述(Description) 值域 重要性 举例(Example)
domain Cloud程序所在机器的域名或IP地址 radio.xmlstoragesystem.com
port 访问clound程序所通过的端口 80
path 程序所在路径(不一定是真实路径) /RPC2
registerProcedure 注册的可提供的服务或过程 xmlStorageSystem.rssPleaseNotify
protocol 协议 xml-rpc, soap , http-post 之一 xml-rpc


RSS2.0元素channel的子元素textInput的子元素列表

元素(Element) 描述(Description) 值域 重要性 举例(Example)
title Submit按钮的标签 必备
description 解释text输入区 必备
name Text area对象的名字 必备
link 处理提交的请求的cgi程序 必备


关于item的内容,请看基于XML-RPC的BloggerAPI学习.
说明:
  rss2.0要求<link>和<url>的值的非常部分开头,须是在IANA注册过的,如http://或https://或ftp://等。
  一个rss文件中,可以包括没有这儿定义的元素,只要它是在某个命名空间被定义过。
  一个常见问题是与的区别,两者在有些情况下是相同的,但前者可指几某个长文中的某个位置(即所谓的页内锚点吧)。


英文版的详细规范==> http://blogs.law.harvard.edu/tech/rss


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.cnfilm.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.cnfilm.web.film.Film; import com.sun.syndication.feed.rss.Channel; import com.sun.syndication.feed.rss.Description; import com.sun.syndication.feed.rss.Item; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.WireFeedOutput; /** * 文件名:RssUtils.java 网站RSS生成 * 版本信息:V1.0 * 日期:2013-06-18 * Copyright BDVCD Corporation 2013 * 版权所有 http://www.bdvcd.com */ public class RssUtils { public static String getRssString(List filmList,HashMap map){ Channel channel = new Channel("rss_2.0"); channel.setTitle(map.get("title")); channel.setDescription(map.get("description")); channel.setLink("http://www.bdvcd.com/"); channel.setEncoding("UTF-8"); /**这个list对应rss中的item列表**/ List items = new ArrayList(); /**新建Item对象,对应rss中的**/ Item item = null; for(Film film:filmList){ item = new Item(); item.setAuthor(film.getStr("starring")); item.setLink("http://www.bdvcd.com/"+film.getStr("curl")+"/"+film.getStr("url")+".html"); item.setPubDate(DateUtils.parse(film.getStr("addtime"))); item.setTitle(film.getStr("fname")); Description description = new Description(); description.setValue(film.getStr("content")); item.setDescription(description); items.add(item); } channel.setItems(items); /**用WireFeedOutput对象输出rss文本**/ WireFeedOutput out = new WireFeedOutput(); String rssString = ""; try { rssString = out.outputString(channel); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (FeedException e) { e.printStackTrace(); } return rssString; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值