AJAX实践:开发你自己的RSS在线阅读器

关键字: AJAX  ASP.NET  RSS  XML  新闻阅读器  RssToolKit     来源:http://blog.livebaby.cn

  Rss 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用。RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个 Rss 文件后,这个 Rss  Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用。

        在之前我们如果要实现博客的RSS订阅或新闻读取,通常都需要手写代码去生产或读取XML。现在有了RSSToolKit DLL,这一切就变得简单了。你可以使用它在五分钟内实现自己的 Rss 在线阅读器。这篇文章将介绍如何读取站点 Rss 文件信息。

开发环境:VS2005 + RSSToolKit + ASP.NET AJAX

一、首先我们需要建立一个ASP.NET AJAX站点(这里就不详细说明了,网上有详细的介绍文章)




二、将RssToolKit引入到你的解决方案中,建好的解决方案如下(CSS和图片文件可以使用我压缩文档里的)




三、接下来我们开始写Rss读取的实现代码,分成两部分:

       1.首先需要一个ScriptManager、一个UpdatePanel、一个UpdateProgress。哈哈,都是废话AJAX页面程序大概都需要这些。其他的就是你的要求了。具体的 页面代码如下:
  1  <% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " Default.aspx.cs "  Inherits = " _Default "   %>
  2 
  3  <% @ Register Assembly = " RssToolkit "  Namespace = " RssToolkit "  TagPrefix = " Rss "   %>
  4  <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
  5  < html  xmlns ="http://www.w3.org/1999/xhtml" >
  6  < head  runat ="server" >
  7       < title > 向东博客阅读器|meil.livebaby.cn </ title >
  8       < link  href ="CSS/Layout.css"  rel ="stylesheet"  type ="text/css"   />
  9 
 10       < script  language ="JavaScript"  type ="text/javascript" >
 11       var  ls;
 12       function  ls_onClk(itemNumber) {
 13      
 14           if (ls  ==   null ) ls  =  $get( " List0 " );
 15          
 16          ls.className  =   "" ;
 17          ls  =  $get( " list "   +  itemNumber);
 18          ls.className  =   " current " ;
 19           return   true ;
 20      }
 21       </ script >
 22 
 23  </ head >
 24  < body >
 25       < form  id ="form1"  runat ="server" >
 26           < asp:ScriptManager  ID ="ScriptManager1"  runat ="server"   />
 27           < div  id ="content-header" >
 28               < h1 >< asp:HyperLink  ID ="HyperLink1"  runat ="server"  Text ="向东"  Target ="_blank"  NavigateUrl ="http://meil.livebaby.cn/index.html" ></ asp:HyperLink >
 29                  博客阅读器 </ h1 >
 30           </ div >
 31           < div  id ="content-container" >
 32               < div  id ="content-side1" >
 33                   < ul  class ="list-of-links" >
 34                      < li  id ="list0"  class ="current" >
 35                           < asp:LinkButton  ID ="lb0"  runat ="server"  CommandArgument ="0"  OnClientClick ="ls_onClk(0);"  OnCommand ="lnk_cmd" > 向东博客 </ asp:LinkButton ></ li >
 36                      < li  id ="list1" >
 37                           < asp:LinkButton  ID ="lb1"  runat ="server"  CommandArgument ="1"  OnClientClick ="ls_onClk(1);"  OnCommand ="lnk_cmd" > 财经博客 </ asp:LinkButton ></ li >
 38                       < li  id ="list2" >
 39                           < asp:LinkButton  ID ="lb2"  runat ="server"  CommandArgument ="2"  OnClientClick ="ls_onClk(2);"  OnCommand ="lnk_cmd" > Flower博客 </ asp:LinkButton ></ li >
 40                       < li  id ="list3" >
 41                           < asp:LinkButton  ID ="lb3"  runat ="server"  CommandArgument ="3"  OnClientClick ="ls_onClk(3);"  OnCommand ="lnk_cmd" > 活力宝贝博客网 </ asp:LinkButton ></ li >
 42                       < li  id ="list4" >
 43                           < asp:LinkButton  ID ="lb4"  runat ="server"  CommandArgument ="4"  OnClientClick ="ls_onClk(4);"  OnCommand ="lnk_cmd" > 悠悠宝贝的博客 </ asp:LinkButton ></ li >
 44                       < li  id ="list5" >
 45                           < asp:LinkButton  ID ="lb5"  runat ="server"  CommandArgument ="5"  OnClientClick ="ls_onClk(5);"  OnCommand ="lnk_cmd" >< font  color ="red" > 向东博客园博客 </ font ></ asp:LinkButton ></ li >
 46                       < li  id ="li6" >
 47                           < asp:LinkButton  ID ="lb6"  runat ="server"  CommandArgument ="6"  OnClientClick ="ls_onClk(6);"  OnCommand ="lnk_cmd" >< font  color ="red" > 博客园 </ font ></ asp:LinkButton ></ li >
 48                   </ ul >
 49               </ div >
 50               < div  id ="content-main" >
 51                   < asp:UpdatePanel  ID ="updateMain"  runat ="server"  UpdateMode ="conditional"   >
 52                       < Triggers >
 53                           < asp:AsyncPostBackTrigger  ControlID ="lb0"   />
 54                           < asp:AsyncPostBackTrigger  ControlID ="lb1"   />
 55                           < asp:AsyncPostBackTrigger  ControlID ="lb2"   />
 56                           < asp:AsyncPostBackTrigger  ControlID ="lb3"   />
 57                           < asp:AsyncPostBackTrigger  ControlID ="lb4"   />
 58                           < asp:AsyncPostBackTrigger  ControlID ="lb5"   />
 59                           < asp:AsyncPostBackTrigger  ControlID ="lb6"   />
 60                       </ Triggers >
 61                       < ContentTemplate >
 62                           < h2 >< asp:Label  ID ="lblHeader"  runat ="server" > 最新日志 </ asp:Label ></ h2 >
 63                           < hr  />
 64                           < asp:Panel  ID ="pnlBlog"  runat ="server" >
 65                               < Rss:RssDataSource  ID ="rssDS"  runat ="server"  MaxItems ="0"  Url ="" ></ Rss:RssDataSource >
 66                               < asp:DataList  ID ="lsBlog"  runat ="server"  DataSourceID ="rssDS" >
 67                                   < ItemTemplate >
 68                                       < asp:Panel  ID ="panelHeader"  runat ="server"  Style ="cursor: pointer; color: #d61719;width: 100%; display: block;" >
 69                                           < span  style ="float: left;" > <% Eval ( " title " %> </ span >
 70                                           < asp:Image  ID ="Image1"  runat ="server"  Style ="float: right;"  ImageUrl ="~/images/expand_blue.jpg"   />
 71                                       </ asp:Panel >
 72                                       < asp:Panel  ID ="Panel1"  runat ="server"  Style ="margin-top: 3px;width: 100%; background: transparent url(/blog/images/blogBack.gif) no-repeat text-top left;" >
 73                                           <% Eval ( " description " %>
 74                                          ( < asp:HyperLink  ID ="hlMore"  runat ="server"  NavigateUrl ='<%#  Eval("link") % > ' Target="_blank" Text="更多内容"> </ asp:HyperLink > )
 75                                       </ asp:Panel >
 76                                       < ajaxT:CollapsiblePanelExtender  ID ="cpe1"  runat ="server"  TargetControlID ="Panel1"
 77                                          ExpandControlID ="panelHeader"  CollapseControlID ="panelHeader"  SuppressPostBack ="true"
 78                                          ImageControlID ="Image1"  Collapsed ="true"  ExpandedImage ="~/images/collapse_blue.jpg"
 79                                          CollapsedImage ="~/images/expand_blue.jpg"   />
 80                                       < hr  style ="border-bottom: 1px dotted #B2B2B2; margin: 0px;"   />
 81                                   </ ItemTemplate >
 82                               </ asp:DataList >
 83                           </ asp:Panel >
 84                       </ ContentTemplate >
 85                   </ asp:UpdatePanel >
 86               </ div >
 87           </ div >
 88           < asp:UpdateProgress  ID ="UpdateProgress1"  runat ="server"  DisplayAfter ="0"  DynamicLayout ="true" >
 89               < ProgressTemplate >
 90                   < div  id ="updProgress" >
 91                       < img  alt =""  src ="images/indicator.gif"   />
 92                       < span > 数据获取中 </ span >
 93                   </ div >
 94               </ ProgressTemplate >
 95           </ asp:UpdateProgress >
 96       </ form >
 97       < center >< div >< href ="http://meil.livebaby.cn" > meil.livebaby.cn </ a > &nbsp;&nbsp; 程序制作:向东 &nbsp;&nbsp; 2007.7 </ center >
 98  </ body >
 99  </ html >
100 

比较重要的是这两部分:
a)      行66:<Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
在页面上建了一个Rss数据绑定控件,这是实现RSS读取的核心了,有了这个标记就实现了RSS读取的一半工作,那剩下的吶?

看看下面者部分,lnk_cmd 命令实现了RSS数据的重绑定,这样你就可以实时的访问多个RSS地址了。每次点击相应的Rss链接,页面就会读取并显示相关Rss的内容了。
如果你觉得这样还不够灵活,可以加个Textbox,然后用程序去绑定,这样也不错。不过,此次就不实现这个了,有兴趣的朋友可以试试,应该不难。哈哈!

b)      行35:<asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);" 
                                      OnCommand
