【毕设资料】 Web版RSS阅读器(三)——解析在线Rss订阅
2014-02-24 18:15
295 查看
上篇博客《 Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表》已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资讯。
首先说一下rss的版本。很多人都说rss,但是有相当一部分人,都不知道rss居然不只一种格式。我们常用的订阅格式有Rss和Atom 2种格式。Rss有版本从v0.9一直到现在的v2.0,Atom最新的版本则是1.0。
DeveloperWorks有一篇文章《使用 RSS 和 Atom 实现新闻联合》提及两者的相似点与不同点:
2.0 and Atom 1.0, Compared,回顾 RSS 和 Atom 的不同点。
RSS 和 Atom 具有相似的基于 XML 的格式。它们的基本结构是相同的,只在节点的表达式上有一点区别。
在Rss标准格式:
Atom 1.0的格式:
大部分新闻或博客网站都使用的是rss,当然Atom也占有部分市场。比如博客园就是用的Atom,而CSDN则用的是RSS。
了解了这些以后,就可以开始解析Rss了。
在网上找了一下开源的包,选了2款常用的都实验了一下,一个是Rome.jar,一个是rsslib4j.jar。二者的区别我就不多介绍了,有兴趣了可以去百度一下。rsslib4j 小巧,兼容性好,但是现在只支持解析rss 0.9x ,1.0 和 2.0,暂时对于atom无能为力。rsslib4j的开源主页:http://sourceforge.net/projects/rsslib4j/。有什么需要的,可以在主页进行下载。
在WebRoot/lib中引用rsslib4j-0.2.jar,在src的com.tgb.rssreader.manager包中新建一个类Rsslib4jReadRss,贴出代码:
由于文章太多,在Console中测试时,可能会看不到后面的效果,所以我只让程序读取了一个文章摘要(for循环次数修改为1),效果图如下:
在解析网易博客时,还算勉强可以胜任,但是在解析CSDN博客时,就会报错"Server returned HTTP response code: 403 for URL: http://xxxxxx",这是因为CSDN博客,拒绝java作为客户端进行访问其服务器。而且在解析个别信息时,会出现null值。
那怎么办呀?别着急,下篇博文,大家跟我一起修改rsslib4j,做自己的rsslib4j。敬请期待!
首先说一下rss的版本。很多人都说rss,但是有相当一部分人,都不知道rss居然不只一种格式。我们常用的订阅格式有Rss和Atom 2种格式。Rss有版本从v0.9一直到现在的v2.0,Atom最新的版本则是1.0。
DeveloperWorks有一篇文章《使用 RSS 和 Atom 实现新闻联合》提及两者的相似点与不同点:
RSS 和 Atom 摘要的相似点
每个摘要文件实际上代表一个通道。它包含通道标题、链接、描述、作者等等。通道信息提供关于摘要的基本信息。通道信息之后是一些项。每项代表一篇可以从摘要阅读器阅读的真实的新闻或者文章。通常情况下,每项包含有标题、链接、更新时间和摘要信息。RSS 和 Atom 摘要的不同点
参考 RSS2.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标准格式:
<!-- 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 the International Space Station? They take a crash course in culture, language and 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 Canada will 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 小巧,兼容性好,但是现在只支持解析rss 0.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订阅
- 【毕设资料】 Web版RSS阅读器(一)——dom4j读取xml(opml)文件
- 【毕设资料】 Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表
- 【毕设资料】Web版RSS阅读器(四)——定制自己的Rss解析库myrsslib4j
- 【毕设资料】Web版RSS阅读器(五)——初步完成阅读功能
- Web版RSS阅读器(三)——解析在线Rss订阅
- JavaScript 解析 xml 文件 如 rss订阅
- JavaScript 解析 xml 文件 如 rss订阅
- 用.NET生成RSS文件,以便Rss阅读器订阅(转)
- web中解决提交乱码的方法原理解析(查资料总结)
- 基于java的RSS在线订阅demo
- 基于java的RSS在线订阅demo
- 运用在线RSS阅读器订阅微信公众账号的日志~
- 用Asp.net生成RSS文件,以便Rss阅读器订阅。
- 离线RSS阅读器和在线RSS阅读服务比较
- marked插件在线实时解析markdown的web小工具
- 离线RSS阅读器和在线RSS阅读服务比较
- 用Asp.net生成RSS文件,以便Rss阅读器订阅(收藏的)
- 资料收集:高并发 高性能 高扩展性 Web 2.0 站点架构设计及优化策略
- 如何让浏览器或者rss阅读器找到你网站的rss