1. 什么是RSS

RSS也叫聚合RSS,是在线共享内容的一种简易方式(也叫聚合内容, 简易供稿,Really Simple Syndication(真正简单的聚合 ))。通常在时效性比较强的内容上使用RSS订阅能更快速获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新. RSS是XML的一种。所有的RSS文档都遵循XML 1.0规范,该规范发布在W3C网站上。拿一个新闻网站来说,如果这个网站使用了RSS技术,也即表示这个网站按照RSS标准将其新闻罗列出来,生成一个RSS文件通常称为(RSS Feed,其实也就是一个*.xml文件)。其他网站或个人就订阅该新闻网站的新闻 ,其实也就是读取了新闻网站提供的RSS文件,既然说是”订阅“即表示这个过程是动态的,即主要体现在新闻网站上的内容更新了,浏览者也同时得到了更新后 的内容。当然这要借助工具。

2. RSS用途

1) .订阅BLOG   

可以订阅工作中所需的技术文章,也可以订阅与你有共同爱好的作者的Blog,总之,对什么感兴趣就可以订什么。

2) 订阅新闻  

无论是奇闻怪事、明星消息、体坛风云,只要你想知道的,都可以订阅。 你再也不用一个网站一个网站,一个网页一个网页去逛了。只要这将你需要的内容订阅在一个RSS阅读器中,这些内容就会自动出现你的阅读器里,你也不必为了一个急切想知道的消息而不断的刷新网页,因为一旦有了更新,RSS阅读器就会自己通知你

3. RSS标准

1) RSS标准比较混乱,主要有以下3个系:

• RSS 0.9x / 2.0 : RSS技术诞生于1999年的网景公司(Netscape),其发布了一个0.9版本的规范。2001年,RSS技术标准的发展工作被Userland Software公司的戴夫 温那(Dave Winer)所接手。陆续发布了0.9x的系列版本。当W3C小组发布RSS 1.0后,Dave Winer不承认其有效性。并于2002年9月独自把RSS升级到了2.0版本(Really Simple Syndication),并交由哈佛大学Technology at Harvard Law进行维护。

• RSS 1.0 : 在RSS发展过程中,为使RSS成为一个通用的规范,并进一步标准化。一个联合小组根据W3C新一代的Resource Description Framework (RDF) 对RSS进行了重新定义,发布了RSS 1.0版,并把RSS定义为“RDF Site Summary”。现在RSS 1.0版由W3C联合小组维护。

• Atom : Atom是一个项目的名字,主要是开发一个新的博客摘要格式以解决目前RSS存在的问题(混乱的版本号,不是一个真正的开放标准,表示方法的不一致,定义贫乏等等)。