="lnk_cmd">向东博客</asp:LinkButton></li>
1       protected   void  lnk_cmd( object  sender, CommandEventArgs e)
2      {
3           int  command  =  Convert.ToInt32(e.CommandArgument);
4 
5          rssDataBind(command);
6      }

rssDataBind就是绑定的函数,代码是:
 1       protected   void  rssDataBind( int  cmd)
 2      {
 3           switch  (cmd)
 4          {
 5               case   0 :
 6                  rssDS.Url  =   "u /meil/rss2.xml " ;
 7                  lsBlog.DataBind();
 8                  lblHeader.Text  =   " 向东博客 " ;
 9                   break ;
10               case   1 :
11                  rssDS.Url  =   "u/ money/rss2.xml " ;
12                  lsBlog.DataBind();
13                  lblHeader.Text  =   " 财经博客 " ;
14                   break ;
15               case   2 :
16                  rssDS.Url  =   "u/ flower/rss2.xml " ;
17                  lsBlog.DataBind();
18                  lblHeader.Text  =   " Flower博客 " ;
19                   break ;
20               case   3 :
21                  rssDS.Url  =   " rss2.asp " ;
22                  lsBlog.DataBind();
23                  lblHeader.Text  =   " 活力宝贝博客网 " ;
24                   break ;
25               case   4 :
26                  rssDS.Url  =   "u/ yoyo/rss2.xml " ;
27                  lsBlog.DataBind();
28                  lblHeader.Text  =   " 悠悠宝贝的博客 " ;
29                   break ;
30               case   5 :
31                  rssDS.Url  =   " http://www.cnblogs.com/meil/rss " ;
32                  lsBlog.DataBind();
33                  lblHeader.Text  =   " 向东博客园博客 " ;
34                   break ;
35               case   6 :
36                  rssDS.Url  =   " http://www.cnblogs.com/rss " ;
37                  lsBlog.DataBind();
38                  lblHeader.Text  =   " 博客园 " ;
39                   break ;
40               default :
41                   break ;
42          }
43      }

