kimi

对RSS2.0的研究(二)

上面主要将了RSS的作用:将本站的信息以XML的格式让他人订阅。
对于WEB编程爱好者来说,我们的任务是将自己网站的信息以RSS的形式让别人订阅,下文主要讲解在asp.net写这一实现过程。我们的工作是要将自己网站的信息以XML的格式并遵循RSS2.0 RSS2.0 规范被发布在 Harvard Law 网站 的技术栏目上)标准发布出去。
 

本文我们将要创建的第一个微型程序是一个聚合文件生成器。针对这个迷你程序,假设你是一个大型新闻网站(如 MSNBC.com)的 Web 开发者,所有的新闻内容都保存在 Microsoft SQL Server 2000 数据库中。具体地说,这些文章是 都保存在一个名为 Articles 的表中,表中以下字段与我们的程序密切相关:

  • ArticleID—主键,自增长的整型字段,用来唯一标识每一篇文章;
  • Title— 指定标题,字段数据类型: varchar(50)
  • Author—指定作者,字段数据类型: varchar(50)
  • Description—新闻内容描述,字段数据类型: varchar(2000)
  • DatePublished—新闻发布日期,字段数据类型:datetime

  请注意,Articles 表中可能还有其它字段,上面所列的只是我们在创建聚合文件的时候所要用到的字段。而且,这只是一个非常简单的数据模型,在 是应用的数据库环境中,你可能会使用更加标准化的数据库模型,比如具备一个单独的 authors (作者)表,有一个建立作者和文章之间多对多关系的表等等。
  下一步,我们将创建一个ASP.NET页面,用格式化好的 RSS2.0 XML 文件显示一个最新的新闻列表。在讲述如何在 ASP.NET 页面 中完成这种转换之前,我们要先介绍一下 RSS2.0 规范的内容。我们应该记住,在整个规范中,RSS 是被设计用来为聚合内容提供一个数据模型。那么 毫无疑问,它会有一系列的 XML 元素,用来描述 Web 站点要聚合的内容信息,以及一系列用来描述某一特定新闻项的 XML 元素。最后,不要忘记 RSS 聚合文件是一个 XML 格式文件,必须符合 XML 格式化的准则, 也就是:

  • 所有 XML元素必须正确嵌套;
  • 所有的属性值要用引号包含起来;
  • <, >, &, "''符号要相应地替换为 &lt;,&gt;, &amp;, &quot; &apos;

  而且,XML格式是大小写敏感的,这就意味着,XML元素的起始和终止标签必须匹配,拼写和大小写都必须一致。
  RSS2.0 的根元素是<rss>元素,这个元素可以有一个版本号的属性,例如:

<rss version="2.0">

  ...

</rss>

<rss>元素只有一个子元素<channel>,用来描述聚合的内容。在<channel>元素里面有三个必需的子元素,用来描述 Web 站点的信息。这三个元素是:

  • title—定义聚合文件的名称,一般来说,还会包括Web站点的名称;
  • link—Web站点的URL
  • description—Web站点的一段简短的描述。

除此之外,还有一些可选元素来描述站点信息。这些元素的更多信息请参见 RSS2.0规范

每一个新闻项目放在一个单独的<item>元素中。<channel>元素可以有任意数量的<item>元素。每个<item>元素可以有多种的子元素,唯一的要求是最少必须包含<title>元素和<description>元素其中一个作为子元素。以下列出了一些相关的<item> 子元素:

  • title—新闻项目的标题;
  • link—新闻项目的URL
  • description—新闻项目的大纲;
  • author—新闻项目的作者;
  • pubDate—新闻项目的发布日期

  下面是一个非常简单的 RSS2.0 聚合文件。你可以从 RSS generated by Radio UserLand 看到其他的RSS2.0文件的例子。

<rss version="2.0">

  <channel>

    <title>Latest DataWebControls.com FAQs</title>

    <link>http://datawebcontrols.com</link>

    <description>

        This is the syndication feed for the FAQs

        at DataWebControls.com

    </description>

    <item>

      <title>Working with the DataGrid</title>

      <link>http://datawebcontrols.com/faqs/DataGrid.aspx</link>

      <pubDate>Mon, 07 Jul 2003 21:00:00 GMT</pubDate>

    </item>

    <item>

      <title>Working with the Repeater</title>

      <description>

         This article examines how to work with the Repeater

         control.

      </description>

      <link>http://datawebcontrols.com/faqs/Repeater.aspx</link>

      <pubDate>Tue 08 Jul 2003 12:00:00 GMT</pubDate>

    </item>

  </channel>

</rss>     

  关于<pubDate>元素的格式有一点特别重要,再此要讲一下。RSS 要求日期必须按照 RFC822 日期和时间规范 进行格式化,此格式要求:开头是一个可选的3字母星期缩写加一个逗号,接着必须是日加上3字母缩写的月份和年份,最后是一个带时区名的时间。另外,要注意 <description> 子元素是可选的:上 述文件第一个新闻没有 <description> 元素,而第二个新闻就有一个。

