如何使用java代码获取RSS中信息

简介:

RSS基础知识概述:

 RSS 这个概念,伴随着“博客(Weblog)”这个词语的出现,已经好几岁了。

什么是RSS呢,它缩写是 "Really Simple Syndication", 支撑技术是xml,作用是用于在线共享内容,订阅新闻、博客等等。因为博客是“文章密集型”的,所以RSS可以把文章的概述信息都放在一个一个的摘要(item)里面,每个item有文章的概述,以及到文章全部内容的超级链接,所以有了RSS摘要,基本上配合RSS 阅读器,可以很快的得到所需要的信息。

以下是一个RSS文件的标准结构:

 
 
  1. <rss version="2.0"> 
  2. <channel> 
  3. <title>...</title> 
  4. <link>...</link> 
  5. <description>...</description> 
  6. <copyright>...</copyright> 
  7. <generator>...</generator> 
  8. <lastBuildDate>...</lastBuildDate> 
  9. <image>...</image> 
  10. <item>...</item> 
  11. <item>...</item> 
  12. ... 
  13. <item>...</item> 
  14. <item>...</item> 
  15. </channel> 
  16. </rss> 

 其中rss元素是其根元素,它吧所有的内含信息包含在一个频道<channel>中,频道有许多meta信息,就是出现在<item>前面的所有子元素。而rss中的所有摘要,都以<item>元素的形式出现,一个<channel>可以有多个<item>。每个<item>同样有元信息,最重要的是描述<description>和链接<link>。

现在有很多工具可以生成RSS,事实上,因为本质上RSS是一个XML文件,所以你完全可以以手工编写XML文件的形式编写RSS,但是还是推荐用工具来简化操作和减少错误,我最喜欢用的工具是:http://www.onlinedown.net/soft/73066.htm

 

其实,不仅仅RSS阅读器可以获取RSS信息,我们用java API也是可以的。比较有名的是sourceforge的rsslib4j 包,我们这里就展示这个包的用法:

这个包可以到http://sourceforge.net/projects/rsslib4j/ 去下,对应的javadoc地址是http://rsslib4j.sourceforge.net/javadoc/ 

 

实验部分:

我们演示2个例子,一个是读取本地rss文件的信息,一个是读取网络上某rss文件的信息:

