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

首先说一下rss的版本。很多人都说rss,但是有相当一部分人,都不知道rss居然不只一种格式。我们常用的订阅格式有Rss和Atom 2种格式。Rss有版本从v0.9一直到现在的v2.0,Atom最新的版本则是1.0。

DeveloperWorks有一篇文章《使用 RSS 和 Atom 实现新闻联合》提及两者的相似点与不同点:

RSS 和 Atom 摘要的相似点

每个摘要文件实际上代表一个通道。它包含通道标题、链接、描述、作者等等。通道信息提供关于摘要的基本信息。通道信息之后是一些项。每项代表一篇可以从摘要阅读器阅读的真实的新闻或者文章。通常情况下,每项包含有标题、链接、更新时间和摘要信息。

RSS 和 Atom 摘要的不同点

参考RSS 2.0 and Atom 1.0, Compared,回顾 RSS 和 Atom 的不同点。


不同点 RSS 2.0 Atom 1.0

部署 RSS 2.0 得到广泛部署。 Atom 1.0 还未得到广泛部署。

规范 哈佛大学拥有版权并冻结了 RSS 2.0 规范。 Atompub 工作组(属于 IETF)就 Atom 1.0 规范达成一致意见,并在将来有可能重新修订。

所需内容 RSS 2.0 包含所需的摘要级别的标题、链接和描述。它不需要在摘要中出现的任何单独项的字段。 Atom 1.0 包含摘要和条目所需的标题(可以为空)、惟一标识和最后更新的时间戳。

有效负载(payload) RSS 2.0 可以包含普通文本或者转义 HTML,但是不能分辨所提供的是两个中的哪一个。 Atom 1.0 包含有效负载容器。

全部或者部分内容 RSS 2.0 有一个<description>元素,可以包含条目的全部文本或者大纲。它没有用于标识内容是否完全的内置方法。 Atom 1.0 提供单独的<summary><content> 元素。如果它是非文本的或者非本地的内容,出于可访问性的原因摘要将很好用。

自动发现 RSS 2.0 用不同的方法实现自动发现。 Atom 1.0 标准化自动发现。

提取和聚合 RSS 2.0 只有一个可识别的形式:一个<rss>文档。 Atom 1.0 允许独立的 Atom Entry 文档,可以使用任何网络协议传输;例如,XMPP。Atom 也支持聚合摘要,其中,条目指向它们来自的摘要,前提是如果它们将被包含到其他摘要中。

RSS 和 Atom 具有相似的基于 XML 的格式。它们的基本结构是相同的,只在节点的表达式上有一点区别。

在Rss标准格式:

<!-- XML版本和字符集 --><?xml version="1.0"?><!-- RSS版本 --><rss version="2.0"><!-- 以下为频道信息及新闻资讯或文章列表 --><channel><!-- 频道总体信息:开始 --><!-- 频道标题 --><title>Lift Off News</title><!-- 频道链接的总地址 --><link>http://liftoff.msfc.nasa.gov/</link><!-- 频道描述文字 --><description>Liftoff to Space Exploration.</description><!-- 频道使用的语言(zh-cn表示简体中文) --><language>en-us</language><!-- 频道发布的时间 --><pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate><!-- 频道最后更新的时间--><lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate><docs>http://blogs.law.harvard.edu/tech/rss</docs><!-- 频道生成器 --><generator>Weblog Editor 2.0</generator><ttl>5</ttl><!-- 频道总体信息:结束 --><!-- 每条RSS新闻信息都包含在item节点中, --><item><!-- 新闻标题 --><title>Star City</title><!-- 新闻链接地址 --><link>http://liftoff.msfc.nasa.gov/news/2013/news-starcity.asp</link><!-- 新闻内容简要描述 --><description>How do Americans get ready to work with Russians aboard theInternational Space Station? They take a crash course in culture, languageand protocol at Russia's Star City.</description><!-- 新闻发布时间 --><pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate><!-- 新闻目录 --><category>IT</category><!-- 新闻作者 --><author>bill</author><guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid></item><!-- 第二条新闻信息 --><item><title>Space Exploration</title><link>http://liftoff.msfc.nasa.gov/</link><description>Sky watchers in Europe, Asia, and parts of Alaska and Canadawill experience a partial eclipse of the Sun on Saturday, May 31st.</description>Fri, 30 May 2003 11:06:42 GMT</pubDate><guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid></item>  </channel></rss>

