Rome简介

Rome是为RSS聚合而开发的开源包,它可以支持0.91、0.92、0.93、0.94、1.0、2.0,可以说rss的版本基本上都支持了。

Rss简介

RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站,例如Blog。
RSS就是一种用来分发和汇集网页内容的XML格式!
RSS =Really Simple Syndication(真正简单的聚合 )或Rich Site Summary(丰富站点摘要 )
Rss目前已经被广泛的应用 也是xml应用中的最成功的一项。
RSS 没有统一标准,目前被使用的版本主要有0.91、1.0、2.0

RSS的理解

拿一个新闻网站来说,如果这个网站使用了RSS技术,也即表示这个网站按照RSS标准将其新闻罗列出来,生成一个RSS文件通常称为(RSS Feed,其实也就是一个*.xml文件)。其他网站或个人就订阅该新闻网站的新闻 ,其实也就是读取了新闻网站提供的RSS文件,既然说是”订阅“即表示这个过程是动态的,即主要体现在新闻网站上的内容更新了,浏览者也同时得到了更新后的内容。当然这要借助工具。
目的及作用
网站内容资源共享
可以自由选择想要浏览的新闻
不用一个网站一个网站,一个网页一个网页去逛了。只要这将你需要的内容订阅在一个RSS阅读器中,这些内容就会自动出现你的阅读器里,你也不必为了一个急切想知道的消息而不断的刷新网页,因为一旦有了更新,RSS阅读器就会自己通知你!

RSS的联合(Syndication)

发布一个RSS文件(一般称为RSS Feed)后,这个RSS Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用,如PDA、手机、邮件列表等。而且一个网站联盟(比如专门讨论旅游的网站系列)也能通过互相调用彼此的RSS Feed自动的显示网站联盟中其他站点上的最新信息,这就叫着RSS的联合。
这种联合就导致一个站点的内容更新越及时、RSS Feed被调用的越多,该站点的知名度就会越高,从而形成一种良性循环

RSS的聚合(Aggregation)

所谓RSS聚合,就是通过软件工具的方法从网络上搜集各种RSS Feed并在一个界面中提供给读者进行阅读。这些软件可以是在线的WEB工具 也可以是客户端软件

Rss浏览

RSS是一个纯xml文件,将RSS里的新闻友好的显示出来就要借助于RSS阅读器
RSS阅读器其实就是一个客户端软件或内嵌程序,将各个新闻站点提供的xml文件(RSS Feed)中内容读取出来,将所有新闻分门别类的显示在软件中。分类管理也就是所谓的频道管理。
Rss文件格式
下面是一个Rss文件(*.xml),里面的注释是自己加的,<!-- 和-->之间为注释。

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!-- 声明当前文件为xml文档【必】-->
  3. <rss version="2.0">
  4. <!-- 声明当前文件内容为rss格式文件,属性version(必须)指定当前rss版本【必】-->
  5. <channel>
  6. <!-- 固有节点【必】 -->
  7. <title>新闻中心-国内焦点新闻</title>
  8. <!-- 对网站和当前RSS 文件的简短描述【必】 -->
  9. <image>
  10. <!-- 为当前RSS添加图片 -->
  11. <title>新闻中心-国内焦点</title>
  12. <!-- 图片标题对图片的简单描述-->
  13. <link>http://news.sina.com.cn/china</link>
  14. <!-- 网站链接地址 -->
  15. <url>http://image2.sina.com.cn/dy/gn/in10.jpg</url>
  16. <!-- 图片的链接地址 -->
  17. </image>
  18. <description>国内焦点新闻列表</description>
  19. <!-- 对当前RSS文件的描述【必】 -->
  20. <link>http://news.sina.com.cn/china/index.shtml</link>
  21. <!-- 网站主页链接【必】 -->
  22. <language>zh-cn</language>
  23. <!-- 当前RSS使用的语言 -->
  24. <generator>WWW.SINA.COM.CN</generator>
  25. <!-- 当RSS文件为自动创建时多存在此节点(RSS文件由什么创建)-->
  26. <ttl>5</ttl>
  27. <!-- (ttl = time to live) 在刷新前当前RSS在cache中可以保存多长时间(分钟) -->
  28. <copyright>Copyright 1996 - 2005 SINA Inc. All Rights Reserved</copyright>
  29. <!-- 声明版权
  30. -->
  31. <pubDate>Wed, 26 Apr 2006 01:45:05 GMT</pubDate>
  32. <!-- 当前RSS最后发布的时间 -->
  33. <category/>
  34. <!-- 声明当前RSS内容的种类 -->
  35. <item>
  36. <!-- 一条信息 -->
  37. <title>最高检:严惩公务员利用审批等权力索贿受贿</title>
  38. <!-- 新闻标题【必】 -->
  39. <link>http://news.sina.com.cn/c/l/2006-04-26/08029720281.shtml</link>
  40. <!-- 新闻链接【必】 -->
  41. <author>WWW.SINA.COM.CN</author>
  42. <!-- 新闻作者 -->
  43. <guid>http://news.sina.com.cn/c/l/2006-04-26/08029720281.shtml</guid>
  44. <!-- guid>GUID=Globally Unique Identifier 为当前新闻指定一个全球唯一标示 -->
  45. <category>国内焦点新闻</category>
  46. <!-- 新闻种类 -->
  47. <pubDate>Wed, 26 Apr 2006 00:02:53 GMT</pubDate>
  48. <!-- 新闻最后发布时间 -->
  49. <comments/>
  50. <!-- 新闻注释 -->
  51. <description>新华网沈阳4月25日电 (记者 杨维汉、范春生)
  52. 最高人民检察院常务副检察长张耕说,对于国家公务员在商业活动中利用职权谋取非法利益、索贿受贿的案件,必须发现一起,坚决查处一起。特别是对国家公务员利用行政审批权、行政执法权和司法权执法犯法、贪赃枉法、索贿受贿,构成犯....
  53. </description>
  54. <!-- 新闻的简单描述【必】 -->
  55. </item>
  56. </channel>
  57. </rss>