2) RSS 2.0代码样例

  1. <!-- XML版本和字符集 -->
  2.   <?xml version="1.0"?>
  3.   <!-- RSS版本 -->
  4.   <rss version="2.0">
  5.   <!-- 以下为频道信息及新闻列表 -->
  6.   <channel>
  7.   <!-- 频道总体信息:开始 -->
  8.   <!-- 频道标题 -->
  9.   <title>Lift Off News</title>
  10.   <!-- 频道链接的总地址 -->
  11.   <link>http://liftoff.msfc.nasa.gov/</link>
  12.   <!-- 频道描述文字 -->
  13.   <description>Liftoff to Space Exploration.</description>
  14.   <!-- 频道使用的语言(zh-cn表示简体中文) -->
  15.   <language>en-us</language>
  16.   <!-- 频道发布的时间 -->
  17.   <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
  18.   <!-- 频道最后更新的时间-->
  19.   <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>
  20.   <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  21.   <!-- 频道生成器 -->
  22.   <generator>Weblog Editor 2.0</generator>
  23.   <managingEditor>editor@example.com</managingEditor>
  24.   <webMaster>webmaster@example.com</webMaster>
  25.   <ttl>5</ttl>
  26.   <!-- 频道总体信息:结束 -->
  27.   <!-- 每条RSS新闻信息都包含在item节点中, -->
  28.   <item>
  29.   <!-- 新闻标题 -->
  30.   <title>Star City</title>
  31.   <!-- 新闻链接地址 -->
  32.   <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
  33.   <!-- 新闻内容简要描述 -->
  34.   <description>How do Americans get ready to work with Russians aboard the
  35.   International Space Station? They take a crash course in culture, language
  36.   and protocol at Russia's Star City.</description>
  37.   <!-- 新闻发布时间 -->
  38.   <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
  39.   <!-- 新闻目录 -->
  40.   <category>IT</category>
  41.   <!-- 新闻作者 -->
  42.   <author>bill</author>
  43.   <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>
  44.   </item>
  45.   <item>
  46.   <title>Space Exploration</title>
  47.   <link>http://liftoff.msfc.nasa.gov/</link>
  48.   <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada
  49.   will experience a partial eclipse of the Sun on Saturday, May 31st.</description>
  50.   <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
  51.   <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>
  52.   </item>
  53.   <item>
  54.   <title>The Engine That Does More</title>
  55.   <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>
  56.   <description>Before man travels to Mars, NASA hopes to design new engines
  57.   that will let us fly through the Solar System more quickly. The proposed
  58.   VASIMR engine would do that.</description>
  59.   <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>
  60.   <guid>http://www.zhanghangfeng.cn/rss.xml</guid>
  61.   </item>
  62.   <item>
  63.   <title>Astronauts' Dirty Laundry</title>
  64.   <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
  65.   <description>Compared to earlier spacecraft, the International Space
  66.   Station has many luxuries, but laundry facilities are not one of them.
  67.   Instead, astronauts have other options.</description>
  68.   <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
  69.   <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
  70.   </item>
  71.   </channel>
  72.   </rss>

4. 如何实现RSS RSS标准虽然混乱,但是其本质都是XML文档。你可以只使用notepad, 按照某个RSS标准, 手写一个xml, 并提供给客户端。现在也有许多开源项目来提供RSS的解决方案。

Rome https://rome.dev.java.net/

RSSLibJ http://enigmastation.com/rsslibj/

RSSLib4J http://devzone.stealthp.org/cms/index.php?page=RSSLib4J

使用这些解决方案可以更方便的处理RSS.

5. Rome简介

rome是dev.java.net下的一个开源的项目,是一个“解析、创建、发布RSS和ATOM格式”的工具集,支持RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, and Atom 1.0 等众多版本,对rss和atom中的各个模块都进行了很好的封装,功能很强大。

6. 用 Rome 实现 RSS 服务

6.1). 环境准备要使用Rome技术必须在工程中包含以下两个jar包: jdom-1.0.jar 和rome-1.0.jar,且jdom的版本也必须相对应.

6.2). Rome类关系模型

