基于.NET的RSS解析及实现

时间:2022-10-24 03:35:33

摘要:RSS可以称为新时代的阅读方式,目前各大型网站都已全面支持了RSS阅读的方式。本文介绍了RSS技术的基本原理和主要功能,详细阐述了在.NET平台下对RSS技术的融合和支持,并通过实例进一步说明对RSS的解析和实现过程。

关键词:RSS;.NET;解析;实现

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)12-21629-03

RSS Based on .NET Analyzes and Realizes

ZHANG Fan,ZHANG Qian

(Henan Economy And Trade Vocational College,Zhengzhou 450053,China)

Abstract:RSS may be called the new times the reading way, at present each large-scale website all comprehensively has supported the RSS reading way. This article introduced the RSS technology basic principle and the main function, in detail elaborated under NET the platform to the RSS technology fusion and the support, and further explains through the example to the RSS analysis and the realization process.

Key words:RSS;.NET;Framework Analyzes;Realizes

在门户网站大行其道,人们已经习惯通过搜索引擎来获取新闻资讯的今天,一种全新的资讯传播方式已经悄悄地来到我们身边,仔细观察一些网站,你可能注意到一些被标记为"XML"或"RSS"的橙色图标。面对扑面而来的新闻,不用再花费大量的时间冲浪和从新闻网站下载,只要通过下载或购买一种小程序,这种技术被称为RSS技术。RSS会收集和组织定制的新闻,按照你希望的格式、地点、时间和方式,直接传送到你的计算机上。新闻网站和那些在线日记作者已体会到了RSS提要带来的乐趣,这也使读者可以更容易跟踪RSS信息。可以说,RSS技术已经成为未来网络互联中占据主导地位的阅读方式。

1 RSS技术

1.1 什么是RSS

RSS的英文全名是Really Simple Syndication(真正简单联合供稿系统),是一种用来聚集搜集新闻标题或是提供网页内容的格式,以XML可延伸标记语言为基础。如今RSS最广泛的使用在将网站的最新头条新闻或内容有效率的整理出来,提供需求者参考。并且也是一种网站和网站之间共享内容的简易方式。也就是说RSS不但可以描述网站上的新闻格式,以及网志(Web loggers或bloggers)。更可以藉由RSS让别人更容易发现你的网站以及追踪新闻的来源。一些大的网站如BBC, CNET, CNN, Disney, Wired等的网站信息都是透过RSS来当作信息传播的媒介。RSS的出现解决了网站管理所必须面临的许多问题,使的网络上传递和搜集信息更加的方便,一方面也保证网络传输的速度,增进了网络联机的质量。

图1 传统Web浏览方式图2 RSS订阅Web信息

1.2 RSS技术的主要功能特点

(1)来源多样的个性化“聚合”特性

因为RSS是一种被广泛采用的内容包装定义格式,所以任何内容源都可以采用这种方式来信息,包括专业新闻站点、电子商务站点、企业站点、甚至个人站点等。而在用户端,RSS阅读器软件的作用就是按照用户的喜好,有选择性地将用户感兴趣的内容来源“聚合” 到该软件的界面中,为用户提供多来源信息的“一站式” 服务。

(2)信息的时效、低成本特性

RSS技术秉承“推”信息的概念,当新内容在服务器数据库中出现时第一时间被“推”到用户端阅读器中,极大地提高了信息的时效性和价值。此外,服务器端内容的RSS包装在技术实现上极为简单,而且是一次性的工作,使长期的信息边际成本几乎降为零,完全是传统的电子邮件、卫星传输、互联网浏览等方式所无法比拟的。

(3)无“垃圾”信息、便利的本地内容管理特性

RSS用户端阅读器软件的特点是完全由用户根据自身喜好以“频道”的形式订阅值得信任的内容来源,如“新华网国际新闻”、“中国汽车网市场行情”、“天极网IT产品资讯”等。RSS阅读器软件完全屏蔽掉其他所有用户没有订阅的内容以及弹出广告、垃圾邮件等令人困扰的噪音内容。此外,对下载到阅读器软件本地的订阅RSS内容,用户可以进行离线阅读、存档保留、搜索排序、相关分类等多种管理操作,使阅读器软件不仅是一个“阅读”器,更是一个用户随身的“资料库”。

2 RSS的联合(Syndication)和聚合(Aggregation)

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

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

3 RSS的发展趋势

随着越来越多的站点对RSS的支持,RSS已经成为目前最成功的XML应用。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。相信很快我们就会看到大量基于RSS的专业门户、聚合站点和更精确的搜索引擎。

(1)RSS中必然会增加更多的内容。

(2)RSS带来了阅读方式的改变,和新形式的阅读服务的提供。

(3)RSS的订阅方式会更加简化。

(4)RSS发行方将试图操控RSS的显示形式。

4 .NET和RSS

.NET技术和.NET Framework无疑是当今最受关注的新一代面向对象的编程技术,而其在网络方面的优势和应用大家也是有目共睹。RSS是基于文本的格式,它是XML(可扩展标识语言)的一种形式。通常RSS文件都是标为XML,RSS files(通常也被称为RSS feeds或者channels)通常只包含简单的项目列表。一般而言,每一个项目都含有一个标题,一段简单的介绍,还有一个URL链接(比如是一个网页的地址)。其他的信息,例如日期,创建者的名字等等,都是可以选择的。也正因为如此,根据.NET和RSS二者的各自技术特点,如何在它们之间建立起一种操作性强、实用性广的支配关系也就显得尤为重要,本文下面将重点介绍这一功能的实现。