第一行 声明当前文件是xml文档
第二行声明当前文件内容为rss格式文件,属性version(必须)指定当前rss版本为2.0
<channel>节点为Rss文档的固有节点,必须,无属性。
< item> 节点中即纪录了当前RSS Feed中要显示的内容。一个RSS文件中通常包含多个<item>节点

< channel>节点
必须节点
< title> 对网站和当前RSS 文件的简短描述
< link> 网站主页链接
< description> 对当前RSS文件的描述
可选节点
< image> 为当前RSS添加图片
< language> 当前RSS使用的语言
< generator>当RSS文件为自动创建时多存在此节点(RSS文件由什么创建)
< ttl>(ttl = time to live) 在刷新前当前RSS在cache中可以保存多长时间(分钟)
< copyright>声明版权
< pubDate> 当前RSS最后发布的时间
< category>声明当前RSS内容的种类
等等

< item>节点
< item> 纪录一条信息(新闻),只包含这条新闻的简单信息,一个RSS文件中包含几条新闻就会有几个<item>
必须节点
< title> 新闻标题
<link> 新闻链接
< description> 新闻的简单描述
可选节点
< author> 当前新闻的作者
< guid>GUID=Globally Unique Identifier 为当前新闻指定一个全球唯一标示
< category>当前新闻的类别
< pubDate>当前新闻的最后发布时间
< comments>当前新闻的注释
等等

