» 网友学堂 » NET教程 » 用ASP.NET建立一个在线RSS新闻聚合器
用ASP.NET建立一个在线RSS新闻聚合器
作者:问天 发表时间:2007-2-20 03:06 阅读:318次 在百度搜索相关内容

">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:param name="ID" />
<xsl:template match="/rss/channel">
<b><xsl:value-of select="item[$ID]/title"
disable-output-escaping="yes" /></b>
<p>
<xsl:value-of select="item[$ID]/description"
disable-output-escaping="yes" />
</p>
<a>
<xsl:attribute name="href"><xsl:value-of
select="item[$ID]/link" /></xsl:attribute>
<xsl:attribute name="target">_blank</xsl:attribute>
Read More...
</a>
</xsl:template>
</xsl:stylesheet>
  注意 <xsl:param> 元素被用于声明 ID XSLT 参数。然后,在几个不同的 <xsl:value-of> 元素中,ID 参数 被用来从 <item> 元素列表中抓取特定的 <item> 元素。在 XPath 的语法中,elementName意思是根据相应元素名 存取第i个元素。例如,item[1]将只获取第一个<item>元素,item[2]则获取第二个元素。所以 item[$ID]是获取由 XSLT 参数 ID 定义的 特定 <item> 元素。
  最后,值得注意的还有在样式表靠近末尾部分的超链接 Read More…,它的target属性设为空,这样的话当用户点击 Read More… 链接的时候,浏览器会打开一个新的窗口。

  未来的扩展和当前程序的缺点
  本文讲述的代码中有一个明显的缺点就是每次用户点击左边框架的某个聚合摘要或者在右上部框架点击某个新闻项时,远程聚合摘要都会被装载和解析。每次用户点击远程聚合 摘要时,所有的项都被加载,这样的效率无疑是很差的。每次用户点击一个新闻项标题就重新装载整个远程聚合摘要也是很浪费资源的。这样的方法不仅没有效率,对提供发布服务的个人或者公司也是不礼貌的,因为这些 连续的、不没必要的请求占用了他们的 Web 服务器的负载资源。
  这个缺点在本文附带的源代码中已经得到解决。具体来说,.NET数据缓存可以用来存放不同摘要的 XmlDocument 对象。缓存间隔设置为数据表 Feeds 中 UpdateInterval 字段定义的值。(当然,由于某些原因,摘要的 XmlDocument 对象有可能会被提前清除出缓存)
  这个系统的另外一个缺点是在右上部框架和右下部框架之间没有状态的保存。为了说明这样会引起什么问题,考虑以下的动作:
  &;#11751;&;#84518;&;#36327;&;#11877;绥&;#96680;&;#126566;&;#4518;&;#126375;&;#106790;&;#128036;&;#101032;&;#5797;&;#66086;&;#71208;恩&;#81830;&;#59759;&;#115493;&;#117285;&;#64740;&;#98985;&;#14886;&;#4518;&;#126372;&;#101224;&;#12648;&;#122728;&;#128612;&;#101030;&;#71208;恧&;#106790;&;#93225;&;#98025;&;#7783;&;#113571;&;#165;&;#4584;&;#61352;&;#128612;&;#101030;&;#71208;恧&;#106773;pdateInterval 的值是30,则表示这些内容在30分钟之 后会过期;
  &;#11752;&;#12648;&;#122725;&;#64740;&;#98985;&;#14886;&;#4518;&;#126375;&;#106790;&;#93225;&;#98025;&;#7783;&;#106789;&;#66342;&;#97711;&;#115496;&;#128612;&;#108261;&;#24933;&;#61032;&;#10983;&;#115941;&;#54824;&;#89574;&;#121199;&;#116476;/DIV>
  &;#11751;&;#84518;&;#36327;滥&;#114725;&;#61157;&;#65765;&;#53801;&;#23407;&;#116476;/DIV>
  &;#11749;&;#62565;&;#98536;&;#5797;&;#66085;&;#24933;&;#61031;&;#106791;&;#119911;&;#46693;&;#10149;&;#43044;&;#106916;&;#98342;&;#120934;&;#93223;&;#106790;&;#93225;&;#98025;&;#7791;&;#116476;/DIV>
  &;#11750;&;#33892;&;#113447;&;#106791;&;#84518;跤&;#98340;&;#101029;&;#66534;&;#97701;&;#53801;孥&;#66469;&;#112550;&;#121188;&;#106927;&;#115496;&;#128612;&;#101024;摘要的 XmlDocument 的缓存已经过期;
  &;#11751;&;#84518;&;#36327;&;#11877;绥&;#64740;&;#98985;&;#14886;&;#4518;&;#126375;&;#106791;&;#52004;&;#98342;&;#120934;&;#93225;&;#98025;&;#7791;&;#115493;&;#65956;&;#116389;&;#117285;&;#64740;&;#99049;&;#14885;膦&;#4518;&;#126372;&;#101224;&;#12648;&;#122720;DisplayItem.aspx,传入 ID 参数值1;
  &;#11716;isplayItem.aspx 页面在缓存中没找到 XmlDocument 对象,只好重新获取远程摘要。这样就会获得新的数据了(别忘了,步骤 4 已经加了一个新的新闻项),然后此页面会显示第一条新闻项目(因为ID参数的值为1) ;
  &;#11751;&;#84518;&;#36327;&;#115429;谤&;#106918;&;#93223;&;#106790;&;#93225;&;#98025;&;#7791;&;#115492;&;#119206;&;#101349;&;#24933;&;#61028;&;#116388;&;#112932;&;#112038;&;#18405;谦&;#115303;&;#11877;&;#113702;&;#13423;&;#115493;&;#112676;&;#102053;&;#97447;&;#111588;&;#99174;&;#101348;&;#112038;&;#36903;&;#11877;继&;#106793;&;#10468;&;#98342;&;#120934;&;#93225;&;#98020;&;#106927;&;#115496;&;#804;&;#99621;&;#64740;&;#98985;&;#14884;&;#104422;&;#75878;&;#115302;&;#102311;亩&;#10470;&;#120934;&;#93223;&;#106790;&;#93225;&;#98019;
  之所以出现这样的问题,是因为 ID 参数没有唯一地标识一个新闻项,它只是一个特定时间点上新闻项列表中的一个偏移量。解决这个问题的一个好的方法是不要用数据缓存来保存聚合 摘要,而是使用数据库或者持久介质的其它方式(比如 Web 服务器本地文件系统的 XML 文件)。如果使用数据库,每一个新闻项都可以拥有一个唯一的标识号,可以用来传递到右下角的框架中。这种方法可以保证解决上面提到的问题。当然也会增加系统的复杂性,比如需要决定何时从数据库中清除掉旧的新闻项 。
  本文现有的应用程序还缺少异常处理,而这肯定是应该加上的。尤其是当从远程 RSS 聚合摘要文件获取数据并加载到 XmlDocument 对象时,应该加上异常处理。因为远程的文件可能不存在或者格式不正确。
  还有很多增强功能可以轻松地加入到这个在线新闻聚合器。一个明显的功能是需要一个管理页面来允许用户添加,删除和编辑他们现在的聚合摘要。还有,如果能允许用户自定义分类 ,将他们的聚合摘要按类别放在一起就更好了。另外,现在的用户界面还是比较粗糙的,但是通过增加一些 XSLT 样式表生成的 HTML 代码或者在几个框架里面增加一些样式表就可以很容易地美化一下界面。最后,在html标签里面加一些<meta>元素,可以让右上部框架定时地去刷新,使得用户不用自己手工去刷新页面就可以看到最新的新闻项目。
  注解 (2003年8月4日): 在这篇文章发布以后,一些读者用 Email 告诉通知我在显示特定 RSS 聚合项的 <description> 元素时,有两个潜在的问题:
  1、Disable-output-encoding 属性,这个属性用在 <xsl:value-of> 元素中,但是并不是所有的 XSLT解析器都实现了这个功能。.NET XSLT 解析器支持 disable-output-encoding,但是还是要 注意一下,因为读者可能试图将这个应用程序移植到其它平台。
  2、<description> 元素的 HTML 内容是被原封不动地输出的。但是,这些 HTML 内容可能包含恶意代码,比如 <script> 或者 <embed> 代码块。理想情况下,这些代码应该被剔除掉。为了清除掉这些有潜在危险的代码,可能需要用到一些扩展函数(参见 Extending XSLT with JScript, C#, and Visual Basic .NET)。想查看从 RSS 聚合 摘要剔除 HTML 内容的更多信息,可以参见’’Dive Into Mark’’ 日志.
  总结
  在本文中,我们不仅讲到如何创建一个聚合引擎,还创建了一个在线新闻聚合器。在建立这两个应用程序时,我们都采用了在 ASP.NET 页面显示 XML 数据的技术。在聚合引擎里面,我们使用了 Repeater 控件以 XML格式来显示数据库中的数据。而在新闻聚合器里面,我们使用了 XML Web 控件和 XSLT 样式表。

#Advertisement