- 浏览: 18964 次
- 来自: ...
文章分类
最新评论
-
blackbat:
兄弟 同感 加油 最近怎样?
半年IT工作年终总结 -
Java控:
我的怎么需要设置useBodyEncodingForURI=& ...
tomcat做web服务器时,通过地址栏传中文参数时,编码编译 -
GhostWolf:
import com.totsp.xml.syndicatio ...
实现rss
一:什么是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。
<description>:通常作为 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)版本很久没有更新了,陈旧.
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。
<description>:通常作为 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的输入和输出
七:实例:
在官网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));
*/
/**
* 关键代码:
* 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;
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 {
* 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());
}
}
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;
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 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;
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 {
* 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];
boolean ok = false;
if (args.length>=2) {
try {
String outputType = args[0];
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType(outputType);
feed.setFeedType(outputType);
feed.setTitle("Aggregated Feed");
feed.setDescription("Anonymous Aggregated Feed");
feed.setAuthor("anonymous");
feed.setLink("http://www.anonymous.com");
feed.setDescription("Anonymous Aggregated Feed");
feed.setAuthor("anonymous");
feed.setLink("http://www.anonymous.com");
List entries = new ArrayList();
feed.setEntries(entries);
feed.setEntries(entries);
for (int i=1;i<args.length;i++) {
URL inputUrl = new URL(args[i]);
URL inputUrl = new URL(args[i]);
SyndFeedInput input = new SyndFeedInput();
SyndFeed inFeed = input.build(new XmlReader(inputUrl));
SyndFeed inFeed = input.build(new XmlReader(inputUrl));
entries.addAll(inFeed.getEntries());
}
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,new PrintWriter(System.out));
output.output(feed,new PrintWriter(System.out));
ok = true;
}
catch (Exception ex) {
System.out.println("ERROR: "+ex.getMessage());
}
}
}
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();
}
}
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;
3:将动态生成的RSS存盘,形成静态RSS
package com.sun.syndication.samples;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.SyndFeedOutput;
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;
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 {
* 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存放目录
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);
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);
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();
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);
entry = new SyndEntryImpl();
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=\"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);
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=\"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();
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);
System.out.println(feed);
ok = true;
}
catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
}
catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
if (!ok) {
System.out.println();
System.out.println("FeedWriter creates a RSS/Atom feed and writes it to a file.");
System.out.println("The first parameter must be the syndication format for the feed");
System.out.println(" (rss_0.90, rss_0.91, rss_0.92, rss_0.93, rss_0.94, rss_1.0 rss_2.0 or atom_0.3)");
System.out.println("The second parameter must be the file name for the feed");
System.out.println();
}
}
System.out.println();
System.out.println("FeedWriter creates a RSS/Atom feed and writes it to a file.");
System.out.println("The first parameter must be the syndication format for the feed");
System.out.println(" (rss_0.90, rss_0.91, rss_0.92, rss_0.93, rss_0.94, rss_1.0 rss_2.0 or atom_0.3)");
System.out.println("The second parameter must be the file name for the feed");
System.out.println();
}
}
}
4:动态生成rss,给一个blog站点动态生成rss
package com.vaga.rss.web.admin;
package com.vaga.rss.web.admin;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.ParameterizableViewController;
import org.springframework.web.servlet.mvc.ParameterizableViewController;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import com.totsp.xml.syndication.content.ContentModule;
import com.vaga.blog.model.WeblogEntry;
import com.vaga.blog.model.Website;
import com.vaga.blog.service.WeblogEntryManager;
import com.vaga.blog.service.WebsiteManager;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import com.totsp.xml.syndication.content.ContentModule;
import com.vaga.blog.model.WeblogEntry;
import com.vaga.blog.model.Website;
import com.vaga.blog.service.WeblogEntryManager;
import com.vaga.blog.service.WebsiteManager;
public class SiteRssViewController extends ParameterizableViewController {
// Constants
/** Namespace URI for content:encoded elements */
private static final String CONTENT_NS ="http://purl.org/rss/1.0/modules/content/";
private static final String FEED_TYPE = "type";
private static final String MIME_TYPE = "application/xml; charset=UTF-8";
private static final String COULD_NOT_GENERATE_FEED_ERROR = "Could not generate feed";
private static final String _defaultFeedType="rss_2.0";
private static final String DATE_FORMAT = "yyyy-MM-dd";
//controller starts
private WeblogEntryManager weblogEntryManager;//spring依赖注入
private WebsiteManager websiteManager; //spring依赖注入
//spring依赖注入
public void setWeblogEntryManager(WeblogEntryManager weblogEntryManager) {
this.weblogEntryManager = weblogEntryManager;
}
//spring依赖注入
public void setWebsiteManager(WebsiteManager websiteManager) {
this.websiteManager = websiteManager;
}
protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {
try {
SyndFeed feed = getFeed(request);
String feedType = request.getParameter(FEED_TYPE);//null
feedType = (feedType!=null) ? feedType : _defaultFeedType;
feed.setFeedType(feedType);//rss_2.0
response.setContentType(MIME_TYPE);
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,response.getWriter());//向发出请求的用户输出该RSS(xml格式)
}
catch (FeedException ex) {
String msg = COULD_NOT_GENERATE_FEED_ERROR;
log(msg,ex);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,msg);
}
return null;
}
// Constants
/** Namespace URI for content:encoded elements */
private static final String CONTENT_NS ="http://purl.org/rss/1.0/modules/content/";
private static final String FEED_TYPE = "type";
private static final String MIME_TYPE = "application/xml; charset=UTF-8";
private static final String COULD_NOT_GENERATE_FEED_ERROR = "Could not generate feed";
private static final String _defaultFeedType="rss_2.0";
private static final String DATE_FORMAT = "yyyy-MM-dd";
//controller starts
private WeblogEntryManager weblogEntryManager;//spring依赖注入
private WebsiteManager websiteManager; //spring依赖注入
//spring依赖注入
public void setWeblogEntryManager(WeblogEntryManager weblogEntryManager) {
this.weblogEntryManager = weblogEntryManager;
}
//spring依赖注入
public void setWebsiteManager(WebsiteManager websiteManager) {
this.websiteManager = websiteManager;
}
protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {
try {
SyndFeed feed = getFeed(request);
String feedType = request.getParameter(FEED_TYPE);//null
feedType = (feedType!=null) ? feedType : _defaultFeedType;
feed.setFeedType(feedType);//rss_2.0
response.setContentType(MIME_TYPE);
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,response.getWriter());//向发出请求的用户输出该RSS(xml格式)
}
catch (FeedException ex) {
String msg = COULD_NOT_GENERATE_FEED_ERROR;
log(msg,ex);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,msg);
}
return null;
}
/**
* 请求的类型如下:
* siteRss.htm?websiteId=21 |ID=66的个人站点最新20条文章
* siteRss.htm?websiteId=21&entryType=hot |ID=66的个人站点最热20条文章
*
* @param request
*/
protected SyndFeed getFeed(HttpServletRequest request) throws IOException,FeedException {
DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);
//feed就是channel
SyndFeed feed = new SyndFeedImpl();
//item集合
List entries = new ArrayList();
//一个entry就是代表一个item
SyndEntry entry;
SyndContent description;
setFeed(request,feed);
Iterator iterator = setIterator(request);
//将文章的20记录转成20个item
while(iterator.hasNext()){
entry = new SyndEntryImpl();
WeblogEntry weblogEntry = (WeblogEntry)iterator.next();
entry.setTitle(weblogEntry.getTitle());
entry.setLink(feed.getLink()+"?weblogEntryId="+weblogEntry.getId());
try {
entry.setPublishedDate(dateParser.parse(weblogEntry.getPubTime().toString()));
}
catch (ParseException ex) {
ex.printStackTrace();
}
//该item的description
description = new SyndContentImpl();
description.setType("text/plain");
String text=null;
if(weblogEntry.getText().length()>500){
text = weblogEntry.getText().substring(0, 500);
}else{
text = weblogEntry.getText();
}
description.setValue(text);
entry.setDescription(description);
addFooter(entry);
entries.add(entry);
}
* 请求的类型如下:
* siteRss.htm?websiteId=21 |ID=66的个人站点最新20条文章
* siteRss.htm?websiteId=21&entryType=hot |ID=66的个人站点最热20条文章
*
* @param request
*/
protected SyndFeed getFeed(HttpServletRequest request) throws IOException,FeedException {
DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);
//feed就是channel
SyndFeed feed = new SyndFeedImpl();
//item集合
List entries = new ArrayList();
//一个entry就是代表一个item
SyndEntry entry;
SyndContent description;
setFeed(request,feed);
Iterator iterator = setIterator(request);
//将文章的20记录转成20个item
while(iterator.hasNext()){
entry = new SyndEntryImpl();
WeblogEntry weblogEntry = (WeblogEntry)iterator.next();
entry.setTitle(weblogEntry.getTitle());
entry.setLink(feed.getLink()+"?weblogEntryId="+weblogEntry.getId());
try {
entry.setPublishedDate(dateParser.parse(weblogEntry.getPubTime().toString()));
}
catch (ParseException ex) {
ex.printStackTrace();
}
//该item的description
description = new SyndContentImpl();
description.setType("text/plain");
String text=null;
if(weblogEntry.getText().length()>500){
text = weblogEntry.getText().substring(0, 500);
}else{
text = weblogEntry.getText();
}
description.setValue(text);
entry.setDescription(description);
addFooter(entry);
entries.add(entry);
}
//将所有的item存入channel
feed.setEntries(entries);
return feed;
}
private SyndFeed setFeed(HttpServletRequest request,SyndFeed feed){
//blog中的website
Website website = websiteManager.getWebsite(request.getParameter("websiteId"));
设置当前website的channel属性
feed.setTitle(website.getName());
feed.setAuthor(website.getCreator());
feed.setCopyright(website.getEmailAddress());
feed.setLink("http://wxz.vaga.com.cn:8080/blog/weblog/"+website.getHandle());
feed.setDescription(website.getDescription());
return feed;
}
//从数据库中获得20条该website的文章
private Iterator setIterator(HttpServletRequest request){
if(request.getParameter("entryType")==null){
return weblogEntryManager.getRecentWeblogEntriesForRss(request.getParameter("websiteId"), null, "PUBLISHED", 21).iterator();
}else{
return weblogEntryManager.getHotWeblogEntriesForRss(request.getParameter("websiteId"), null, 21).iterator();
}
}
private Iterator setIterator(HttpServletRequest request){
if(request.getParameter("entryType")==null){
return weblogEntryManager.getRecentWeblogEntriesForRss(request.getParameter("websiteId"), null, "PUBLISHED", 21).iterator();
}else{
return weblogEntryManager.getHotWeblogEntriesForRss(request.getParameter("websiteId"), null, 21).iterator();
}
}
/**
* Add footer to an entry.给每个文章摘要添加页脚
* @param entry
*/
public static void addFooter(SyndEntry entry)
{
// Prep variables used in loops
String title = entry.getTitle();
String link = entry.getLink();
// Use the add-on ContentModule to handle
// <content:encoded/> elments within the feed
ContentModule module =((ContentModule) entry.getModule(CONTENT_NS));
// <content:encoded/> elments within the feed
ContentModule module =((ContentModule) entry.getModule(CONTENT_NS));
// If content:encoded is found, use that.
if(module!=null)
{
// Container for footer-appended HTML strings
List newStringList = new ArrayList();
if(module!=null)
{
// Container for footer-appended HTML strings
List newStringList = new ArrayList();
// Iterate through encoded HTML, creating footers
Iterator oldStringIter =module.getEncodeds().iterator();
while (oldStringIter.hasNext())
{
String original = (String) oldStringIter.next();
newStringList.add(createFooter(original,link, title));
}
Iterator oldStringIter =module.getEncodeds().iterator();
while (oldStringIter.hasNext())
{
String original = (String) oldStringIter.next();
newStringList.add(createFooter(original,link, title));
}
// Set new encoded HTML strings on entry
module.setEncodeds(newStringList);
}
else
{
// Fall back to adding footer in <description/>
// This results in escaped HTML. Ugly, but common.
//Target the description node
SyndContent content = entry.getDescription();
// Create and set a footer-appended description
String original = content.getValue();
content.setValue(createFooter(original,link, title));
}
}
module.setEncodeds(newStringList);
}
else
{
// Fall back to adding footer in <description/>
// This results in escaped HTML. Ugly, but common.
//Target the description node
SyndContent content = entry.getDescription();
// Create and set a footer-appended description
String original = content.getValue();
content.setValue(createFooter(original,link, title));
}
}
/**
* Create a feed item footer of immediate actions
* by using information from the feed item itself
* @param original The original text of the feed item
* @param link The link for the feed item
* @param title The title of the feed item
* @return
*/
private static String createFooter(String original, String link,String title)
{
// Use StringBuffer to create a sb
StringBuffer sb;
if(original==null){
sb=new StringBuffer("<br />");
}else{
sb= new StringBuffer(original);
}
sb.append("\n\n<div class='feedwarmer'><hr/>");
sb.append("<i>相关操作:</i> ");
* Create a feed item footer of immediate actions
* by using information from the feed item itself
* @param original The original text of the feed item
* @param link The link for the feed item
* @param title The title of the feed item
* @return
*/
private static String createFooter(String original, String link,String title)
{
// Use StringBuffer to create a sb
StringBuffer sb;
if(original==null){
sb=new StringBuffer("<br />");
}else{
sb= new StringBuffer(original);
}
sb.append("\n\n<div class='feedwarmer'><hr/>");
sb.append("<i>相关操作:</i> ");
// Add email link using title and item link
sb.append("<a href='mailto:?body=Check this out: ");
sb.append(link).append("'>推荐该链接</a> | ");
sb.append("<a href='mailto:?body=Check this out: ");
sb.append(link).append("'>推荐该链接</a> | ");
// Add delicious link using item title link
sb.append("<a href='http://del.icio.us/post/?url=");
sb.append(link).append("&title=").append(title);
sb.append("'>添加到delicious</a> | ");
sb.append("<a href='http://del.icio.us/post/?url=");
sb.append(link).append("&title=").append(title);
sb.append("'>添加到delicious</a> | ");
// Add Google Blogs Search link using item title
sb.append("<a href='http://blogsearch.google.com/");
sb.append("blogsearch?hl=en&q=").append(title);
sb.append("'>搜索相关内容</a>");
sb.append("<a href='http://blogsearch.google.com/");
sb.append("blogsearch?hl=en&q=").append(title);
sb.append("'>搜索相关内容</a>");
// Finish and return the sb
sb.append("</div>\n");
return sb.toString();
}
}
sb.append("</div>\n");
return sb.toString();
}
}
评论
1 楼
GhostWolf
2008-01-02
import com.totsp.xml.syndication.content.ContentModule;
老大 这句话里面的包是哪里的啊
怎么看到每个人都是在转这篇东西
老大 这句话里面的包是哪里的啊
怎么看到每个人都是在转这篇东西
相关推荐
在Java中实现RSS的发布和订阅,需要理解RSS的结构以及如何使用Java处理XML。 RSS的核心结构包括频道(Channel)和条目(Item)。频道包含有关整个源的信息,如标题、描述和链接,而条目则代表单独的新闻或文章,每...
本篇文章将深入探讨如何利用Linq来实现RSS聚合。 首先,理解RSS聚合的基本概念至关重要。RSS聚合允许用户订阅多个网站的RSS feed,然后在一个统一的地方查看所有新内容。这大大提高了信息获取的效率。RSS feed通常...
【ASP.NET实现RSS订阅(Rss Toolkit 1.0)】 RSS(Really Simple Syndication 或 Rich Site Summary)是一种简洁的XML格式,用于发布新闻、博客等网站的更新信息,使得用户可以通过RSS阅读器轻松获取并跟踪这些内容...
Java实现的RSS阅读器是一个基于Java编程语言的软件应用,主要功能是解析并展示RSS(Really Simple Syndication)源中的内容。RSS是一种XML格式,用于发布新闻、博客和其他定期更新的网络内容。RSS阅读器可以帮助用户...
在"ROME + JDOM轻松实现RSS的操作"这个主题中,我们将探讨如何使用这两者来实现RSS的生成和解析。首先,你可以通过以下步骤使用ROME解析RSS URL: 1. 引入ROME库:在项目中添加ROME的依赖,这通常通过Maven或Gradle...
总之,这个"C#实现RSS新闻阅读器"项目涵盖了C#编程基础、XML处理、网络请求以及UI设计等多个方面,对于初学者来说是一个很好的实践机会,能够提升他们的技能,并了解如何将这些技术结合到实际应用中。通过完成该项目...
Rome是一个Java库,专门用于处理RSS和Atom feeds,帮助开发者实现RSS订阅功能。然而,在处理中文字符时,Rome可能会遇到编码问题,导致中文显示为乱码。本文将深入探讨如何解决使用Rome处理RSS订阅时遇到的中文出错...
ASP.NET实现RSS模块是Web开发中的一个重要话题,RSS(Really Simple Syndication)是一种内容聚合格式,常用于新闻、博客和 podcast 的更新推送。通过创建一个RSS模块,网站可以方便地向用户或其他服务提供结构化的...
Java实现RSS(Really Simple Syndication)是通过编程生成符合RSS规范的XML文件,使得用户可以通过RSS阅读器获取和阅读博客、新闻等更新内容。RSSLibJ是一个轻量级的Java库,专门用于处理RSS的读取和生成,适用于在...
在本案例中,“rss实现新闻消息订阅.rar”是一个压缩包文件,其中可能包含了使用Java的Rome库来实现RSS订阅的示例代码和相关资源。 Rome是一个开源的Java库,专门用于处理RSS和Atom feeds。它提供了读取、写入以及...
标题提及的"TransmissionFlexget实现RSS自动下载"是关于如何在QNAP NAS (TS-212P)上配置一个自动化下载系统,结合Transmission BT客户端和Flexget工具,通过RSS订阅来自动下载PT站的内容。Transmission是一个流行的...
TransmissionFlexget 是一种自动化下载工具,它结合了 Transmission(一个流行的BitTorrent客户端)和 Flexget(一个基于Python的内容管理系统)来实现RSS订阅的自动下载。该解决方案尤其适用于QNAP NAS(如TS-212P...
对于推送技术有一个简明清晰的讲解,对RSS具体的讲解,并用JAVA实例实现RSS信息推送。
如何生成动态的XML文档,介于动态文档是ASP格式的,所以必须借助FSO进行XML文件的生成...我这里上传的资源里面包含了用Asp+XmlHttp实现RssReader功能,用ASP生成XML数据文档(RSS订阅)两个功能的代码。希望能给你帮助
**RSS (Really Simple ...实现RSS涉及到XML解析、文件操作以及前端展示等多个层面,不同编程语言都有相应的库和方法来支持这一过程。理解和掌握RSS的原理与实现,对于提高网站的用户体验和内容传播效率具有重要意义。
在Silverlight中实现RSS阅读器,开发者可以利用其强大的图形渲染能力以及XAML(Extensible Application Markup Language)来构建用户界面,同时结合C#或VB.NET等编程语言处理后台逻辑。 在该项目中,首先需要理解...
在Java中,实现RSS涉及以下关键知识点: 1. **XML解析**:RSS是基于XML的,因此理解XML的基本概念至关重要。Java提供了几种XML解析库,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX...
本项目是一个用Java语言实现的RSS阅读器,具有用户界面(UI),方便用户交互。下面将详细阐述Java开发RSS阅读器的相关知识点。 1. **Java基础知识**: - **Java编程语言**:Java是一种面向对象的、跨平台的编程...
本教程将详细介绍如何利用GData库解析XML数据,从而在iOS应用中实现一个简单的RSS阅读功能。GData是Google提供的一套Objective-C库,专门用于处理XML、Atom和RSS等数据格式。 首先,我们需要了解RSS的基本结构。RSS...
在C#中实现RSS,你可以利用.NET Framework提供的类库来创建和解析RSS feed。本教程将引导你理解RSS的基本概念,并教你如何使用C#编写一个简单的RSS阅读器或生成器。 1. **RSS基础知识** - RSS是一种XML数据格式,...