附上实例源码:

  1. import java.io.ByteArrayInputStream;
  2. import java.io.IOException;
  3. import java.net.URL;
  4. import java.net.URLConnection;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8. import java.util.zip.GZIPInputStream;
  9.  
  10. import com.sun.syndication.feed.rss.Channel;
  11. import com.sun.syndication.feed.rss.Description;
  12. import com.sun.syndication.feed.rss.Guid;
  13. import com.sun.syndication.feed.rss.Item;
  14. import com.sun.syndication.feed.synd.SyndEntry;
  15. import com.sun.syndication.feed.synd.SyndFeed;
  16. import com.sun.syndication.io.FeedException;
  17. import com.sun.syndication.io.SyndFeedInput;
  18. import com.sun.syndication.io.WireFeedOutput;
  19. import com.sun.syndication.io.XmlReader;
  20.  
  21. //http://rss.webofknowledge.com/rss?e=4f1b64b6b221ea05&c=8c6909b93bf3eb38a2066a826b61a412
  22. public class Test {
  23. public static void main(String[] args) {
  24. try {
  25. // parseXml(new
  26. // URL("http://rss.webofknowledge.com/rss?e=4f1b64b6b221ea05&c=8c6909b93bf3eb38a2066a826b61a412"));
  27. parseXml(new URL("http://127.0.0.1:8080/xd/rss?q=java&t=atom&h=50&s=50"));
  28. String xml = createXml();
  29. parseString(xml);
  30. } catch (Exception e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. private static void parseString(String xml) throws Exception {
  37.  
  38. SyndFeedInput input = new SyndFeedInput();
  39. SyndFeed feed = null;
  40. ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
  41. feed = input.build(new XmlReader(inputStream));
  42. List entries = feed.getEntries();// 得到所有的标题<title></title>
  43. for (int i = 0; i < entries.size(); i++) {
  44. SyndEntry entry = (SyndEntry) entries.get(i);
  45. System.out.println(entry.getTitle());
  46. }
  47. System.out.println("feed size:" + feed.getEntries().size());
  48. }
  49.  
  50. /**
  51. * 根据链接地址得到数据
  52. */
  53. public static void parseXml(URL url) throws IllegalArgumentException,
  54. FeedException {
  55. try {
  56. SyndFeedInput input = new SyndFeedInput();
  57. SyndFeed feed = null;
  58. URLConnection conn;
  59. conn = url.openConnection();
  60. String content_encoding = conn.getHeaderField("Content-Encoding");
  61. if (content_encoding != null && content_encoding.contains("gzip")) {
  62. System.out.println("conent encoding is gzip");
  63. GZIPInputStream gzin = new GZIPInputStream(
  64. conn.getInputStream());
  65. feed = input.build(new XmlReader(gzin));
  66. } else {
  67. feed = input.build(new XmlReader(conn.getInputStream()));
  68. }
  69.  
  70. List entries = feed.getEntries();// 得到所有的标题<title></title>
  71. for (int i = 0; i < entries.size(); i++) {
  72. SyndEntry entry = (SyndEntry) entries.get(i);
  73. System.out.println(entry.getTitle());
  74. }
  75. System.out.println("feed size:" + feed.getEntries().size());
  76.  
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80.  
  81. }
  82.  
  83. public static String createXml() throws Exception {
  84. /* 根据Channel源码提供的英文,Channel对象有两个构造器,一个默认的无参构造器用于clone对象,一个是有参的
  85. * 我们自己指定的必须使用有参数的(因为我们需要许可证),指构造方法必须要创建一个type(版本),这个type不能随便写,必须要以rss_开头的版本号
  86. * Licensed under the Apache License, Version 2.0 (the "License");
  87. * 因为当前版本是2.0,所以就是rss_2.0,必须是rss_2.0否则会抛异常,该源码中写的已经很明白。
  88. */
  89. Channel channel = new Channel("rss_2.0");
  90. channel.setTitle("channel标题");//网站标题
  91. channel.setDescription("channel的描述");//网站描述
  92. channel.setLink("www.shlll.net");//网站主页链接
  93. channel.setEncoding("utf-8");//RSS文件编码
  94. channel.setLanguage("zh-cn");//RSS使用的语言
  95. channel.setTtl(5);//time to live的简写,在刷新前当前RSS在缓存中可以保存多长时间(分钟)
  96. channel.setCopyright("版权声明");//版权声明
  97. channel.setPubDate(new Date());//RSS发布时间
  98. List<Item> items = new ArrayList<Item>();//这个list对应rss中的item列表
  99. Item item = new Item();//新建Item对象,对应rss中的<item></item>
  100. item.setAuthor("hxliu");//对应<item>中的<author></author>
  101. item.setTitle("新闻标题");//对应<item>中的<title></title>
  102. item.setGuid(new Guid());//GUID=Globally Unique Identifier 为当前新闻指定一个全球唯一标示,这个不是必须的
  103. item.setPubDate(new Date());//这个<item>对应的发布时间
  104. item.setComments("注释");//代表<item>节点中的<comments></comments>
  105. //新建一个Description,它是Item的描述部分
  106. Description description = new Description();
  107. description.setValue("新闻主题");//<description>中的内容
  108. item.setDescription(description);//添加到item节点中
  109. items.add(item);//代表一个段落<item></item>,
  110. channel.setItems(items);
  111. //用WireFeedOutput对象输出rss文本
  112. WireFeedOutput out = new WireFeedOutput();
  113. try {
  114. String xml = out.outputString(channel);
  115. System.out.println(xml);
  116. return xml;
  117. } catch (IllegalArgumentException e) {
  118. e.printStackTrace();
  119. } catch (FeedException e) {
  120. e.printStackTrace();
  121. }
  122. return null;
  123. }
  124. }
  1. import java.net.URL;
  2. import java.util.List;
  3.  
  4. import com.sun.syndication.feed.synd.SyndCategory;
  5. import com.sun.syndication.feed.synd.SyndContent;
  6. import com.sun.syndication.feed.synd.SyndEnclosure;
  7. import com.sun.syndication.feed.synd.SyndEntry;
  8. import com.sun.syndication.feed.synd.SyndFeed;
  9. import com.sun.syndication.io.SyndFeedInput;
  10. import com.sun.syndication.io.XmlReader;
  11.  
  12. //http://zmfkplj.iteye.com/blog/461398
  13. public class TestParse {
  14. public static void main(String[] args) {
  15. TestParse test = new TestParse();
  16. test.parseRss();
  17. }
  18.  
  19. public void parseRss() {
  20. //String rss = "http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss&sub=0]http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss&sub=0";
  21. String rss = "http://rss.sina.com.cn/ent/hot_roll.xml";
  22. try {
  23. URL url = new URL(rss);
  24. // 读取Rss源
  25. XmlReader reader = new XmlReader(url);
  26. System.out.println("Rss源的编码格式为:" + reader.getEncoding());
  27. SyndFeedInput input = new SyndFeedInput();
  28. // 得到SyndFeed对象,即得到Rss源里的所有信息
  29. SyndFeed feed = input.build(reader);
  30. //System.out.println(feed);
  31. // 得到Rss新闻中子项列表
  32. List entries = feed.getEntries();
  33. // 循环得到每个子项信息
  34. for (int i = 0; i < entries.size(); i++) {
  35. SyndEntry entry = (SyndEntry) entries.get(i);
  36. // 标题、连接地址、标题简介、时间是一个Rss源项最基本的组成部分
  37. System.out.println("标题:" + entry.getTitle());
  38. System.out.println("连接地址:" + entry.getLink());
  39. SyndContent description = entry.getDescription();
  40. System.out.println("标题简介:" + description.getValue());
  41. System.out.println("发布时间:" + entry.getPublishedDate());
  42. // 以下是Rss源可先的几个部分
  43. System.out.println("标题的作者:" + entry.getAuthor());
  44. // 此标题所属的范畴
  45. List categoryList = entry.getCategories();
  46. if (categoryList != null) {
  47. for (int m = 0; m < categoryList.size(); m++) {
  48. SyndCategory category = (SyndCategory) categoryList.get(m);
  49. System.out.println("此标题所属的范畴:" + category.getName());
  50. }
  51. }
  52. // 得到流媒体播放文件的信息列表
  53. List enclosureList = entry.getEnclosures();
  54. if (enclosureList != null) {
  55. for (int n = 0; n < enclosureList.size(); n++) {
  56. SyndEnclosure enclosure = (SyndEnclosure) enclosureList.get(n);
  57. System.out.println("流媒体播放文件:" + entry.getEnclosures());
  58. }
  59. }
  60. System.out.println();
  61. }
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }

附上源码下载:http://download.csdn.net/detail/earbao/7540321

转载自:http://blog.csdn.net/earbao/article/details/33741185#comments

java使用Rome解析Rss的实例(转)的更多相关文章

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

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

  2. java 多继承的典型应用实例(不同的报文不同的方法去解析)

    关于 java 多继承的典型应用实例 针对不同业务类型的XML文件的解析 在PCS 项目: public class CainiaoXMLMessageResolverServiceImpl impl ...

  3. rome实现rss订阅与发布

    1. 什么是RSS RSS也叫聚合RSS,是在线共享内容的一种简易方式(也叫聚合内容, 简易供稿,Really Simple Syndication(真正简单的聚合 )).通常在时效性比较强的内容上使 ...

  4. java中注解的使用与实例 (二)

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  5. 【转】java中注解的使用与实例

    原文:http://www.cnblogs.com/pepcod/archive/2013/02/20/2918719.html java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单. ...

  6. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  7. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  8. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  9. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. H5 表单标签

    33-表单标签3 列表数据 注意点: 1.下拉列表不能输入内容, 但是可以直接在列表中选择内容 2.可以通过给option标签添加一个selected属性来指定列表的默认值 3.可以通过给option ...

  2. 使用 Travis CI 实现项目的持续测试反馈

    [篇幅较长,10.15前补充完毕,如希望探索可直接移步Github仓库:https://github.com/SivilTaram/CITest] 在编程课中,我们可以使用成熟的在线评测系统来测试某个 ...

  3. Windows之系统自带截屏快捷键

    Windows之系统自带截屏快捷键 现在我们都习惯了使用QQ截屏,但是有时候电脑没有网络,也就意味着无法登陆QQ,在这个时候再有截屏的需求时,我们就束手无策了. 截取全屏 现在我说以个Windows系 ...

  4. laravel log改为时间格式

    1 providers新建文件 LogRotateServiceProvider.php <?php namespace App\Providers; use Monolog\Formatter ...

  5. tomcat server.xml各个端口的作用

    <Server port="8005" shutdown="SHUTDOWN"> <!-- port:指定一个端口,这个端口负责监听关闭Tom ...

  6. (一)类数组对象NodeList

    NodeList对象的特点: NodeList是一种类数组对象,用于保存一组有序的节点. 可以通过方括号语法来访问NodeList的值,有item方法与length属性. 它并不是Array的实例,没 ...

  7. Spring Boot+Jsp启动异常

    No Java compiler available for configuration options compilerClassName 加入maven配置 <dependency> ...

  8. HTML4到HTML5

    第一步: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html ...

  9. git上传本地代码到github

      1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小 ...

  10. 【apache2】AH00543: httpd: bad user name apache

    当启动 apache 时,出现一下异常:AH00543: httpd: bad user name daemon 解决方法:            #groupadd daemon          ...