通过 ASP.NET 页面输出聚合内容

  现在,我们已经知道了如何按照 RSS2.0 规范存储我们的新闻项,我们已经就绪创建一个 ASP.NET 页面,当用户发出请求时,就会返回网站聚合 的内容。更确切地说,我们将建立一个名字叫 rss.aspx ASP.NET 页面,这个页面会按照 RSS2.0 规范的格式返回 Articles 数据库表中的最新的 5 个新闻项
  可以有几种方法来完成这件事,稍后将会讲到。但是现在,我们首先要完成一件事,那就是先要从数据库中获得最新的5个新闻项。这可以用下面的 SQL 查询语句获得:

SELECT TOP 5 ArticleID,Title,Author,Description,DatePublished FROM Articles ORDER BY DatePublished DESC

  获得了这些信息以后,我们需要把这些信息转换成相应的 RSS2.0 格式聚合文件。要把数据库的数据显示为XML数据最简单、快速的方法就是使用 Repeater 控件。准确地说,Repeater 控件 将在 HeaderTemplate FooterTemplate 模版里显示<rss>元素、<channel>元素以及站点相关的 元素标签,在 ItemTemplate 模版里面显示 <item> 元素。下面是我们这个 ASP.NET 页面(.aspx文件)的 HTML 部分

<%@ Page language="c#" ContentType="text/xml" Codebehind="rss.aspx.cs"

  AutoEventWireup="false" Inherits="SyndicationDemo.rss" %>

<asp:Repeater id="rptRSS" runat="server">

  <HeaderTemplate>

    <rss version="2.0">

      <channel>

        <title>ASP.NET News!</title>

        <link>http://www.ASPNETNews.com/Headlines/</link>

        <description>

          This is the syndication feed for ASPNETNews.com.

        </description>

  </HeaderTemplate>

 

  <ItemTemplate>

        <item>

          <title><%# FormatForXML(DataBinder.Eval(Container.DataItem,

                                              "Title")) %></title>

          <description>

             <%# FormatForXML(DataBinder.Eval(Container.DataItem,

                                     "Description")) %>

          </description>

          <link>

             http://www.ASPNETNews.com/Story.aspx?ID=<%#

                   DataBinder.Eval(Container.DataItem, "ArticleID") %>

          </link>

          <author><%# FormatForXML(DataBinder.Eval(Container.DataItem,

                                             "Author")) %></author>

          <pubDate>

             <%# String.Format("{0:R}",

                  DataBinder.Eval(Container.DataItem,

                                         "DatePublished")) %>

           </pubDate>

        </item>

  </ItemTemplate>

 

  <FooterTemplate>

      </channel>

    </rss> 

  </FooterTemplate>

</asp:Repeater>     

  首先要注意的是:上面这段代码例子只包括 Repeater 控件,没有其它的 HTML 标记或 Web 控件。这是因为我们希望页面只输出 XML 格式的数据。实际上,观察一下 @Page 指令,你就会发现 ContentType 被设置为XML MIME 类型(text/xml)。其次要注意的是:在 ItemTemplate 模版里,当 XML 输出中添加数据库字段TitleDescription Author 时,我们调用了辅助函数 FormatForXML()。我们 很快就会看到,该函数被定义在后台编码的类中,其作用只是将非法的 xml 字符替换为它们对应的合法的转义字符。最后我们应该注意,在 <pubDate> 元素里面的数据库字段 DatePublished 是用 String.Format 来格式化的。标准的格式描述符“R” DatePublished 的值进行相应的格式化
  此 Web 页面的后台编码类代码并不复杂。Page_Load 事件处理函数只是将数据库查询结果绑定到 Repeater控件,FormatForXML()函数根据需要做一些简单的字符串替换。为 简单起见,下面的例子只列出了这两个函数的代码:

在浏览器中访问 rss.aspx 页面的截图参见图一。

图一 通过浏览器访问 Rss.aspx 页面

  在我们生成在线新闻聚合器之前,让我谈谈这个聚合引擎一些可能的增强功能。首先,每一次访问 rss.aspx 页面的时候,都要访问一次数据库。如果预期可能有大量的人频繁地访问 rss.aspx 页面,使用输出缓存是很有价值的。其次,通常新闻网站会将聚合的内容分为不同的类别。例如:News.com 有一些专门的聚合内容区, 比如针对企业计算、电子商务、通信的内容等等。在数据库表 Articles 中加入表示类别的 Category 字段就可以很容易地提供这种支持。这样 一来,在 rss.aspx 页面中,可以接收一个表示显示分类的查询参数,然后只搜索指定的新闻项分类即可。

posted on 2005-12-06 10:34  kimi  阅读(355)  评论(0)    收藏  举报

导航