6.3)发布Rss,格式符合RSS标准的要求

  1. public class RssPublish {
  2. /**
  3. * 使用类Channel & Item
  4. */
  5. public void ChannleItemXml() {
  6. DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd");
  7. Date date = new Date();
  8. Channel channel = new Channel("rss_2.0"); // 该type参数为固定格式
  9. channel.setTitle("test rome channel title");
  10. channel.setDescription("channel的描述");
  11. channel.setLink("http://hi.baidu.com/openj/rss");
  12. channel.setPubDate(date);
  13. channel.setEncoding("GBK");
  14. List items = new ArrayList();
  15. Item item = new Item();
  16. item.setAuthor("zhangwei");
  17. item.setTitle("item title");
  18. Description desc = new Description();
  19. desc.setType("item desc type");
  20. desc.setValue("item desc value");
  21. item.setDescription(desc);
  22. items.add(item);// 添加一个item
  23. Item item2 = new Item();
  24. item2.setAuthor("zhangwei");
  25. item2.setTitle("use rome to read rss");
  26. Description desc2 = new Description();
  27. desc2.setValue("you must import rome_1.0.jar & jdom.jar");
  28. item2.setDescription(desc2);
  29. Content content = new Content();
  30. content.setValue("rome是用来发布读取rss的工具,遵循rss标准的XML");
  31. item2.setContent(content);
  32. items.add(item2);// 添加一个item
  33. channel.setItems(items);
  34. WireFeedOutput out = new WireFeedOutput();
  35. try {
  36. // Channel继承与WireFeed
  37. System.out.println(out.outputString(channel));
  38. } catch (FeedException ex) {
  39. ex.printStackTrace();
  40. }
  41. }
  42. /**
  43. * 使用接口SyndFeed & SyndEntry
  44. */
  45. public void SyndFeedXml() {
  46. DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd");
  47. Date date = new Date();
  48. SyndFeed feed = new SyndFeedImpl();
  49. feed.setFeedType("rss_2.0"); // 该type参数为固定格式
  50. feed.setTitle("test rome channel title");
  51. feed.setDescription("channel的描述");
  52. feed.setLink("http://hi.baidu.com/openj/rss");
  53. feed.setPublishedDate(date);
  54. List items = new ArrayList();
  55. SyndEntry entry = new SyndEntryImpl();
  56. entry.setAuthor("zhangwei");
  57. entry.setTitle("item title");
  58. SyndContent desc = new SyndContentImpl();
  59. desc.setType("item desc type");
  60. desc.setValue("item desc value");
  61. entry.setDescription(desc);
  62. items.add(entry);// 添加一个entry
  63. entry = new SyndEntryImpl();
  64. entry.setAuthor("zhangwei");
  65. entry.setTitle("use rome to read rss");
  66. desc = new SyndContentImpl();
  67. desc.setType("plain/text");
  68. desc.setValue("you must import rome_1.0.jar & jdom.jar");
  69. entry.setDescription(desc);
  70. items.add(entry);// 添加一个entry
  71. feed.setEntries(items);
  72. SyndFeedOutput out = new SyndFeedOutput();
  73. try {
  74. System.out.println(out.outputString(feed));
  75. } catch (FeedException ex) {
  76. ex.printStackTrace();
  77. }
  78. }
  79. }

6.4)Rome实现代理订阅RSS

  1. public class RssReader
  2. {
  3. public void ReadFeedXml()
  4. {
  5. try
  6. {
  7. System.setProperty("http.proxyHost", "10.191.131.13");
  8. System.setProperty("http.proxyPort", "3128");
  9. String authStr = "account:password";
  10. String auth = "Basic " + new BASE64Encoder().encode(authStr.getBytes());
  11. URL feedurl = new URL("http://rss.sina.com.cn/news/marquee/ddt.xml"); //指定rss位置
  12. URLConnection uc = feedurl.openConnection();
  13. //设定代理
  14. uc.setRequestProperty("Proxy-Authorization", auth);
  15. uc.addRequestProperty("Referer", "localhost");
  16. SyndFeedInput input = new SyndFeedInput();
  17. SyndFeed feed = input.build(new XmlReader(uc));
  18. List entries = feed.getEntries();
  19. for (int i = 0; i < entries.size(); i++)
  20. {
  21. SyndEntry entry = (SyndEntry) entries.get(i);
  22. System.out.print(entry.getTitle());
  23. System.out.print(entry.getLink());
  24. }
  25. }
  26. catch (Exception ex)
  27. {
  28. ex.printStackTrace();
  29. }
  30. }
  31. }

参考:

http://blog.csdn.net/wengyupeng/archive/2008/07/28/2723958.aspx
http://blog.csdn.net/yefei679/archive/2009/03/15/3992851.aspx
http://www.fengfly.com/plus/view-168104-1.html
http://wangcheng.javaeye.com/blog/53778