Atom 1.0的格式:

<?xml version="1.0" encoding="utf-8"?>
<!-- ATOM版本 -->
<feed xmlns="http://www.w3.org/2005/Atom""><!-- 频道标题 --><title>Schema Web</title><!-- 频道链接的总地址 --><link rel="alternate" type="text/html" href="http://stanzaweb.art/"/><!-- 最新修改时间--><modified>2004-06-01T10:11:12Z</modified><!-- 频道作者 --><author><!-- 昵称 --><name>Uche Ogbuji</name></author><!-- 以下是新闻资讯或文章列表 --><entry><!-- 新闻标题 --><title>Welcome to Stanza Web</title><!-- 新闻作者 --><author><!-- 作者昵称 --><name>龙轩</name><!-- 主页 --><uri>http://www.cnblogs.com/longxuan/</uri></author><!-- 文章连接 --><link rel="alternate" type="text/html" href="http://stanzaweb.art/2004-06-01/welcome"/><!-- 最新修改时间 --><modified>2004-06-01T10:11:12Z</modified><!-- 文章内容 --><content type="html"><div ><p>Welcome to<a href="http://stanzaweb.art/">Stanza Web</a>.Come back often to keep track of the best in modern poetry.</p><p>This site is powered by<a href="http://atomenabled.org">Atom</a></p></div></content></entry>
</feed>

大部分新闻或博客网站都使用的是rss,当然Atom也占有部分市场。比如博客园就是用的Atom,而CSDN则用的是RSS。

了解了这些以后,就可以开始解析Rss了。

在网上找了一下开源的包,选了2款常用的都实验了一下,一个是Rome.jar,一个是rsslib4j.jar。二者的区别我就不多介绍了,有兴趣了可以去百度一下。rsslib4j 小巧,兼容性好,但是现在只支持解析rss0.9x ,1.0 和 2.0,暂时对于atom无能为力。rsslib4j的开源主页:http://sourceforge.net/projects/rsslib4j/。有什么需要的,可以在主页进行下载。

在WebRoot/lib中引用rsslib4j-0.2.jar,在src的com.tgb.rssreader.manager包中新建一个类Rsslib4jReadRss,贴出代码:

