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. Openerp上传中文名附件,下载时报错的处理方法

    文档管理中,如果上传的文件名含有中文字符,下载时会提示出错,如没有权限等.这个问题困惑我比较久的时间,通过跟踪openerp_server.log,可以看到类似提示: 2012-09-28 21:51 ...

  2. AngularJS分页实现

    基本思路 一开始页码为1,Service向服务器端获取对应信息:点击上/下一页/跳转,通过对应的页码向服务器端获取对应的信息. 由于后台暂时没弄好,我实现的过程中直接读取准备好的JSON文件,通过页码 ...

  3. 【转】很有用但鲜有人知的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  4. HDU 5353 Average 糖果分配(模拟,图)

    题意:有n个人坐在圆桌上,每个人带着糖果若干,每次只能给旁边的人1科糖果,而且坐相邻的两个人最多只能给一次(要么你给我,要么我给你),问是否能将糖果平均分了. 思路: 明显每个人最多只能多于平均值2个 ...

  5. (转)每天一个Linux命令(6):mv

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  6. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...

  7. JS面向对象组件(二)--Javascript原型链

    原型链 : 实例对象与原型之间的连接,叫做原型链 –__proto__( 隐式连接 ),这就是原型链,平时我们是看不到的. 原型链的最外层 : Object.prototype function Aa ...

  8. 代理抓取RSS信息

    最近工作很闲,就自己写了一个可以看RSS订阅的网站.话说,RSS阅读器到处都是,随便下一个就可以了,为什么还去做一个网站形式的呢?作为一个热(xian)爱(de)前(dan)端(teng)的程序员,我 ...

  9. 游戏BI,起步了。

    思索许久,终于决定自己的发展将会是游戏的BI. 即说即做,本文是我未来BI工作的开端. 传统的游戏BI,只是将运营的工作数据化,流量的变现指标化.和网站类似,无外乎用户导入,流失,保有,付费,回访等等 ...

  10. 通知(Toast+Notification)

    Toast简要说明:(前面已经用过好多次了) Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图. 它不阻断用户的操作,一般用于显示一些不重要的信息.(比方说设置音量 ...