上篇博客《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 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 小巧,兼容性好,但是现在只支持解析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。敬请期待!
分享到:
相关推荐
rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET ...
web版Rss阅读器源码
C# RSS阅读器 能添加和阅读订阅RSS网址 并且提供订阅网址的访问 能把订阅的内容详细展示出来
Android综合案例——RSS阅读器实源代码+讲解
基于web的rss阅读器
我们希望通过我们RSS阅读管理器这样一个软件,为用户提供关于RSS方面的尽可能多的帮助与支持,以帮助用户运用该软件通过RSS订阅的方式,更方便,更实用的获得信息,处理信息,储存信息,管理信息,传递信息。
Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例
基于WEB的RSS阅读器,用C#实现CBC的对称密码,(加上高级加密标准(AES)的实现)
RSS阅读器,rss新闻在线阅读,XML,Ajax
前几天想找VC编写的RSS阅读器,找了很久没有,找到的都是C#以及其它的,就自己研究一下,其重点无非就是把XML中的RSS信息读取出来。
基于JAVA SWING的RSS阅读器,使用JDOM解析本地XML文件
基于ASP.NET 3.5 AJAX客户端框架开发Web版RSS阅读器
订阅RSS新闻内容的方式很简单,远比订阅邮件列表省事,不需要网站的确认,只要将提供RSS新闻订阅网站的RSS订阅地址(xml文件),根据RSS阅读器添加频道的操作方式添加进来就可以了。当然,前提是要先安装一个RSS...
新浪RSS 新闻阅读器源码啊 android
本文档介绍了关于在线RSS阅读器的制作教程,帮助初学者建立自己的在线RSS阅读器
Rss阅读器编码Rss阅读器编码Rss阅读器编码Rss阅读器编码Rss阅读器编码Rss阅读器编码
MVC在线RSS阅读器(ASP.NET 4.0) 包含数据库文件 MicroSoft SqlServer 2008 + VisualStudio 2010
周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.周博通RSS阅读器.
一个基于新浪RSS的android RSS阅读器源码 虽然不成熟 但是基本功能已经实现 可以学习学习