package com.tgb.rssreader.manager;import java.net.URL;
import java.net.URLConnection;
import java.util.List;import org.gnu.stealthp.rsslib.RSSChannel;
import org.gnu.stealthp.rsslib.RSSHandler;
import org.gnu.stealthp.rsslib.RSSImage;
import org.gnu.stealthp.rsslib.RSSItem;
import org.gnu.stealthp.rsslib.RSSParser;public class Rsslib4jReadRss {//这里定义一个在线的rss摘要的地址(对应我的网易博客) public static final String remoteRSS="http://xiaoxian100.blog.163.com/rss"; public static void main(String[] args) throws Exception { // 让RSSParser去解析在线的rss的url RSSHandler remoteRSSHandler = new RSSHandler(); URL url = new URL(remoteRSS);URLConnection feedUrl = url.openConnection();RSSParser.parseXmlFile(feedUrl.getURL(), remoteRSSHandler, false); // 取得rss元素的信息并且打印在控制台上 String remoteRSSInfo=Rsslib4jReadRss.getRSSInfo(remoteRSSHandler); System.out.println("****************我的网易博客的 rss信息如下******************"); System.out.println(remoteRSSInfo); System.out.println("****************************************************"); } public static String getRSSInfo(RSSHandler handler) {StringBuffer rssInfo = new StringBuffer();// 取得rss提要的频道信息(Channel)RSSChannel channel = handler.getRSSChannel();// Part1: 分离出rss频道的元信息// (1)频道的标题String titleInfo = channel.getTitle();// (2)频道的链接信息String linkInfo = channel.getLink();// (3)频道的描述信息String descriptionInfo = channel.getDescription();// (4)频道使用的语言String languageInfo = channel.getLanguage();// (5)频道版权信息String copyrightInfo = channel.getCopyright();// (6)频道的generator的信息String generatorInfo = channel.getGenerator();// (7)频道的image信息RSSImage channelImage = channel.getRSSImage();String channelImageUrl = channelImage.getUrl();rssInfo.append("频道标题: " + titleInfo + "\n");rssInfo.append("频道相关Link信息: " + linkInfo + "\n");rssInfo.append("频道描述信息: " + descriptionInfo + "\n");rssInfo.append("频道使用的语言: " + languageInfo + "\n");rssInfo.append("频道版权信息: " + copyrightInfo + "\n");rssInfo.append("频道产生器信息: " + generatorInfo + "\n");rssInfo.append("频道图片URL: " + channelImageUrl + "\n");//Part2: 分离出rss频道的所有摘要(feed),这里用item表示List channelItems = channel.getItems();int itemSize = channelItems.size();if (itemSize >= 1) {rssInfo.append("\n");rssInfo.append("一共有 " + itemSize + "个摘要在这个频道中");rssInfo.append("\n");for (int i = 0; i < itemSize; i++) {int itemNo = i + 1;RSSItem item = (RSSItem) channelItems.get(i);rssInfo.append("\n");rssInfo.append("摘要" + itemNo + ":");// (1)摘要的作者String itemAuthor = item.getAuthor();// (2)摘要的标题String itemTitle = item.getTitle();// (3)摘要的描述String itemDescription = item.getDescription();// (4)摘要的链接String itemLink = item.getLink();// (5)摘要的发布日期String itemPubDate = item.getPubDate();rssInfo.append("作者: " + itemAuthor + "\n");rssInfo.append("标题: " + itemTitle + "\n");rssInfo.append("描述: " + itemDescription + "\n");rssInfo.append("链接: " + itemLink + "\n");rssInfo.append("发布日期: " + itemPubDate + "\n");rssInfo.append("\n");}}return rssInfo.toString();}}

由于文章太多,在Console中测试时,可能会看不到后面的效果,所以我只让程序读取了一个文章摘要(for循环次数修改为1),效果图如下:

在解析网易博客时,还算勉强可以胜任,但是在解析CSDN博客时,就会报错"Server returned HTTP response code: 403 for URL: http://xxxxxx",这是因为CSDN博客,拒绝java作为客户端进行访问其服务器。而且在解析个别信息时,会出现null值。

那怎么办呀?别着急,下篇博文,大家跟我一起修改rsslib4j,做自己的rsslib4j。敬请期待!

Web版RSS阅读器(三)——解析在线Rss订阅相关推荐

  1. 如何在使用摩托罗拉上的RSS阅读器应用进行一次订阅

    订阅一个CSDN的RSS为例. 1.打开RSS阅读器. 2.设置->新增订阅->手动新增 订阅URL:输入http://articles.csdn.net/api/rss.php?tid= ...

  2. rss阅读器保存html文件,4款在线RSS阅读器使用体验

    RSS阅读有以下优点:您可以看到没有广告和图片的标题或文章的概要阅读,这样你不必阅读全文即可知文章讲的一个意思是什么,为您节省时间. RSS阅读器会自动更新你定制的网站内容,保持新闻的及时性.要订阅新 ...

  3. InoReader—— 轻便快捷的在线 RSS 阅读器

    致鲜果RSS阅读器用户       各位鲜果RSS阅读器用户,很遗憾的通知大家,鲜果团队将在2014年12月12日关闭RSS订阅服务.感谢大家长期以来的支持,希望大家理解我们的这一决定. --题记 图 ...

  4. 阅读器之家推荐几款比较好用的rss阅读器

    那个rss阅读器好? 阅读器之家推荐几款比较好用的rss阅读器,下面我们就来对比一下最近名气比较大的四款RSS阅读器,看看哪一款功能更强大,更适合我们使用. rss阅读器是什么? RSS阅读器是一种软 ...

  5. python代码阅读器_用Python代码实现的RSS阅读器示例

    玩蛇网python之家这篇文章是关于如何使用Python代码实现RSS阅读器示例,如何用Tkinter等模块方法实现RSS订阅器的编写,参考学习过下面的正试代码后就会明白. 简单的说下RSS阅读器是什 ...

  6. 让网络信息“私有化”:五款主流RSS阅读器横评

    让网络信息"私有化":五款主流RSS阅读器横评 作者:出处:电脑爱好者 [ 2006-04-26 13:30 ] 摘要:本次测试选用的软件有五款:雅虎助手订阅.搜狗直通车RSS阅读 ...

  7. Web版RSS阅读器(四)——定制自己的Rss解析库myrsslib4j

    在上篇博文<Web版RSS阅读器(三)--解析在线Rss订阅>中,已经提到了遇到的问题,这里再详细说一下. 在解析rss格式的订阅时,遇到的最主要的问题是,出现了"Server ...

  8. 用JSP实现基于Web的RSS阅读器

    2019独角兽企业重金招聘Python工程师标准>>> 一 RSS介绍 根据维基百科(http://zh.wikipedia.org/wiki/RSS)的定义,"RSS是一 ...

  9. 基于ASP.NET AJAX技术开发在线RSS阅读器(下篇)

    五.逻辑层设计 (一)添加RSS频道 在展开真正的逻辑层设计之前,先让我们简单地浏览一下下面的草图4.图4展示了我对于两个重要ASP.NET AJAX客户端控件-ListView和DataSource ...

最新文章

  1. 华为芯片设计面试题_未来想去华为海思做芯片设计,应该做哪些努力?
  2. poj 1995 Raising Modulo Numbers 二分快速幂
  3. ImagesSprite V1.1.1 Beta发布
  4. qt5.11 linux oracle,Qt5.11.1 + VS2017环境搭建(Qt5.11在windows上的安装)
  5. mariadb与mysql的兼容_「MySQL架构」MariaDB versus MySQL: Compatibility
  6. jenkins 忘记用户名和密码
  7. vue接收jsp发送的post请求_vue与后台交互之post用法
  8. https无法访问 宝塔_解决宝塔面板开启自带免费Let's Encrypt SSL证书后网站无法访问...
  9. Linux 内核 SMP 代码追踪 --- cpumask
  10. (Java)idea连接数据库
  11. 如果软件测试是门艺术,软件测试工程师就是艺术家 -- 浅析ZStack是如何做智能软件测试
  12. 把PDF/AZW/EPUB转成图片
  13. 突破网络执法官封锁的方法及其原理
  14. windows常用快捷命令大全总结
  15. 计网 ---第10章 网络安全
  16. 生鲜配送APP软件开发
  17. 2022年最赚钱地推项目-WiFi贴项目(月入10个W)
  18. 香港大学计算机科学排名,香港大学计算机专业排名
  19. 饿了么虚拟号码可以发短信吗_饿了么隐私
  20. 论文阅读:social lstm:Human Trajectory Prediction in Crowded Spaces

热门文章

  1. Unity调整脚本顺序
  2. 基于python的智能语音助手下载_GitHub - qq53182347/DuerOS-Python-Client: 基于DuerOS的个人的智能语音助手...
  3. 例3-1 将振幅为1的1Hz正弦波和振幅为0.5的5Hz正弦波相加后进行傅里叶变换。——傅里叶变换理解
  4. 从3万条豆瓣短评看《雷神3》
  5. 进医院就有活有死!这标题真吓人!
  6. 机器学习降维算法六——ISOMAP(等距特征映射)
  7. Vagrant设置私有网络
  8. frp进行内网穿透【转载】
  9. win10无法防问其他计算机没有权限,雨林木风win10系统局域网共享无法访问提示“您可能没有权限使用网络资源”的方案...
  10. 排列组合( Lindström–Gessel–Viennot lemma 定理)