张子阳的博客

首页 读书 技术 店铺 关于
张子阳的博客 首页 读书 技术 关于

在Web站点中创建和使用Rss源

2007-11-14 张子阳 分类: Asp.Net

介绍

Rss是将你Web站点的内容与其他人分享的标准方式。Rss代表着:Really Simple Syndication。它不过是一个标准化的XML标记,用于描述你想要分享的内容。因此Rss是一个在你的内容准备好被其他用户所消费时被广泛接受的格式。一些使用Rss的范例站点有:www.asp.netweblogs.asp.netwww.dotnetbips.com 。Dotnetbips.com 通过 Rss 发布新添内容的列表,这个列表可能会被其他的站长放置在他们的站点或目录中。

Rss的格式

如同我之前提到的,Rss不过是有着一些特殊标签的XML标记。下面的标记展示了这样一个文档:

<rss version="2.0"> <channel> <title>DotNetBips.com Latest Articles</title> <link>www.dotnetbips.com</link> <description>DotNetBips.com Latest Articles</description> <copyright>Copyright (C) DotNetBips.com. All rights reserved.</copyright> <generator>www.dotnetbips.com RSS Generator</generator> <item> <author>Bipin Joshi</author> <title>Using WebRequest and WebResponse</title> <link>http://www.dotnetbips.com/displayarticle.aspx?id=239</link> <description>Description here</description> <pubDate>Sun, 25 Jan 2004 12:00:00 AM GMT</pubDate> </item> </channel> </rss>

让我们仔细看看每一个标记:

除了上面的这些标签,还可以有一个或多个<item>标签。Item标签代表着你想要分享的实际条目。比如,文章、博客入口。每个<item>标记进一步包含下面这些子结点。

采用的方法

OK,我们已经对Rss的格式做了了解,但是如何使用.Net生成Rss源?.Net有许多XML相关的类。我们将从这些类中使用XML Text Writer来生成 Rss源。但是我们应该开发出一个通用的解决方案以便在任何的web站点中都可以使用。这就意味着我们的代码必须独立于特定的数据库领域或者表。为了达到这个目的,我们将要在VS.NET中创建一个类库。我们Rss的<item>标记的数据源将采用一个Dataset,这个Dataset通常填充自数据库表。这个类将有下面的属性和方法。

属性

方法

下面列出的是上面这些属性和方法的完整程序清单。为了简单和快速地作个示范,我使用了公用字段,而没有使用属性。在实际的应用程序中,应该使用属性。

using System; using System.IO; using System.Data; using System.Xml; using System.Collections.Generic; using System.Text; public class Rss { public Stream OutputStream; public string RssTitle; public string PublisherUrl; public string Description; public string Copyright; public string Generator; public DataSet ItemSource; public string ItemTitleField; public string ItemUrlField; public string ItemDescriptionField; public string ItemPublicationDateField; public string ItemAuthor; public static void PublishRss(Rss r){ XmlTextWriter writer = new XmlTextWriter(r.OutputStream, Encoding.UTF8); writer.WriteStartDocument(); writer.WriteStartElement("rss"); writer.WriteAttributeString("version", "2.0"); writer.WriteStartElement("channel"); writer.WriteElementString("title", r.RssTitle); writer.WriteElementString("link", r.PublisherUrl); writer.WriteElementString("description", r.Description); writer.WriteElementString("copyright", r.Copyright); writer.WriteElementString("generator", r.Generator); foreach (DataRow row in r.ItemSource.Tables[0].Rows) { writer.WriteStartElement("item"); writer.WriteElementString("author", row[r.ItemAuthor].ToString()); writer.WriteElementString("title", row[r.ItemTitleField].ToString()); writer.WriteElementString("link", row[r.ItemUrlField].ToString()); writer.WriteElementString("description", row[r.ItemDescriptionField].ToString()); writer.WriteElementString("pubDate", Convert.ToDateTime(row[r.ItemPublicationDateField]).ToString("dd MMM yyyy hh:mm:00 ")); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); writer.Flush(); } }

这里pubDate的日期格式很重要,当你按上面的代码对pubDate进行格式转换的时候,假如数据库中是 2007-9-14 9:58,那么在英文操作系统下,会转换成 “14 Sep 2007 9:58”,这个是没有问题的。但在中文操作系统下,就变成了 “14 九月 2007 9:58”。导致的结果就是在IE7中点开rss源的时候,发现日期没有显示。如果你不进行数据格式转换,简单的使用一个 ToString(),结果仍是如此。这里,我是写了一个方法,对它进行了格式转换:

// ... 省略 ... writer.WriteElementString("pubDate", GetRssDate(row[r.ItemPublicationDateField])); // ... 省略 ... public static string GetRssDate(Object date) { DateTime rssDate = Convert.ToDateTime(date); string[] monthName = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; StringBuilder sb = new StringBuilder(); sb.Append(rssDate.Day); sb.Append(" "); sb.Append(monthName[Convert.ToInt32(rssDate.Month) - 1]); sb.Append(" "); sb.Append(rssDate.Year); sb.Append(" "); sb.Append(rssDate.ToLongTimeString()); return sb.ToString(); }

