通过rome实现RSS订阅
2012-05-23 16:44
134 查看
首先需要准备下环境(需要的jar包):
rome-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323863)
jdom-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323870)
这两个包的版本必须一致,建议全部使用1.0版本。网上虽然有提供了很多下载地址,但是基本很多都是不能下载的,为方便我放自己的空间里方便大家下载。
至于RSS的详细的东西我就不赘述了,网上类似的文章描述的比我好的多了。
大家或许更想知道一个RSS订阅是怎么一回事,首先,RSS订阅需要一个RSS文件,RSS的格式是XML。必须符合XML 1.0规范。
RSS文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。
项通常是频道的主要部分,包含经常变化的内容。
频道(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>:告诉聚集器那一天的更新可以忽略。
摘要(feed)用<item>表示
每个摘要通常包含三个元素:
<title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。
<link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL
<description>:通常作为 link 中所指向的 URL 的摘要或者补充。
所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
项还有其他一些可选的元素:
<author>:作者的 e-mail 地址。
<category>:支持有组织的记录。
<comments>:关于项的注释页的 URL。
<enclosure>:支持和该项有关的媒体对象。
<guid>:唯一与该项联系在一起的永久性链接。
<pubDate>:该项是什么时候发布的。
<source>:该项来自哪个 RSS 频道
下面就贴一点我自己写的demo吧。。。
1、发布一个RSS,通过Channel、Item类发布
2、发布一个RSS,通过SyndFeed、SyndEntry类发布
发布一个RSS的代码大概是这样的,这两种方式都可以的,不过我在实现的过程中,若是将XML的编码设置为UTF-8,那么出现中文就会有问题,修改为GBK就OK了,估计是和Tomcat设置的编码不一致吧,反正这个问题我一直没有找到具体的原因。。。。
3、读取外部的RSS
其中注释掉的那段代码大家可以不用关注的,这样就可以读取一个外部的RSS了。。。。
其实我也是花了一天时间研究这一块,也研究的不是很深。因为我实在烦了网上各种没有的关于完成RSS的代码,因此自己才决定写这篇文章的。。。有什么不对的地方,高手看到希望指正。。。
对了,还少了一点,也是我一开始纠结的时间比较长的。就是如何把发布的RSS订阅订阅到像QQ邮箱、google等地的方法,其实上网查了好久,其实也蛮简单的。。
我能找到的就是这几个了,希望有找到的朋友帮忙补充下。。。。
1、添加订阅到Google
打开http://www.google.com/intl/zh-cn/webmasters/add.html,选择按钮样式并输入你的RSS地址,会生成一段代码,把这段代码加入到你的网页即可
2、添加订阅到鲜果
打开http://xianguo.com/tools/sub_button,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中
3、添加订阅到有道
打开http://reader.youdao.com/tools.html,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中
4、订阅到QQ邮箱
我没有找到QQ邮箱添加订阅的代码生成页面,不过研究发现,你只要把链接http://mail.qq.com/cgi-bin/feed?u=http://domety.com/feed中的http://domety.com/feed改成你的RSS地址
下面是我做的一个例子,不过RSS源我链接的是新浪
后面有找到了两个
5、订阅到MSN
只要把连接http://my.msn.com/addtomymsn.armx?id=rss&ut=http://rss.sina.com.cn/news/marquee/ddt.xml中的ut=后面的改为自己的RSS地址就可以了
6、订阅到雅虎
只要把连接http://add.my.yahoo.com/rss?url=http://rss.sina.com.cn/news/marquee/ddt.xml中的url=后面换成自己的RSS地址即可
rome-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323863)
jdom-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323870)
这两个包的版本必须一致,建议全部使用1.0版本。网上虽然有提供了很多下载地址,但是基本很多都是不能下载的,为方便我放自己的空间里方便大家下载。
至于RSS的详细的东西我就不赘述了,网上类似的文章描述的比我好的多了。
大家或许更想知道一个RSS订阅是怎么一回事,首先,RSS订阅需要一个RSS文件,RSS的格式是XML。必须符合XML 1.0规范。
<?xml version="1.0" encoding="UTF-8"?> <rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"> <channel> <title>Sample Feed (created with Rome)</title> <link>http://rome.dev.java.net</link> <description>This feed has been created using Rome (Java syndication utilities</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>Rome v1.0</title> <link>http://wiki.java.net/bin/view/Javawsxml/Rome01</link> <description>Initial release of Rome</description> <pubDate>Mon, 07 Jun 2004 16:00:00 GMT</pubDate> <guid>http://wiki.java.net/bin/view/Javawsxml/Rome01</guid> <dc:date>2004-06-07T16:00:00Z</dc:date> </item> <item> <title>Rome v2.0</title> <link>http://wiki.java.net/bin/view/Javawsxml/Rome02</link> <description>Bug fixes, <xml>XML</xml> minor API changes and some new features</description> <pubDate>Tue, 15 Jun 2004 16:00:00 GMT</pubDate> <guid>http://wiki.java.net/bin/view/Javawsxml/Rome02</guid> <dc:date>2004-06-15T16:00:00Z</dc:date> </item> <item> <title>Rome v3.0</title> <link>http://wiki.java.net/bin/view/Javawsxml/Rome03</link> <description><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></description> <pubDate>Mon, 26 Jul 2004 16:00:00 GMT</pubDate> <guid>http://wiki.java.net/bin/view/Javawsxml/Rome03</guid> <dc:date>2004-07-26T16:00:00Z</dc:date> </item> </channel> </rss>
RSS文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。
项通常是频道的主要部分,包含经常变化的内容。
频道(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>:告诉聚集器那一天的更新可以忽略。
摘要(feed)用<item>表示
每个摘要通常包含三个元素:
<title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。
<link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL
<description>:通常作为 link 中所指向的 URL 的摘要或者补充。
所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
项还有其他一些可选的元素:
<author>:作者的 e-mail 地址。
<category>:支持有组织的记录。
<comments>:关于项的注释页的 URL。
<enclosure>:支持和该项有关的媒体对象。
<guid>:唯一与该项联系在一起的永久性链接。
<pubDate>:该项是什么时候发布的。
<source>:该项来自哪个 RSS 频道
下面就贴一点我自己写的demo吧。。。
1、发布一个RSS,通过Channel、Item类发布
public void ChannleItemXml() { DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); Channel channel = new Channel("rss_2.0"); // 该type参数为固定格式 channel.setTitle("test rome channel title"); channel.setDescription("channel的描述"); channel.setLink("http://hi.baidu.com/openj/rss"); channel.setPubDate(date); channel.setEncoding("GBK"); List items = new ArrayList(); Item item = new Item(); item.setAuthor("zhangwei"); item.setTitle("item title"); Description desc = new Description(); desc.setType("item desc type"); desc.setValue("item desc value"); item.setDescription(desc); items.add(item);// 添加一个item Item item2 = new Item(); item2.setAuthor("zhangwei"); item2.setTitle("use rome to read rss"); Description desc2 = new Description(); desc2.setValue("you must import rome_1.0.jar & jdom.jar"); item2.setDescription(desc2); Content content = new Content(); content.setValue("rome是用来发布读取rss的工具,遵循rss标准的XML"); item2.setContent(content); items.add(item2);// 添加一个item channel.setItems(items); WireFeedOutput out = new WireFeedOutput(); try { // Channel继承与WireFeed System.out.println(out.outputString(channel)); } catch (FeedException ex) { ex.printStackTrace(); } }
2、发布一个RSS,通过SyndFeed、SyndEntry类发布
public void SyndFeedXml() { DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); // 该type参数为固定格式 feed.setTitle("test rome channel title"); feed.setDescription("channel的描述"); feed.setLink("http://hi.baidu.com/openj/rss"); feed.setPublishedDate(date); feed.setEncoding("GBK"); List items = new ArrayList(); SyndEntry entry = new SyndEntryImpl(); entry.setAuthor("zhangwei"); entry.setTitle("item title"); SyndContent desc = new SyndContentImpl(); desc.setType("item desc type"); desc.setValue("item desc value"); entry.setDescription(desc); items.add(entry);// 添加一个entry entry = new SyndEntryImpl(); entry.setAuthor("zhangwei"); entry.setTitle("use rome to read rss"); desc = new SyndContentImpl(); desc.setType("plain/text"); desc.setValue("you must import rome_1.0.jar & jdom.jar"); entry.setDescription(desc); items.add(entry);// 添加一个entry feed.setEntries(items); SyndFeedOutput out = new SyndFeedOutput(); try { System.out.println(out.outputString(feed)); } catch (FeedException ex) { ex.printStackTrace(); } }
发布一个RSS的代码大概是这样的,这两种方式都可以的,不过我在实现的过程中,若是将XML的编码设置为UTF-8,那么出现中文就会有问题,修改为GBK就OK了,估计是和Tomcat设置的编码不一致吧,反正这个问题我一直没有找到具体的原因。。。。
3、读取外部的RSS
public void ReadFeedXml() { try { System.setProperty("http.proxyHost", "10.191.131.13"); System.setProperty("http.proxyPort", "3128"); String authStr = "account:password"; String auth = "Basic " + Base64Encoder.encode(authStr.getBytes()); URL feedurl = new URL("http://rss.sina.com.cn/news/marquee/ddt.xml"); // 指定rss位置 URLConnection uc = feedurl.openConnection(); // 设定代理 uc.setRequestProperty("Proxy-Authorization", auth); uc.addRequestProperty("Referer", "localhost"); SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = input.build(new XmlReader(uc)); feed.setEncoding("GBK"); // List entries = feed.getEntries(); // for (int i = 0; i < entries.size(); i++) { // SyndEntry entry = (SyndEntry) entries.get(i); // System.out.print(entry.getTitle()); // System.out.print(entry.getLink()); // } SyndFeedOutput out = new SyndFeedOutput(); try { System.out.println(out.outputString(feed)); } catch (FeedException ex) { ex.printStackTrace(); } } catch (Exception ex) { ex.printStackTrace(); } }
其中注释掉的那段代码大家可以不用关注的,这样就可以读取一个外部的RSS了。。。。
其实我也是花了一天时间研究这一块,也研究的不是很深。因为我实在烦了网上各种没有的关于完成RSS的代码,因此自己才决定写这篇文章的。。。有什么不对的地方,高手看到希望指正。。。
对了,还少了一点,也是我一开始纠结的时间比较长的。就是如何把发布的RSS订阅订阅到像QQ邮箱、google等地的方法,其实上网查了好久,其实也蛮简单的。。
我能找到的就是这几个了,希望有找到的朋友帮忙补充下。。。。
1、添加订阅到Google
打开http://www.google.com/intl/zh-cn/webmasters/add.html,选择按钮样式并输入你的RSS地址,会生成一段代码,把这段代码加入到你的网页即可
2、添加订阅到鲜果
打开http://xianguo.com/tools/sub_button,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中
3、添加订阅到有道
打开http://reader.youdao.com/tools.html,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中
4、订阅到QQ邮箱
我没有找到QQ邮箱添加订阅的代码生成页面,不过研究发现,你只要把链接http://mail.qq.com/cgi-bin/feed?u=http://domety.com/feed中的http://domety.com/feed改成你的RSS地址
下面是我做的一个例子,不过RSS源我链接的是新浪
<html> <head> <title>RSS demo</title> <META http-equiv=content-type content="text/html; charset=GBK"> <META content="MSHTML 6.00.2462.0" name=GENERATOR></HEAD> </head> <body> <a href="http://fusion.google.com/add?source=atgs&feedurl=http%3A//rss.sina.com.cn/news/marquee/ddt.xml"><img src="http://buttons.googlesyndication.com/fusion/add.gif" alt="Add to Google"></a><br /> <a target="_blank" title="订阅到鲜果 RSS阅读器" href="http://xianguo.com/subscribe?url=http%3A%2F%2Frss.sina.com.cn%2Fnews%2Fmarquee%2Fddt.xml"><img src="http://static.xgres.com/static/images/sub/sub_XianGuo_02.gif" border="0" alt="鲜果阅读器订阅图标" /></a><br /> <a href="http://mail.qq.com/cgi-bin/feed?u=http://rss.sina.com.cn/news/marquee/ddt.xml">订阅到QQ邮箱</a><br /> <a target="_blank" href="http://reader.youdao.com/b.do?keyfrom=bookmarklet&url=http%3A%2F%2Frss.sina.com.cn%2Fnews%2Fmarquee%2Fddt.xml"><img src="http://reader.youdao.com/images/feed-btn-4.gif" border="0" alt="订阅到有道阅读" /></a> </body> </html>
后面有找到了两个
5、订阅到MSN
只要把连接http://my.msn.com/addtomymsn.armx?id=rss&ut=http://rss.sina.com.cn/news/marquee/ddt.xml中的ut=后面的改为自己的RSS地址就可以了
6、订阅到雅虎
只要把连接http://add.my.yahoo.com/rss?url=http://rss.sina.com.cn/news/marquee/ddt.xml中的url=后面换成自己的RSS地址即可
相关文章推荐
- rome实现rss订阅与发布
- rome实现rss订阅与发布
- rome实现rss订阅与发布
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 通过批处理命令和计划任务实现程序的停止和监控重启动
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 通过 XML 实现 DataSource(数据源)注入
- 一种通过xmpp实现离线消息推送的方法及系统
- 通过VS中的数据源选择对话框简单实现数据库连接配置
- 程序通过创建线程实现删除自身
- 通过匿名管道实现进程间通信
- 在oracle中通过connect by prior来实现递归查询!
- 通过局域网实现远程唤醒功能
- python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
- Mybatis通过注解方式实现批量插入数据库 及 常见的坑
- 通过封装的AsyncTask类实现下载apk应用
- 通过Callable实现多线程
- HTML--如何实现通过鼠标事件拖动页面图像(代码)
- SQL Server 2008 通过配置数据库邮件实现发送邮件功能
- 通过Cache机制实现通用的配置管理模块(含源码)