rome实现rss订阅与发布的更多相关文章

  1. Web版RSS阅读器(三)——解析在线Rss订阅

    上篇博客<Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表>已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资 ...

  2. 做个简单的RSS订阅(ASP.NET Core),节省自己的时间

    0x01 前言 因为每天上下班路上,午休前,都是看看新闻,但是种类繁多,又要自己找感兴趣的,所以肯定会耗费不少时间. 虽说现在有很多软件也可以订阅一些自己喜欢的新闻,要安装到手机,还是挺麻烦的.所以就 ...

  3. Rss 订阅:php动态生成xml格式的rss文件

    Rss 简介: 简易信息聚合(也 叫聚合内容)是一种描述和同步网站内容的格式.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RS ...

  4. .Net开发者必知的技术类RSS订阅指南

    目录 RSS订阅资源 .Net基金会 MSDN中文版 杂志 微软 Github 系列 微软DevBlog系列 InfoQ中文版系列 如何找到大佬的 Twitter/Youtube/Stackoverf ...

  5. 如何用RSS订阅?

    本文由云+社区发表 摘要:我们常常会有订阅别人文章的需求,有更新的时候希望能有提醒的功能,RSS就是这样一个订阅的方式.很多网站上看到RSS的入口,点进去以后总是显示一堆的XML代码,我们来看看怎么使 ...

  6. 使用ROME解析rss,如何获取icon图标

    问题 网站使用SpringMVC框架,实现了RSS订阅,但是在阅读器里面,只有网站的标题,没有网站的图标. 分析 ROME会从<channel>标签下指定的<link>地址中, ...

  7. 在自己的网站上使用RSS订阅功能

    要增加RSS订阅功能其实很简单 就是填写一个规定好的xml文档,按照要求填好就可以实现 具体的步骤如下: 这是在网上查到的RSSxml文档 <?xml version="1.0&quo ...

  8. 给博客添加rss订阅

    如果是自己搭建博客,有一个问题是如何写一篇新的文章就可以告诉读者,你写了一篇新的?一个简单方法是使用 rss ,RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple ...

  9. 2019-9-2-给博客添加rss订阅

    title author date CreateTime categories 给博客添加rss订阅 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...

随机推荐

  1. Linux C double linked for any data type

    /************************************************************************** * Linux C double linked ...

  2. js二级下拉被flash档住的解决办法

    在<object></object>及以内的代码加入到<script>标签对内 <script language="javascript" ...

  3. curl文件上传有两种方式,一种是post_fileds,一种是infile

    curl文件上传有两种方式,一种是POSTFIELDS,一种是INFILE,POSTFIELDS传递@实际地址,INFILE传递文件流句柄! );curl_setopt($ch, CURLOPT_PO ...

  4. 《Unix网络编程》卷2 读书笔记 第1章-简介

    1. 概述 2. 进程.线程与信息共享 Unix进程间的信息共享有多种方式:注意下图中内核的位置   左边的两个进程共享存留于文件系统中某个文件上的某些信息.为访问这些信息,每个进程都得穿越内核. 中 ...

  5. oracle之检查点(Checkpoint)

    检查点是一个数据库事件,它把修改数据从高速缓存写入磁盘,并更新控制文件和数据文件.检查点分为三类:1)局部检查点:单个实例执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件. ...

  6. DOM笔记(六):怎么进行JQuery扩展?

    一.全局函数的扩展 全局函数是将独立的函数添加到JQuery的命名空间中区.在使用的时候,可以通过$.fucnName(param)或者jQuery.funcName(param)方式进行调用. 1. ...

  7. 【C#】如何创建xml文件以及xml文件的增、改

    增: using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpre ...

  8. C++中的基类与派生类

    派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的成员被派生类继承后,保持原来的状态 private 基类的public和protected的成员被派生类继 ...

  9. Python 统计文本中单词的个数

    1.读文件,通过正则匹配 def statisticWord(): line_number = 0 words_dict = {} with open (r'D:\test\test.txt',enc ...

  10. 从四大音乐APP首页设计对比分析产品方向

    原帖:http://www.ui.cn/detail/63201.html 本文章中作者例举四个音乐APP应用:虾米.网易.百度.QQ首页 1. 推荐内容:作者将四个首页界面划分出官方推荐与个性化推荐 ...