`
javababy1
  • 浏览: 1226996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

介绍

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>

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

  • <rss>:根结点,拥有一个version(版本)属性,最新版本是 2.0
  • <channel>:rss下的根结点,可以再次包含<channel>结点。<channel>结点可以进一步包含<title>,<link>,<item>结点。
  • <title>:代表Rss源的标题。
  • <link>:代表着提供Rss源的站点的URL。
  • <description>:关于这个Rss源的更多详细信息。
  • <copyright>:详细说明版权信息。
  • <generator>:说明产生这个Rss源的应用程序。

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

  • <title>:代表着这个条目的标题。比如:文章标题。
  • <author>:代表着这个条目的作者。比如:文章作者。
  • <link>:代表这个条目的URL。比如:文章的URL。
  • <description>:包含着这个条目的描述信息。比如:文章的摘要。
  • <pubDate>:这个标签包含着这个条目的发布日期。典型的日期格式是:Sun 28 Dec 2003 12:00:00 AM GMT.

采用的方法

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

  • 属性

  • Outputstream:一个源所投递到的stream对象。
  • RssTitle:代表<channel>标签下的<title>的特定值。
  • PublisherUrl:代表<channel>标签下的<link>标签。
  • Description:代表<channel>标签下的<description>值。
  • Copyright:代表<channel>标签下的<copyright>值。
  • Generator:代表<channel>标签下的<generator>值。
  • ItemSource:指定一个包含着item行的Dataset对象。
  • ItemTitleField:数据列,代表<item>标签下的<title>标签
  • ItemUrlField:数据列,代表<item>标签下的<link>标签。
  • ItemDescriptionField:数据列,代表<item>标签下的<description>标签。
  • ItemPublicationDateFiled:数据列,代表<item>标签下的<pubDate>标签。
  • ItemAuthor:数据列,代表<item>标签下的<author>标签。

方法

  • PublishRss:这个静态方法将Rss标记写入到outputstream(输出流)中。

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

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();
}
}

NOTE:这里pubDate的日期格式很重要,当你按上面的代码对pubDate进行格式转换的时候,假如数据库中是 <st1>2007-9-14</st1> 9:58,那么在英文操作系统下,会转换成 “14 Sep 2007 9:<st1>58”</st1>,这个是没有问题的。但在中文操作系统下,就变成了 “14 九月 2007 9:<st1>58”</st1>。导致的结果就是在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类的下面这些方法。

  • WriteStartDocument():这个方法写入XML 1.0版本的声明。也就是:
  • <?xml version="1.0" encoding="utf-8"?>。当不写这个声明的时候,在FireFox中虽然可以订阅,但是看不到任何条目,也不能进行更新。IE7下正常。
  • WriteStartElement:这个方法写入指定标签的起始标记。
  • WriteAttributeString:这个方法为当前打开的标签写入属性。
  • WriteElementString:这个方法写入一个起始标记和一个结束标记,以及起始和结束标记之间的文本。
  • WriteEndElement:这个方法写入当前打开标记的结束标记。不需要在这里指明结束标记的名字,因为在每次嵌套的时候都会在内部(NOTE:属于底层机制)设定。
  • Flush:这个方法将所有缓存的output清出到目的位置。

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

创建Asp.Net Web窗体

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

  • Title - Varchar(255)
  • Description - Varchar(1000)
  • Url - Varchar(255)
  • Author - Varchar(50)
  • Pubdate - DateTime

以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;
}

接着,我们创建一个Rss类的实例,设置它的各个属性,然后调用GetDataSet()方法获取DataSet对象。

protected void Page_Load(object sender, EventArgs e){
DataSet ds = GetDataSet();
Rss rss = new Rss();
rss.OutputStream = Response.OutputStream;
rss.RssTitle = "DotNetBips.com Latest Articles";
rss.PublisherUrl = Request.Url.Host;
rss.Description = "DotNetBips.com - Applying .NET";
rss.Copyright = "Copyright (C) DotNetBips.com.";
rss.Generator = "DotNetBips.com RSS Generator";
rss.ItemSource = ds;
rss.ItemTitleField = "Title";
rss.ItemDescriptionField = "Description";
rss.ItemPublicationDateField = "Pubdate";
rss.ItemUrlField = "Url";
rss.ItemAuthor = "Author";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "text/xml";
Rss.PublishRss(rss);
Response.End();
}

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

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

NOTE:注意,此时 创建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窗体来作为范例。

NOTE:我想应该是因为对于发布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参数。

NOTE:我房子暂时没有上网,所以就使用前面所创建的本地Rss源作为演示。

ReadXml()方法生成的表格

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

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

RSS

  • Rss_Id
  • Version

Channel

  • Title
  • Link
  • Description
  • Language
  • Generator
  • Channel_Id
  • Rss_Id

Item

  • Creator
  • Title
  • Link
  • PubDate
  • Guid
  • Description
  • Channel_Id

注意一些字段,比如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源的核心数据。

希望这篇文章能给你带来帮助。

分享到:
评论

相关推荐

    web版Rss阅读器源码

    Web版RSS阅读器源码是基于网页的订阅工具,它允许用户从各种RSS(Really Simple Syndication)源获取和阅读新闻、博客文章等更新。在本文中,我们将深入探讨RSS阅读器的工作原理、关键技术以及如何使用Java实现这样...

    用XML轻松开发WEB站点(PDF)

    XML(eXtensible Markup Language)是一种用于标记数据的语言,它的设计目的是传输和存储数据,而非显示数据。...通过学习和掌握XML,开发者可以更好地理解和处理结构化数据,提高Web站点的可维护性和可扩展性。

    rss源代码(在线阅读新闻)

    RSS源代码通常指的是用于创建RSS阅读器或集成RSS功能到现有应用程序中的代码。本项目提供的“RSS源代码(在线阅读新闻)”可能是一个基于C#编程语言的解决方案,旨在实现类似于新浪点点通的功能,用户可以方便地管理...

    RSS代码大全-详细介绍RSS开发过程

    **RSS(Really Simple Syndication)**是一种用于发布和聚合网络内容的XML格式,它使得用户可以轻松地跟踪网站的更新,而无需频繁访问每个站点。RSS订阅代码是实现这一功能的关键,尤其对于Java WEB开发者来说,理解...

    Web2.0源代码

    这套【Web2.0源代码】对于学习和开发Asp.net Web2.0应用的开发者来说具有很高的参考价值,它展示了如何使用Asp.net和Ajax技术来构建功能丰富、用户友好的Web应用。同时,它也可以作为一个基础模板,用于快速开发类似...

    rss阅读器 源代码 适合学习

    在RSS阅读器项目中,C#提供了强大的类库和语法支持,便于处理XML数据和构建用户界面。 3. XML解析: 在RSS阅读器中,XML解析是核心部分。C#提供了System.Xml命名空间,包含如XmlDocument、XmlNodeReader等类,用于...

    用XML轻松开发WEB站点.rar

    标题"用XML轻松开发WEB站点"指的是使用XML技术来构建和管理Web站点。通过XML,开发者可以定义自己的标记,使得数据具有更清晰的结构,便于解析和处理。这对于构建动态网页和Web服务至关重要。 在描述中提到的"用XML...

    RSS.rar_RSS_Rss browser_java rss_rss java_rss阅读器

    在Java中,可以创建一个数据结构(如HashMap或ArrayList)来存储RSS源的URL和相关信息,同时设计界面元素让用户能够添加、删除源。当用户选择一个源时,程序需要发送HTTP请求到对应的URL,下载RSS XML文件,然后解析...

    rss阅读器客户端的实现

    4. **数据存储**:将用户订阅的RSS源和已读/未读状态等信息存储在数据库中,可以使用ASP.NET内置的SqlProvider或自定义数据访问层。 5. **缓存机制**:为了提高性能,可以实现缓存机制,将最近获取的RSS feed存储在...

    Atom-feedmixer,从Atom和RSS提要获取和混合条目的微型Web服务(返回Atom、RSS或JSON).zip

    Atom-feedmixer是一个微型Web服务,它专注于从Atom和RSS提要中获取并混合条目内容,然后以Atom、RSS或JSON格式返回给用户。这个服务对于那些需要整合多个信息源,或者希望在一个统一的输出格式下查看不同来源数据的...

    Laravel开发-laravel-rss

    8. **命名空间和自动加载**:遵循PSR-4标准,laravel-rss库会使用命名空间并配置composer.json以实现自动加载,这样在项目中就可以方便地引入和使用库中的类。 9. **Eloquent模型**:如果RSS feed基于数据库中的...

    用XML_松__WEB站点

    在实际应用中,我们可能需要使用XML解析库(如Java的DOM、SAX,JavaScript的DOM API等)来读取、解析和操作XML文档。 总的来说,XML是Web开发中的重要工具,它为数据交换和结构化信息管理提供了强大而灵活的解决...

    SharePoint.2010.Web.Parts.源代码

    实战"提示我们这不仅仅是一套源代码,还包含实战应用的场景,这通常涉及到如何在实际项目中部署和使用这些Web部件,以及可能遇到的问题和解决策略。"另有同名pdf介绍"则意味着有配套的文档指导,这对于理解和学习...

    rss 订阅

    1. **发布者**创建RSS feed,将新内容的元数据(如标题、链接、摘要)添加到XML文件中。 2. **用户**使用RSS阅读器(如Feedly、Inoreader等)或内置RSS功能的应用(如Firefox浏览器)来订阅RSS feed URL。 3. 阅读器...

    Atom-FeedParser,用于分析rss/atom提要的库。通过在github上创建一个帐户来帮助alexdzyoba/feedparser开发。.zip

    4. `examples/`:示例代码,展示如何在实际项目中使用库。 5. `LICENSE`:项目使用的许可协议。 6. `requirements.txt`:Python依赖项列表,用于安装必要的库。 7. `setup.py`:Python打包和安装脚本。 使用Atom-...

    HACKING RSS AND ATOM

    2. **创建RSS和Atom源**:讲解如何为个人博客、新闻站点或其他在线内容创建RSS或Atom feed,以方便用户订阅。 3. **使用RSS和Atom的工具**:介绍各种RSS阅读器、聚合器以及API,如FeedBurner和Google Reader(虽然...

    跨域获取其他网站rss信息

    3. **Web API或AJAX**:在ASP.NET中,通常使用Web API创建RESTful服务,然后使用AJAX(Asynchronous JavaScript and XML)进行异步请求。对于跨域的AJAX请求,需要在服务器端配置允许跨域,客户端使用`jQuery.ajax`...

    HTML版Rss

    在本案例中,JavaScript可能使用XMLHttpRequest对象或者现代的Fetch API来异步请求RSS数据,实现页面的平滑滚动和内容加载。 5. **RSS解析**:JavaScript需要解析RSS源的XML结构,提取出需要的信息。这通常涉及到...

    RSS and Atom in Action

    RSS和Atom都是用于发布和分享内容的标准化方式,尤其在博客、新闻站点和Podcast等领域广泛应用。它们允许用户通过聚合器订阅感兴趣的内容源,以便在一个地方获取多来源的更新信息。 RSS,全称为“真正简单的聚合”...

    Android代码-Rss订阅源码Demo.zip

    通过"Rss订阅源码Demo.zip"中的代码,开发者可以学习如何在Android环境中实现RSS订阅功能,包括网络请求、XML解析、UI设计和数据管理等多个方面,从而构建自己的RSS阅读器应用。这不仅有助于提升Android开发技能,也...

Global site tag (gtag.js) - Google Analytics