5 解析和实现

为了实现用一种通用的方法来实现对RSS的解析,我们以C#语言为脚本,通过定义相关的类文件来实现这一功能,其中主要有Channel、ChannelCollection、Feed、Item和 ItemCollection五个类。

(1)Channel类:该类包含某信道模板,应用程序可指定并配置该信道模板,以便与远程对象进行通信或侦听对远程对象的请求。在可以注册信道以供使用的任何位置,都可以将该实例信道元素的 id 属性设置为此模板的 ref 属性,其中主要包含要插入服务器端信道接收调用链的接收提供程序和插入客户端信道接收调用链的接收提供程序。

namespace Utility.Rss

{ public class Channel

{ private string _title;

private string _link;

private string _description;

private ItemCollection items = new ItemCollection();

public string title

{ get {return _title;}

set {_title = value.ToString(); }}

public string link

{ get {return _link;}

set {_link = value.ToString(); }}

public string description

{ get {return _description;}

set {_description = value.ToString(); }}

public ItemCollection Items

{ get { return items; }}

public Channel(){}}}

(2)ChannelCollection类:ChannelCollection类继承了System.Collections.CollectionBase类,通过此类来实现RSS接口的功能。

using System;

namespace Utility.Rss

{ public class ChannelCollection:System.Collections.CollectionBase

{ public Channel this[int index]

{ get

{ return ((Channel)(List[index])); }

set

{ List[index] = value;} }

public int Add(Channel item)

{ return List.Add(item); }

public ChannelCollection()

{ } } }

(3)Feed类: Feed类是所有类中的核心内容,它主要通过读取相关的数据来实现接收某信息来源的接口的更新。

using System;

using System.Xml;

using System.IO;

using ;

using System.Text;

namespace Utility.Rss

{ public class Feed

{ private string _url;

private System.DateTime _lastModified;

private System.DateTime _lastRssDate;

private Channel channel = new Channel();

public string url {

Get {return _url;}

Set {_url=value;}}

public System.DateTime lastModified

{ get {return _lastModified;} }

Public System.DateTime lstRssDate

{ set {_lastRssDate=value; }}

public Channel Channel

{ get { return channel; }}

public Feed()

{ }

public Feed(string url,System.DateTime dt)

{ this._url=url;

this._lastRssDate=dt; }

public void Read()

{ XmlDocument xDoc=new XmlDocument();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);

request.Timeout=15000;

request.UserAgent=@"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.40607; .NET CLR 1.1.4322)";

Stream stream;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

this._lastModified = response.LastModified;

stream = response.GetResponseStream();

StreamReader sr;

if(this.Get_CH(response.Headers["Content-Type"].ToString())=="GBK")

{ sr=new streamReader(stream,System.Text.Encoding.GetEncoding("GB2312"));

xDoc.Load(sr); }

else {

sr= new StreamReader(stream,System.Text.Encoding.UTF8);

xDoc.Load(stream); }

if(this._lastRssDate

{ XmlNodeList xnList=xDoc.DocumentElement["channel"].SelectNodes("item");

int a= xnList.Count;

foreach(XmlNode xNode in xnList)

{ Item rt=new Item();

rt.title=xNode.SelectSingleNode("title").InnerText.Replace("'","''");

rt.link=xNode.SelectSingleNode("link").InnerText.Replace("'","''");

rt.description=xNode.SelectSingleNode("description").InnerText.Replace("'","''");

try

{ rt.pubDate=xNode.SelectSingleNode("pubDate").InnerText; }

catch {

rt.pubDate=this._lastModified.ToString(); }

channel.Items.Add(rt); }}}

public string Create()

{return “”; }

private string Get_CH(string s)

{int l=s.IndexOf("charset=")+8;

return s.Substring(l,s.Length-l); }}}

(4)Item类:Item类主要实现通过使用指定的区域性特定格式设置信息,将信息接口的数据来源转换为等效的日期格式。

using System;

namespace Utility.Rss

{ public class Item

{private string _title;

private string _link;

private string _description;

private string _pubDate;

public string title

{get {return _title;}

set {_title=value.ToString();}}

public string link

{get {return _link;}

set {_link=value.ToString();} }

public string description

{get {return _description;}

set {_description=value.ToString();}}

public string pubDate

{ get {return _pubDate;}

set {_pubDate=C_Date(value);}}

public Item() {}

private string C_Date(string input)

{System.DateTime dt;

try{

dt=Convert.ToDateTime(input);}

catch{

dt=System.DateTime.Now; }

return dt.ToString(); } } }

5 ItemCollection类

using System;

namespace Utility.Rss

{public class ItemCollection : System.Collections.CollectionBase

{ public Item this[int index]

{ get { return ((Item)(List[index])); }

set

{List[index] = value; }}

public int Add(Item item)

{ return List.Add(item); }

public ItemCollection()

{}}}

6 结束语

本文从RSS技术的基本原理和主要技术特点出发,结合.NET技术在.XML方面的应用,总结出了一种通过.NET平台实现通用解析RSS的方法,伴随着RSS技术的快速发展,将会对Web开发应用起到积极的推动作用。

参考文献:

[1]Simon Robinson,K,Scott Allen,C#高级编程[M].清华大学出版社,2002.

[2]Marco Bellinaso,Brady Gaster.高效掌握[M].清华大学出版社,2002.

[3]王培棚.C#技术揭秘[M].机械工业出版社,2003.7.

“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”

上一篇:浅谈当前高校校园网面临的安全威胁 下一篇:电子政务中的数据交换技术