返回首頁
當前位置: 主頁 > 網絡編程 > Php實例教程 >

如何在Web站點中創建和使用Rss源

時間:2017-02-09 22:17來源:知行網www.wzliqi.com 編輯:麥田守望者

Rss是將你Web站點的內容與其他人分享的標準方式。Rss代表著:Really Simple Syndication。它不過是一個標準化的XML標記,用于描述你想要分享的內容。因此Rss是一個在你的內容準備好被其他用戶所消費時被廣泛接受的格式。一些使用Rss的范例站點有:www.asp.net、weblogs.asp.net 和 www.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進行格式轉換的時候,假如數據庫中是 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類的下面這些方法。

  • 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對象。

------分隔線----------------------------
標簽(Tag):創建Rss源 使用Rss源
------分隔線----------------------------
推薦內容
猜你感興趣
久久99久久99精品免视看