Rss 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用。RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个 Rss 文件后,这个 Rss Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用。
2\(GHpW k}b4p 在之前我们如果要实现博客的RSS订阅或新闻读取,通常都需要手写代码去生产或读取XML。现在有了RSSToolKit DLL,这一切就变得简单了。你可以使用它在五分钟内实现自己的 Rss 在线阅读器。这篇文章将介绍如何读取站点 Rss 文件信息。
#!je X)' md41 zC- 开发环境:VS2005 + RSSToolKit + ASP.NET AJAX
3r 2F+I _/WQ5 一、首先我们需要建立一个ASP.NET AJAX站点(这里就不详细说明了,网上有详细的介绍文章)
kmv47WG7w :JI W#uHo CkH(Y6a up*hFK* v{y'2EB 二、将RssToolKit引入到你的解决方案中,建好的解决方案如下(CSS和图片文件可以使用我压缩文档里的)
&9^[*G_6# `CdSogpXn zomF <Kap X foXw0} :WBsn= ;B FYAy5(] %wOk:F6" 三、接下来我们开始写Rss读取的实现代码,分成两部分:
Q;67[F$ Ou BRu`ib! },-1LhVG^ 1.首先需要一个ScriptManager、一个UpdatePanel、一个UpdateProgress。哈哈,都是废话AJAX页面程序大概都需要这些。其他的就是你的要求了。具体的页面代码如下:
youkj dt[ "?J- *Z 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
T8{ 4Iz 2
q0 AqBUOG 3 <%@ Register Assembly="RssToolkit" Namespace="RssToolkit" TagPrefix="Rss" %>
vj(t'qJ95 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
,S2aHF[& 5 <html xmlns="
http://www.w3.org/1999/xhtml">
@krt qU 6 <head runat="server">
?YbA_yG 7 <title>向东博客阅读器|meil.livebaby.cn</title>
rXnQ/ZBe 8 <link href="CSS/Layout.css" rel="stylesheet" type="text/css" />
ex zx 9
zd5`'^ap 10 <script language="JavaScript" type="text/javascript">
N@pIp! 11 var ls;
r ;:Gk 12 function ls_onClk(itemNumber) {
)K|3\~ 13
4/#>gEe" 14 if(ls == null) ls = $get("List0");
Qz_iJ 15
ohCs~5c,n0 16 ls.className = "";
I3s[y Gn8 17 ls = $get("list" + itemNumber);
ANHa-rM 18 ls.className = "current";
{g(sLM5 19 return true;
Ln;Ee *Bv 20 }
EXps2uf 21 </script>
{"0u4}& 22
5twH pbY 23 </head>
Xi} "U-Xe 24 <body>
" _$1Vdff 25 <form id="form1" runat="server">
j<AOltu 26 <asp:ScriptManager ID="ScriptManager1" runat="server" />
Hr+Cgo~ 27 <div id="content-header">
P&vK.LX= 28 <h1><asp:HyperLink ID="HyperLink1" runat="server" Text="向东" Target="_blank" NavigateUrl="
http://meil.livebaby.cn/index.html"></asp:HyperLink>
;W@c~X 29 博客阅读器</h1>
HS5`W[&lS. 30 </div>
!H Ufqu 31 <div id="content-container">
NPMOs[" 32 <div id="content-side1">
QLW@V>EK 33 <ul class="list-of-links">
iAZe+M=& 34 <li id="list0" class="current">
s2|INdS 1 35 <asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);" OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
0lE+PP 36 <li id="list1">
Q5T%% 37 <asp:LinkButton ID="lb1" runat="server" CommandArgument="1" OnClientClick="ls_onClk(1);" OnCommand="lnk_cmd">财经博客</asp:LinkButton></li>
^9283wI,V 38 <li id="list2">
X:_a1uZ 39 <asp:LinkButton ID="lb2" runat="server" CommandArgument="2" OnClientClick="ls_onClk(2);" OnCommand="lnk_cmd">Flower博客</asp:LinkButton></li>
>P fB dmn 40 <li id="list3">
MKcC FE 41 <asp:LinkButton ID="lb3" runat="server" CommandArgument="3" OnClientClick="ls_onClk(3);" OnCommand="lnk_cmd">活力宝贝博客网</asp:LinkButton></li>
_bYU(8CEq 42 <li id="list4">
E;Q/>!N(Z 43 <asp:LinkButton ID="lb4" runat="server" CommandArgument="4" OnClientClick="ls_onClk(4);" OnCommand="lnk_cmd">悠悠宝贝的博客</asp:LinkButton></li>
F;[ oCcf 44 <li id="list5">
)TFAG{\m) 45 <asp:LinkButton ID="lb5" runat="server" CommandArgument="5" OnClientClick="ls_onClk(5);" OnCommand="lnk_cmd"><font color="red">向东博客园博客</font></asp:LinkButton></li>
"5DQmJ%c 46 <li id="li6">
Jck'.CEb 47 <asp:LinkButton ID="lb6" runat="server" CommandArgument="6" OnClientClick="ls_onClk(6);" OnCommand="lnk_cmd"><font color="red">博客园</font></asp:LinkButton></li>
z LrUO PD 48 </ul>
_Ros U,n 49 </div>
aexXukJV 50 <div id="content-main">
y[_mX ? 51 <asp:UpdatePanel ID="updateMain" runat="server" UpdateMode="conditional" >
qG @15X; 52 <Triggers>
:W9K*&i 53 <asp:AsyncPostBackTrigger ControlID="lb0" />
(OSma 54 <asp:AsyncPostBackTrigger ControlID="lb1" />
r|dE2: 55 <asp:AsyncPostBackTrigger ControlID="lb2" />
x"$DvX 56 <asp:AsyncPostBackTrigger ControlID="lb3" />
euE2Z}A 57 <asp:AsyncPostBackTrigger ControlID="lb4" />
/T:CQ!gf 58 <asp:AsyncPostBackTrigger ControlID="lb5" />
g(w }FLo 59 <asp:AsyncPostBackTrigger ControlID="lb6" />
%, WZBO 60 </Triggers>
YH~"l{J$ 61 <ContentTemplate>
Oq#@4'4E?g 62 <h2><asp:Label ID="lblHeader" runat="server">最新日志</asp:Label></h2>
~p8AE;WI 63 <hr />
D|@t XW 64 <asp:Panel ID="pnlBlog" runat="server">
h<-/hZ} 65 <Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
`h)24 j_- 66 <asp:DataList ID="lsBlog" runat="server" DataSourceID="rssDS">
*.pr;Gw> 67 <ItemTemplate>
DJt90|% 68 <asp:Panel ID="panelHeader" runat="server" Style="cursor: pointer; color: #d61719;width: 100%; display: block;">
Td m3Yp 69 <span style="float: left;"><%# Eval("title") %></span>
nt85`~{< 70 <asp:Image ID="Image1" runat="server" Style="float: right;" ImageUrl="~/images/expand_blue.jpg" />
9%s/w<{" 71 </asp:Panel>
d1rriKJ@ 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;">
ar f 72 73 <%# Eval("description") %>
",-&B$E 74 (<asp:HyperLink ID="hlMore" runat="server" NavigateUrl='<%# Eval("link") %>' Target="_blank" Text="更多内容"></asp:HyperLink>)
ow CV`N 75 </asp:Panel>
w _E*>Sr 76 <ajaxT:CollapsiblePanelExtender ID="cpe1" runat="server" TargetControlID="Panel1"
:j "~ 77 ExpandControlID="panelHeader" CollapseControlID="panelHeader" SuppressPostBack="true"
9xsj[`)mu 78 ImageControlID="Image1" Collapsed="true" ExpandedImage="~/images/collapse_blue.jpg"
wnucw#U 79 CollapsedImage="~/images/expand_blue.jpg" />
5u0?iN* 80 <hr style="border-bottom: 1px dotted #B2B2B2; margin: 0px;" />
8g1m6"!t 81 </ItemTemplate>
T@\A6WFq 82 </asp:DataList>
I8<!)d@xz 83 </asp:Panel>
pHK&uyOV! 84 </ContentTemplate>
/H9D G( 85 </asp:UpdatePanel>
xo*$? |x 86 </div>
2LC*We ' 87 </div>
$9@&Q'ub 88 <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="true">
*C ?~qG 89 <ProgressTemplate>
(s!,+><d 90 <div id="updProgress">
:r_d @R= 91 <img alt="" src="images/indicator.gif" />
cXUx1+@Ry 92 <span>数据获取中</span>
!Q)8>, 93 </div>
HBL2/^'vy 94 </ProgressTemplate>
^V#[qNG!{ 95 </asp:UpdateProgress>
Bbqzb5 96 </form>
"<}kcu+): 97 <center><div><a href="
http://meil.livebaby.cn">meil.livebaby.cn</a> 程序制作:向东 2007.7</center>
})KNia 98 </body>
<3ra(~b' 99 </html>
:om.PqM|+% 100
dY05mY J(f(k@q 比较重要的是这两部分:
I-Am~N"! KkLhD)) a) 行66:<Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
|^IxL@j=5 在页面上建了一个Rss数据绑定控件,这是实现RSS读取的核心了,有了这个标记就实现了RSS读取的一半工作,那剩下的吶?
+, n61szG H~vlQI)\ 看看下面者部分,lnk_cmd 命令实现了RSS数据的重绑定,这样你就可以实时的访问多个RSS地址了。每次点击相应的Rss链接,页面就会读取并显示相关Rss的内容了。
_{m'wk% 如果你觉得这样还不够灵活,可以加个Textbox,然后用程序去绑定,这样也不错。不过,此次就不实现这个了,有兴趣的朋友可以试试,应该不难。哈哈!
A?oZ?/Y S]ZTOi`4 b) 行35:<asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);"
)M<u,:D\v OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
.YRn}#w B5 Iux<`3 $] 1 protected void lnk_cmd(object sender, CommandEventArgs e)
(3jKk 2 {
R3UgX4Q| 3 int command = Convert.ToInt32(e.CommandArgument);
fai[AQA^Y 4
%{rg@L1 5 rssDataBind(command);
y{G?`U$}= 6 }
fyCvy+K rssDataBind就是绑定的函数,代码是:
xE NT-k&s 1 protected void rssDataBind(int cmd)
sY^Q-JVJ 2 {
Osya@[E5 3 switch (cmd)
|?nDB(q 4 {
Td=XNxmB 5 case 0:
y 4]TT 6 rssDS.Url = "
http://www.livebaby.cn/blog/u/meil/rss2.xml"; P)F},ed 7 lsBlog.DataBind();
d,mO\u*s|6 8 lblHeader.Text = "向东博客";
^24,O1)3 9 break;
Cv5(Wc 10 case 1:
QZuVnt 11 rssDS.Url = "
http://www.livebaby.cn/blog/u/money/rss2.xml"; Tmv%vK 12 lsBlog.DataBind();
BY.wo! 13 lblHeader.Text = "财经博客";
+;q'S!0z4 14 break;
Xf5%(/`C! 15 case 2:
.w B,] i 16 rssDS.Url = "
http://www.livebaby.cn/blog/u/flower/rss2.xml"; 3[Y~_KU,7 17 lsBlog.DataBind();
KD7bgFPZ 18 lblHeader.Text = "Flower博客";
4eCp"bC_ 19 break;
i-rh6g.{ 20 case 3:
Q^gy.% 21 rssDS.Url = "
http://www.livebaby.cn/blog/rss2.asp"; $ ai1L8 22 lsBlog.DataBind();
g5k*eEb r 23 lblHeader.Text = "活力宝贝博客网";
&2#:b^i5m 24 break;
^asA WSoM| 25 case 4:
:?YK8_=NW 26 rssDS.Url = "
http://www.livebaby.cn/blog/u/yoyo/rss2.xml"; f 3'j6 27 lsBlog.DataBind();
,f#LWJ_amt 28 lblHeader.Text = "悠悠宝贝的博客";
CGWbH.EfNz 29 break;
]%fo6b{ 30 case 5:
L$6ct=\u*l 31 rssDS.Url = "
http://www.cnblogs.com/meil/rss"; O__b[a . 32 lsBlog.DataBind();
^~Dqn.>J 33 lblHeader.Text = "向东博客园博客";
^G<,?.X 34 break;
`&nmj1; 35 case 6:
S|z6{kgvp 36 rssDS.Url = "
http://www.cnblogs.com/rss"; bN{1qN~& 37 lsBlog.DataBind();
y }\\-)!\ 38 lblHeader.Text = "博客园";
A6,%z&C8K 39 break;
-2yJ,Of5 40 default:
Mg\:?$> 41 break;
$@0M0<_1~ 42 }
1KPZ; 0 43 }
Ga`"J$cHM 就这么简单
=Z#~y!? rssDS.Url = "
http://www.livebaby.cn/blog/u/meil/rss2.xml"; R0*{4R N lsBlog.DataBind();
8w 0^:N| 是不是就如DB数据的绑定。MS的东西虽然结构性不好,但是上手真的好快。
4 Z73{V 到底需要多少个Case就看你的需要了。我这里就绑定了六个RSS地址,你还可以更多,但要注意的是一定要和页面上的LinkButton数对应上。
D*,EQW#_ >*OZcDj/dJ 最终的C#代码如下:
Lt"qH8}l 1 protected void rssDataBind(int cmd)
pTs6~WxXc, 2 {
=` mTABY 3 switch (cmd)
N1<:hBmR 4 {
>SL%GVS 5 case 0:
[P \x\y 6 rssDS.Url = "
http://www.livebaby.cn/blog/u/meil/rss2.xml"; "KEG`}#C 7 lsBlog.DataBind();
X9>^.H6 8 lblHeader.Text = "向东博客";
/T*}LW[$B 9 break;
TTAI*M1th 10 case 1:
6.gJ uu 11 rssDS.Url = "
http://www.livebaby.cn/blog/u/money/rss2.xml"; v <SWAbG 12 lsBlog.DataBind();
4i%$.i7K 13 lblHeader.Text = "财经博客";
; F-eS 0 14 break;
I}PxYG 15 case 2:
R"g_u `\ 16 rssDS.Url = "
http://www.livebaby.cn/blog/u/flower/rss2.xml"; ZNh;~xk 17 lsBlog.DataBind();
]cO)-wL 18 lblHeader.Text = "Flower博客";
k7uapN 19 break;
W(v.8>_|q 20 case 3:
`![.U2a# 21 rssDS.Url = "
http://www.livebaby.cn/blog/rss2.asp"; ql>B& PS 22 lsBlog.DataBind();
1fs,0lU) 23 lblHeader.Text = "活力宝贝博客网";
:t=:/ZW 24 break;
\G!r`$W( 25 case 4:
&`To#X + 26 rssDS.Url = "
http://www.livebaby.cn/blog/u/yoyo/rss2.xml"; !AXP$(C 27 lsBlog.DataBind();
(aw*"^P e5 28 lblHeader.Text = "悠悠宝贝的博客";
V[eW%+(< 29 break;
oI>+n$.G 30 case 5:
3'9R]fqmw 31 rssDS.Url = "
http://www.cnblogs.com/meil/rss"; U@I<$.1+ 32 lsBlog.DataBind();
I&uRgUb 33 lblHeader.Text = "向东博客园博客";
[ uXhRpj 34 break;
B_rW\ 35 case 6:
J` V!= M 36 rssDS.Url = "
http://www.cnblogs.com/rss"; 3WH_78s&R 37 lsBlog.DataBind();
o(,nD#O?mU 38 lblHeader.Text = "博客园";
Uu 7zb| 39 break;
(!a}Lu, 40 default:
0@$sx<e 41 break;
zpOqLGy6i 42 }
e e-J#|w6 43 }
8r>J"-cU k dpY( --------------------------------------------------------------------------------
{Slq v8-l[au4> CEJwpL 什么是 Rss ?
4W].bB8 0FS%DPdML 讨论与Blog相关的技术,不可不谈的就是RSS,这个缩写在英文中可以有几个源头,并被不同的技术团体做不同的解释。既可以是“Rich Site Summary”,或“RDF Site Summary”,也可以是“Really Simple Syndication”。为什么有这么多含义呢?这还要从RSS的一段今天也没有理清的关系说起。
Vjb<m [ #$; js (D@1 今天肯定有人还记得IE 4刚刚推出来的时候有一个有趣的功能,那就是新闻频道。这个新闻频道的功能与Netscape推出的新闻频道是很相似的(当时Netscape还是市场上领先的浏览器)。为此Netscape 定义了一套描述新闻频道的语言,这就是RSS,只不过Netscape自当时起每况愈下,所以最终也没有发布一个正式的RSS规范(只发布了一个0.9版本)。而微软也在当时推出了支持自己IE的CDF(Channel Definition Format)数据规格,与RSS非常接近。微软试图用新闻频道的功能把“推”(Push)技术变成一个应用主流,并与Netscape抗衡。不过出乎预测的是,“推”技术自始至终没有找到合适的商业模型,而且伴随着其他各类网络特性的出现,也日益无法显现自身的优势。新闻频道在浏览器中的地位最终日暮西山,最后也在IE的后续版本中消失了。
VV2%g#Qy \([Ac{] 新闻频道的确进入了低谷,但是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两个阵营,也由此引起了在专业人群中的广泛争论。
YMo|cgr u%W{uwW 因为争论的存在,一直到今天,RSS 1.0还没有成为标准化组织的真正标准。而戴夫·温那却在2002年9月独自把RSS升级到了2.0版本,其中的定义完全是全新的模式,并没有任何 Rss 1.0的影子。这引发了网络上进一步争议,究竟让一个越来越普及的数据格式成为一个开放的标准,还是被一家公司所定义和控制,成为了争议的焦点。戴夫·温那并没有为自己辩解,他的观点是RSS还需要进一步发展,需要专业人士更明确的定义,不过恐怕这种轻描淡写不能消除人们对 Rss “被一家商业公司独占”的担心。
R&$eFpX# 3E)5N00_ 前面的铺垫对用户来说也许没有什么太大的意义,可能更多人关心如何在自己的Blog增加 Rss 输出,这样可以让很多新闻聚合工具(例如CNBlog刚刚推荐的NewzCrawler)很容易找到你并自动获得你在Blog中的更新内容。
pFoLG a5 0$8Y#F[s 它是什么:站点用来和其他站点之间共享内容的简易方式(也叫聚合内容)。 Rss 使肵ML作为彼此共享内容的标准方式。
wdxuDlo %2i{w( '[ 它代表什么:Really Simple Syndication (或RDF Site Summary,RDF站点摘要)
$^T1U,8?' LO?QWT1oe 例如:一些免费的软件能够让你阅读那些RSS使能的站点,比如 NewsIsFree 和 Amphetadesk。
EB+VNtDPVy /m3 }c' 它有什么用处:让别人容易的发现你已经更新了你的站点,让人们很容易的追踪他们阅读的所有weblogs。
/cN\X+ <Bmxt#"> 源码地址:
http://www.cnblogs.com/Files/meil/ReaderRss.rar T Nuf7W7 Jc"h}4< JpE' Os" 本文永久地址:
http://www.livebaby.cn/blog/u/meil/archives/2007/1169.html
查看本文来源