就这么简单
  rssDS.Url  =   "u/ meil/rss2.xml " ;
 lsBlog.DataBind();
是不是就如DB数据的绑定。MS的东西虽然结构性不好,但是上手真的好快。
到底需要多少个Case就看你的需要了。我这里就绑定了六个RSS地址,你还可以更多,但要注意的是一定要和页面上的LinkButton数对应上。

最终的C#代码 如下:
 1       protected   void  rssDataBind( int  cmd)
 2      {
 3           switch  (cmd)
 4          {
 5               case   0 :
 6                  rssDS.Url  =   "u/ meil/rss2.xml " ;
 7                  lsBlog.DataBind();
 8                  lblHeader.Text  =   " 向东博客 " ;
 9                   break ;
10               case   1 :
11                  rssDS.Url  =   "u/ money/rss2.xml " ;
12                  lsBlog.DataBind();
13                  lblHeader.Text  =   " 财经博客 " ;
14                   break ;
15               case   2 :
16                  rssDS.Url  =   "u/ flower/rss2.xml " ;
17                  lsBlog.DataBind();
18                  lblHeader.Text  =   " Flower博客 " ;
19                   break ;
20               case   3 :
21                  rssDS.Url  =   " rss2.asp " ;
22                  lsBlog.DataBind();
23                  lblHeader.Text  =   " 活力宝贝博客网 " ;
24                   break ;
25               case   4 :
26                  rssDS.Url  =   "u/ yoyo/rss2.xml " ;
27                  lsBlog.DataBind();
28                  lblHeader.Text  =   " 悠悠宝贝的博客 " ;
29                   break ;
30               case   5 :
31                  rssDS.Url  =   " http://www.cnblogs.com/meil/rss " ;
32                  lsBlog.DataBind();
33                  lblHeader.Text  =   " 向东博客园博客 " ;
34                   break ;
35               case   6 :
36                  rssDS.Url  =   " http://www.cnblogs.com/rss " ;
37                  lsBlog.DataBind();
38                  lblHeader.Text  =   " 博客园 " ;
39                   break ;
40               default :
41                   break ;
42          }
43      }