我看到ToString()有一个重载了的方法,接受一个IFormatProvider类型的参数,这个应该是进行格式转换的标准方式,MSDN的范例有点长了,就没有研究下去。如果哪位朋友对这里有好的解决方法,可以在回复在评论中,Thanks。

创建属性就像上面显示的那样容易。PublishRss()方法是我们这里关心的核心内容。我们创建了System.Xml.XmlTextWriter类的实例。这个类是撰写XML文档的快速方式。在这个例子中,我们传递进一个OutputStream对象,并确定编码(UTF-8)。然后我们开始写入这个文档的不同部分。我们使用XmlTextWriter类的下面这些方法。

注意,你必须恰当地调用 WriteStartElement()和WriteEndElement()方法以生成格式良好的(well formed)XML 文档。

创建Asp.Net Web窗体

现在我们已经创建好了一个通用类,我们可以在我们的Web窗体中使用它。假设我们将以Rss源形式发布的数据存储在一个表格(Article)中,这个表格的结构如下:

以DataSet形式获取Table内容

我们将在Asp.Net Web应用程序中创建一个Rss.aspx文件,在CodeBehind中创建一个 GetDataSet()方法。这个方法使用DataAdapter来填充一个Dataset。

public DataSet GetDataSet() { SqlConnection conn = new SqlConnection("你的连接字符串"); string sql = "Select * From Article Order By ArticleId Desc"; SqlDataAdapter da = new SqlDataAdapter(sql,conn); DataSet ds = new DataSet(); da.Fill(ds, "Article"); return ds; }

当我们获得DataSet后,将ItemSource属性设置为这个DataSet。另外,我们再设置Response对象的ContentEncoding和ContentType属性。然后,调用PublishRss()方法,将这个Rss类的实例传递进去。

OK,现在我们在IE中浏览Rss.aspx页面,应该可以看到如下图所示的画面:

此时 创建Rss源的类名和 Rss.aspx CodeBehind中的Page类名将会一样,都是Rss,所以需要手动修改Rss.aspx.cs 中的Page类名,比如,改为_Rss,则代码为:public partial class _Rss : System.Web.UI.Page;同时,修改HTML页面的 inherints:Inherits="_Rss"

消费Rss源

创建了Rss源以后,其他的站点可以消费这个Rss源。我会以创建一个显示 www.asp.net 最新文章的Web窗体来作为范例。

我想应该是因为对于发布Rss源的站点来说,使用源的站点是消费者Consumer,所以英文技术文章中使用源通常都用Consume这个词,而不用Use。

为了能通过一个URL来读取XML的数据,我们当然可以使用 WebRequest 和 WebResponse 对象(参考我的文章 Using WebRequest and WebResponse)。然而,有一个更简单的方法 – DataSet。

DataSet类有一个叫做ReadXml()的方法,可以从硬盘的文件或者URL中读取XML数据。这个方法读取数据并自动为我们生成所需的DataTable。

DataSet ds = new DataSet(); ds.ReadXml("http://127.0.1.1/rss.aspx");

这里,我们创建了一个DataSet的实例,并且通过传递URL参数来调用ReadXml()方法。可以根据需要来改变传进去的URL参数。

ReadXml()方法生成的表格

如果你期望ReadXml()方法会生成一个DataTable,其中包含着链接的列表,你会惊奇地发现实际上会生成三个DataTable。在 RSS 的格式 这一小节的XML标记中,我们看到标记是嵌套的,DataSet会在读取数据的时候自动创建相关表。它也会为每个DataTable创建ID字段以便他们可以相互链接。

在这个例子中,你会得到下面构架的 DataTable:

RSS

Channel

Item

注意一些字段,比如Creator和 Guid 并没有在Rss标记中出现。另外注意DataSet是如何添加Rss_Id和Channel_Id这样的字段来关联DataTable的。

现在我们已经知道了表的结构,让我们编写一些代码来在GridView中显示这些数据。

在GridView中显示数据

从Rss源中获得的详细信息来看,第三张表是最重要的,因为它包含了实际的链接数据。这里我们将我们的GridView与第三个DataTable进行绑定。

GridView1.DataSource = ds.Tables[2].DefaultView; GridView1.DataBind();

一旦你在PageLoad事件中调用这段代码,可以看到类似下面这样的屏幕截图:

加入浏览器支持

IE7 和 FireFox 都提供了对Rss的支持,为了使浏览器提供Rss支持,你必须先告诉它们你的站点创建了Rss源。只需要在<head></head>标签中加入如下代码即可:

<link rel="alternate" type="application/rss+xml" title="Your Web Site’s RSS Feed Title " href="http://www.yourdomain.net/rss.aspx" />

这时再打开加入上面<link>的页面,会发现IE7的 RSS图标由灰色变成了明亮的桔红色。

总结

在这篇文章中,我们了解了什么是RSS,以及如何为你的站点生成RSS源。我们使用XmlTextWriter类来创建Rss标记。我们创建了一个通用类,以便它可以在任何Web应用程序中使用。

随后,我们了解了如何使用DataSet来消费Rss源。Rss源是一个嵌套的XML标记,DataSet自动创建彼此相关的DataTable。第三张表(ITem)包含了Rss源的核心数据。

感谢阅读,希望这篇文章能给你带来帮助!