首先我们开发了一个工具类,这个类的工具方法可以分离出相关信息并且转为字符串形式:

 
 
  1. package com.charles.learnrss; 
  2.  
  3. import java.util.List; 
  4.  
  5. import org.gnu.stealthp.rsslib.RSSChannel; 
  6. import org.gnu.stealthp.rsslib.RSSHandler; 
  7. import org.gnu.stealthp.rsslib.RSSImage; 
  8. import org.gnu.stealthp.rsslib.RSSItem; 
  9.  
  10. /* 
  11.  *  This file is confidential by Charles.Wang 
  12.  *  Copyright belongs to Charles.wang 
  13.  *  You can make contact with Charles.Wang (charles_wang888@126.com) 
  14.  */ 
  15.  
  16.  
  17. public class RSSInfoRetriever { 
  18.  
  19.     public static String getRSSInfo(RSSHandler handler){ 
  20.          
  21.          
  22.         StringBuffer rssInfo = new StringBuffer(); 
  23.          
  24.         //取得rss提要的频道信息(Channel) 
  25.         RSSChannel channel = handler.getRSSChannel(); 
  26.          
  27.         //Part1: 分离出rss频道的元信息 
  28.         //(1)频道的标题 
  29.         String titleInfo = channel.getTitle(); 
  30.         //(2)频道的链接信息 
  31.         String linkInfo = channel.getLink(); 
  32.         //(3)频道的描述信息  
  33.         String descriptionInfo = channel.getDescription(); 
  34.         //(4)频道使用的语言 
  35.         String languageInfo = channel.getLanguage(); 
  36.         //(5)频道版权信息 
  37.         String copyrightInfo = channel.getCopyright(); 
  38.         //(6)频道的generator的信息 
  39.         String generatorInfo = channel.getGenerator(); 
  40.         //(7)频道的image信息 
  41.         RSSImage channelImage = channel.getRSSImage(); 
  42.         String channelImageUrl = channelImage.getUrl(); 
  43.          
  44.          
  45.         rssInfo.append("频道标题: "+titleInfo+"\n"); 
  46.         rssInfo.append("频道相关Link信息: "+linkInfo+"\n"); 
  47.         rssInfo.append("频道描述信息: "+descriptionInfo+"\n"); 
  48.         rssInfo.append("频道使用的语言: "+languageInfo+"\n"); 
  49.         rssInfo.append("频道版权信息: "+copyrightInfo+"\n"); 
  50.         rssInfo.append("频道产生器信息: "+generatorInfo+"\n"); 
  51.         rssInfo.append("频道图片URL: "+channelImageUrl+"\n"); 
  52.          
  53.         //Part2: 分离出rss频道的所有摘要(feed),这里用item表示 
  54.         List channelItems = channel.getItems(); 
  55.         int itemSize= channelItems.size(); 
  56.         if(itemSize >=1){ 
  57.             rssInfo.append("\n"); 
  58.             rssInfo.append("一共有 "+itemSize+"个摘要在这个频道中"); 
  59.             rssInfo.append("\n"); 
  60.             for (int i=0;i<itemSize;i++){ 
  61.                 int itemNo = i+1
  62.                 RSSItem item = (RSSItem)channelItems.get(i); 
  63.                  
  64.                 rssInfo.append("\n"); 
  65.                 rssInfo.append("摘要"+itemNo+":"); 
  66.                  
  67.                 //(1)摘要的作者 
  68.                 String itemAuthor = item.getAuthor(); 
  69.                 //(2)摘要的标题 
  70.                 String itemTitle = item.getTitle(); 
  71.                 //(3)摘要的描述 
  72.                 String itemDescription = item.getDescription(); 
  73.                 //(4)摘要的链接 
  74.                 String itemLink = item.getLink(); 
  75.                 //(5)摘要的发布日期 
  76.                 String itemPubDate = item.getPubDate(); 
  77.                  
  78.                 rssInfo.append("作者: "+itemAuthor+"\n"); 
  79.                 rssInfo.append("标题: "+itemTitle+"\n"); 
  80.                 rssInfo.append("描述: "+itemDescription+"\n"); 
  81.                 rssInfo.append("链接: "+itemLink+"\n"); 
  82.                 rssInfo.append("发布日期: "+itemPubDate+"\n"); 
  83.                  
  84.                 rssInfo.append("\n"); 
  85.             } 
  86.         } 
  87.          
  88.          
  89.          
  90.          
  91.          
  92.         return rssInfo.toString(); 
  93.          
  94.     } 

 

然后我们写了一个驱动类,这个驱动类封装了2个实验:

 
 
  1. package com.charles.demo; 
  2.  
  3. import java.net.URL; 
  4.  
  5. import org.gnu.stealthp.rsslib.RSSChannel; 
  6. import org.gnu.stealthp.rsslib.RSSException; 
  7. import org.gnu.stealthp.rsslib.RSSHandler; 
  8. import org.gnu.stealthp.rsslib.RSSParser; 
  9.  
  10. import com.charles.learnrss.RSSInfoRetriever; 
  11.  
  12. /** 
  13.  *  
  14.  * Description: 
  15.  *  
  16.  * @author charles.wang 
  17.  * @created May 10, 2012 9:07:13 AM 
  18.  *  
  19.  */ 
  20. public class RSSInfoRetrieverDemo { 
  21.  
  22.     // 这里定义一个本地的rss摘要,(对应我的博客空间) 
  23.     public static final String localRSS = "charles.rss"
  24.      
  25.     //这里定义一个远程的rss摘要的地址(对应人民网) 
  26.     public static final String remoteRSS="http://www.people.com.cn/rss/politics.xml"
  27.  
  28.     public static void main(String[] args) throws Exception { 
  29.  
  30.          
  31.         // DEMO 1: 让RSSParser去解析本地某个rss文件 
  32.         // 取得本地的rss 
  33.         RSSHandler localRSSHandler = new RSSHandler(); 
  34.         RSSParser.parseXmlFile(localRSS, localRSSHandler, false); 
  35.         // 取得rss元素的信息并且打印在控制台上 
  36.         String localRSSInfo=RSSInfoRetriever.getRSSInfo(localRSSHandler); 
  37.         System.out.println("*************Charles博客的 rss信息如下****************"); 
  38.         System.out.println(localRSSInfo); 
  39.         System.out.println("****************************************************"); 
  40.              
  41.  
  42.         // DEMO 2: 让RSSParser去解析远程rss的url 
  43.         // 取得远程的rss 
  44.         RSSHandler remoteRSSHandler = new RSSHandler(); 
  45.         RSSParser.parseXmlFile(new URL(remoteRSS), remoteRSSHandler, false); 
  46.         // 取得rss元素的信息并且打印在控制台上 
  47.         String remoteRSSInfo=RSSInfoRetriever.getRSSInfo(remoteRSSHandler); 
  48.         System.out.println("****************人民网的 rss信息如下******************"); 
  49.         System.out.println(remoteRSSInfo); 
  50.         System.out.println("****************************************************"); 
  51.         
  52.  
  53.     } 
  54.  

实验1:读取本地的rss文件(charles.rss)

这个文件部分内容为:

 
 
  1. <rss version="2.0"
  2. <channel> 
  3. <title> 
  4. <![CDATA[ 平行线的凝聚-51CTO技术博客 ]]> 
  5. </title> 
  6. <link> 
  7. <![CDATA[ http://supercharles888.blog.51cto.com ]]> 
  8. </link> 
  9. <description> 
  10. <![CDATA[ Latest 20 blogs of charles_wang8888 ]]> 
  11. </description> 
  12. <copyright> 
  13. <![CDATA[ Copyright(C) 51CTO技术博客-领先的IT技术博客 ]]> 
  14. </copyright> 
  15. <generator> 
  16. <![CDATA[ 51CTO BLOG by 51CTO Studio ]]> 
  17. </generator> 
  18. <lastBuildDate>Thu, 01 Jan 1970 00:00:00 GMT</lastBuildDate> 
  19. <image> 
  20. <url> 
  21. <![CDATA[ http://img1.51cto.com/image/skin/1/rss.gif ]]> 
  22. </url> 
  23. <title> 
  24. <![CDATA[ 51CTO BLOG ]]> 
  25. </title> 
  26. <link> 
  27. <![CDATA[ http://blog.51cto.com ]]> 
  28. </link> 
  29. <description> 
  30. <![CDATA[ 51CTO技术博客-领先的IT技术博客 ]]> 
  31. </description> 
  32. </image> 
  33. <item> 
  34. <title> 
  35. <![CDATA[ 跨域访问的解决方案(非HTML5的方法1:JSONP) ]]> 
  36. </title> 
  37. <description> 
  38. <![CDATA[ 
  39. 跨域访问一直是困扰很多开发者的问题之一。因为涉及到安全性问题,所以跨域访问默认是不可以进行的,否则假设今天我写了一段js去更改google的图标,明天他写了一段代码去吧google首页的文字全部变成梵文,那还得..【<a href="http://supercharles888.blog.51cto.com/609344/856886" target="_blank">继续阅读全文</a>】 
  40. ]]> 
  41. </description> 
  42. <link> 
  43. <![CDATA[ 
  44. http://supercharles888.blog.51cto.com/609344/856886 
  45. ]]> 
  46. </link> 
  47. <author> 
  48. <![CDATA[ charles_wang8888 ]]> 
  49. </author> 
  50. <category> 
  51. <![CDATA[ Web开发 ]]> 
  52. </category> 
  53. <pubDate>Tue, 08 May 2012 04:02:42 GMT</pubDate> 
  54. </item> 
  55.  
  56. ... 
  57. </channel> 
  58. </rss> 

实验2:读取远程的rss文件(rss文件地址为:http://www.people.com.cn/rss/politics.xml)

 

最终结果如下(因为很长,所以只显示部分):

本地rss的控制台输出结果:

 
 
  1. *************Charles博客的 rss信息如下**************** 
  2. 频道标题: 平行线的凝聚-51CTO技术博客 
  3. 频道相关Link信息: http://supercharles888.blog.51cto.com 
  4. 频道描述信息: Latest 20 blogs of charles_wang8888 
  5. 频道使用的语言: null 
  6. 频道版权信息: Copyright(C) 51CTO技术博客-领先的IT技术博客 
  7. 频道产生器信息: 51CTO BLOG by 51CTO Studio 
  8. 频道图片URL: http://img1.51cto.com/image/skin/1/rss.gif 
  9.  
  10. 一共有 20个摘要在这个频道中 
  11.  
  12. 摘要1:作者: charles_wang8888 
  13. 标题: 跨域访问的解决方案(非HTML5的方法1:JSONP) 
  14. 描述: 跨域访问一直是困扰很多开发者的问题之一。因为涉及到安全性问题,所以跨域访问默认是不可以进行的,否则假设今天我写了一段js去更改google的图标,明天他写了一段代码去吧google首页的文字全部变成梵文,那还得..【<a href="http://supercharles888.blog.51cto.com/609344/856886" target="_blank">继续阅读全文</a>】 
  15. 链接: http://supercharles888.blog.51cto.com/609344/856886 
  16. 发布日期: Tue, 08 May 2012 04:02:42 GMT 
  17.  
  18. ... 
  19.  
  20. 摘要20:作者: charles_wang8888 
  21. 标题: 软件过程模型-瀑布模型 
  22. 描述: 瀑布模型(waterfall)是将开发阶段描述为从一个阶段瀑布般的转化到另外一个阶段,一个开发阶段必须在另外一个开发阶段之前完成。它的特点是有里程碑+可交付产品。 
  23.  瀑布模型中,软件开发分为如下的阶段: 
  24.  需求分..【<a href="http://supercharles888.blog.51cto.com/609344/848535" target="_blank">继续阅读全文</a>】 
  25. 链接: http://supercharles888.blog.51cto.com/609344/848535 
  26. 发布日期: Tue, 01 May 2012 02:49:07 GMT 
  27.  
  28.  
  29. **************************************************** 

 

远程rss的控制台输出结果如下:

 
 
  1. ****************人民网的 rss信息如下****************** 
  2. 频道标题: 国内新闻 
  3. 频道相关Link信息: http://politics.people.com.cn 
  4. 频道描述信息: null 
  5. 频道使用的语言: zh_CN 
  6. 频道版权信息: Copyright 1997-2012 by www.people.com.cn. all rights reserved 
  7. 频道产生器信息: null 
  8. 频道图片URL: http://www.people.com.cn/img/2004people/logo.gif 
  9.  
  10. 一共有 100个摘要在这个频道中 
  11.  
  12. 摘要1:作者: null 
  13. 标题: 乌鲁木齐暂封党政机关一半公车缓解拥堵 
  14. 描述:   本报乌鲁木齐59日电 记者潘从武 记者今天从新疆乌鲁木齐市党政机关、企事业单位暂时封存50%公务用车缓解交通拥堵动员大会上了解到,从515日到95日,乌市将控制全市机动车出行总量,暂时封存全市各级党政机关和 ... 
  15. 链接: http://politics.people.com.cn/GB/17852009.html 
  16. 发布日期: 2012-05-10 08:43:50 
  17.  
  18. ... 
  19.  
  20. 摘要100:作者: null 
  21. 标题: 四部门规范国企负责人职务消费行为 禁公款买房等 
  22. 描述:   中新网58日电 据财政部网站消息,日前财政部会同监察部、审计署和国资委联合发布了《国有企业负责人职务消费行为监督管理暂行办法》的通知,通知要求严格规范国有企业负责人职务消费行为,并明确列出了国企负责 ... 
  23. 链接: http://politics.people.com.cn/GB/17841114.html 
  24. 发布日期: 2012-05-09 08:29:10 
  25.  
  26.  
  27. **************************************************** 

 





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/859470,如需转载请自行联系原作者

目录
相关文章
|
7天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
26 0
|
9天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
12天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
28 0
|
13天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
30 4
|
7天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
18 0
|
7天前
|
监控 安全 Java
常见 Java 代码缺陷及规避方式(中)
常见 Java 代码缺陷及规避方式(中)
20 1
|
9天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
11 0
|
10天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
25 4
|
10天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
12天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
17 1