什么是 Rss

  讨论与 Blog相关的技术,不可不谈的就是RSS,这个缩写在英文中可以有几个源头,并被不同的技术团体做不同的解释。既可以是“Rich Site Summary”,或“RDF Site Summary”,也可以是“Really Simple Syndication”。为什么有这么多含义呢?这还要从RSS的一段今天也没有理清的关系说起。

 

  今天肯定有人还记得IE 4刚刚推出来的时候有一个有趣的功能,那就是新闻频道。这个新闻频道的功能与Netscape推出的新闻频道是很相似的(当时Netscape还是市场上领先的浏览器)。为此Netscape 定义了一套描述新闻频道的语言,这就是RSS,只不过Netscape自当时起每况愈下,所以最终也没有发布一个正式的RSS规范(只发布了一个0.9版本)。而微软也在当时推出了支持自己IE的CDF(Channel Definition Format)数据规格,与RSS非常接近。微软试图用新闻频道的功能把“推”(Push)技术变成一个应用主流,并与Netscape抗衡。不过出乎预测的是,“推”技术自始至终没有找到合适的商业模型,而且伴随着其他各类网络特性的出现,也日益无法显现自身的优势。新闻频道在浏览器中的地位最终日暮西山,最后也在IE的后续版本中消失了。

  新闻频道的确进入了低谷,但是RSS并没有被业界人士所抛弃。过去两年,Blog从一个专业群体开始,逐步成为了网络上最热门的新话题。而 Rss 成为了描述Blog主题和更新信息的最基本方法。于是RSS这项技术被著名Blogger/Geek戴夫·温那(Dave Winner)的公司UserLand所接手,继续开发新的版本,以适应新的网络应用需要。新的网络应用就是Blog,因为戴夫·温那的努力,RSS 升级到了0.91版,然后达到了0.92版,随后在各种Blog工具中得到了应用,并被众多的专业新闻站点所支持。在广泛的应用过程中,众多的专业人士认识到需要组织起来,把RSS发展成为一个通用的规范,并进一步标准化。一个联合小组根据W3C新一代的语义网技术RDF对RSS进行了重新定义,发布了RSS 1.0,并把RSS定义为“RDF Site Summary”。这项工作并没有与戴夫·温那进行有效的沟通,而戴夫则坚持在自己设想的方向上进一步开发RSS的后续版本,也并不承认RSS 1.0的有效性。RSS由此开始分化形成了RSS 0.9x/2.0和RSS 1.0两个阵营,也由此引起了在专业人群中的广泛争论。

  因为争论的存在,一直到今天,RSS 1.0还没有成为标准化组织的真正标准。而戴夫·温那却在2002年9月独自把RSS升级到了2.0版本,其中的定义完全是全新的模式,并没有任何 Rss 1.0的影子。这引发了网络上进一步争议,究竟让一个越来越普及的数据格式成为一个开放的标准,还是被一家公司所定义和控制,成为了争议的焦点。戴夫·温那并没有为自己辩解,他的观点是RSS还需要进一步发展,需要专业人士更明确的定义,不过恐怕这种轻描淡写不能消除人们对 Rss “被一家商业公司独占”的担心。

  前面的铺垫对用户来说也许没有什么太大的意义,可能更多人关心如何在自己的Blog增加 Rss 输出,这样可以让很多新闻聚合工具(例如CNBlog刚刚推荐的NewzCrawler)很容易找到你并自动获得你在Blog中的更新内容。

  它是什么:站点用来和其他站点之间共享内容的简易方式(也叫聚合内容)。 Rss 使肵ML作为彼此共享内容的标准方式。

  它代表什么:Really Simple Syndication (或RDF Site Summary,RDF站点摘要)

  例如:一些免费的软件能够让你阅读那些RSS使能的站点,比如 NewsIsFree 和 Amphetadesk。

  它有什么用处:让别人容易的发现你已经更新了你的站点,让人们很容易的追踪他们阅读的所有weblogs。


本文永久地址: http://www.livebaby.cn/blog/u/meil/archives/2007/1169.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值