用ASP.NET創(chuàng)建一個在線RSS新聞聚合器
發(fā)表時間:2024-02-10 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]概要 本文講解了如何使用 XML Web 控件獲取遠程XML數(shù)據(jù)并在 ASP.NET 頁面顯示這些XML數(shù)據(jù),以及使用Repeater控件發(fā)布數(shù)據(jù)庫中的XML數(shù)據(jù)。在過去的幾年間,隨著 異構(gòu)平臺間共享數(shù)據(jù)的需求不斷增長,XML的使用也呈爆炸性增長。意識到這種趨勢,微軟在整個.NET框架中對 X...
概要
本文講解了如何使用 XML Web 控件獲取遠程XML數(shù)據(jù)并在 ASP.NET 頁面顯示這些XML數(shù)據(jù),以及使用Repeater控件發(fā)布數(shù)據(jù)庫中的XML數(shù)據(jù)。在過去的幾年間,隨著 異構(gòu)平臺間共享數(shù)據(jù)的需求不斷增長,XML的使用也呈爆炸性增長。意識到這種趨勢,微軟在整個.NET框架中對 XML 提供了健壯的支持。這意味著,對于 ASP.NET 開發(fā)者來說,在Web頁面 中顯示和處理 XML 數(shù)據(jù)從來沒有這么容易過。本文將通過生成一個 RSS2.0 聚合引擎和在線新聞聚合器來學(xué)習(xí) XML 和 ASP.NET 技術(shù)。 本文假設(shè)讀者熟悉 ASP.NET 和 XML。
簡介
隨著辦公室和家庭上網(wǎng)在線時間的延長,以及 Web 站點和可訪問的互聯(lián)網(wǎng)應(yīng)用程序呈持續(xù)爆炸性增長,應(yīng)用程序之間能數(shù)據(jù)共享變得越來越重要。在 異構(gòu)平臺之間共享數(shù)據(jù)需要一種平臺中立的數(shù)據(jù)格式,這種數(shù)據(jù)格式要求能易于通過標(biāo)準(zhǔn)的互聯(lián)網(wǎng)協(xié)議來傳輸,而這正是XML的用武之地。因為XML文件本質(zhì)上 只是一個文本文件,其編碼格式眾所周知,而且現(xiàn)有的XML解析器能為所有主流編程語言所用,所以XML數(shù)據(jù)能被任何平臺輕松使用。
Web 網(wǎng)站聚合就是一種使用 XML 來共享數(shù)據(jù)的范例,在新聞?wù)军c和網(wǎng)志中經(jīng)?梢钥吹健2捎 Web 網(wǎng)站聚合技術(shù),網(wǎng)站能以 XML 格式的 Web 可訪問的聚合文件來發(fā)布最新內(nèi)容。網(wǎng)站使用 的聚合格式有很多種,其中最流行的一種格式就是 RSS2.0。( RSS2.0 規(guī)范被發(fā)布在 Harvard Law 網(wǎng)站 的技術(shù)欄目上)。此外,MSDN 雜志有一個聚合文件:MSDN雜志:本期刊物, 其中列出了最新一期 MSDN 雜志上的文章,包括到在線版本文章的鏈接。
一旦 Web 站點有了公開發(fā)布聚合文件,那么不同的客戶端就可以消費它。消費聚合文件的方式有很多種,比如,某個提供 .NET 技術(shù)資源的站點可能希望在網(wǎng)站中 添加最新的 MSDN 雜志文章標(biāo)題。聚合文件還常常被新聞聚合器程序所用,這種程序被專門設(shè)計用來獲取和顯示不同來源的聚合文件。
隨著人們越來越注重使用 XML 數(shù)據(jù),在 ASP.NET 頁面中處理 XML 數(shù)據(jù)的能力變得比以往更關(guān)鍵。既然 Web 站點聚合如此重要, 本文我們就來創(chuàng)建一個 Web 站點聚合文件生成程序和一個在線新聞聚合器。在建立這兩個微型程序的過程中,我們將講述如何訪問和顯示XML數(shù)據(jù),不論這些數(shù)據(jù)是來自遠端的Web服務(wù)器還是本地的文件系統(tǒng)。我們將演示如 何多種不同的方法顯示XML數(shù)據(jù),比如:用 Repeater 控件以及用 ASP.NET XML Web控件。
使用 RSS2.0 規(guī)范的聚合內(nèi)容 本文我們將要創(chuàng)建的第一個微型程序是一個聚合文件生成器。針對這個迷你程序,假設(shè)你是一個大型新聞網(wǎng)站(如
MSNBC.com)的 Web 開發(fā)者,所有的新聞內(nèi)容都保存在 Microsoft SQL Server 2000 數(shù)據(jù)庫中。具體地說,這些文章是 都保存在一個名為 Articles 的表中,表中以下字段與我們的程序密切相關(guān):
·ArticleID—主鍵,自增長的整型字段,用來唯一標(biāo)識每一篇文章;
·Title— 指定標(biāo)題,字段數(shù)據(jù)類型: varchar(50);
·Author—指定作者,字段數(shù)據(jù)類型: varchar(50);
·Description—新聞內(nèi)容描述,字段數(shù)據(jù)類型: varchar(2000);
·DatePublished—新聞發(fā)布日期,字段數(shù)據(jù)類型:datetime
請注意,Articles 表中可能還有其它字段,上面所列的只是我們在創(chuàng)建聚合文件的時候所要用到的字段。而且,這只是一個非常簡單的數(shù)據(jù)模型,在 是應(yīng)用的數(shù)據(jù)庫環(huán)境中,你可能會使用更加標(biāo)準(zhǔn)化的數(shù)據(jù)庫模型,比如具備一個單獨的 authors (作者)表,有一個建立作者和文章之間多對多關(guān)系的表等等。
下一步,我們將創(chuàng)建一個ASP.NET頁面,用格式化好的 RSS2.0 XML 文件顯示一個最新的新聞列表。在講述如何在 ASP.NET 頁面 中完成這種轉(zhuǎn)換之前,我們要先介紹一下 RSS2.0 規(guī)范的內(nèi)容。我們應(yīng)該記住,在整個規(guī)范中,RSS 是被設(shè)計用來為聚合內(nèi)容提供一個數(shù)據(jù)模型。那么 毫無疑問,它會有一系列的 XML 元素,用來描述 Web 站點要聚合的內(nèi)容信息,以及一系列用來描述某一特定新聞項的 XML 元素。最后,不要忘記 RSS 聚合文件是一個 XML 格式文件,必須符合 XML 格式化的準(zhǔn)則, 也就是:
·所有 XML元素必須正確嵌套;
·所有的屬性值要用引號包含起來;
·<, >, &, "和’’符號要相應(yīng)地替換為 <,> , &, " 和 ';
而且,XML格式是大小寫敏感的,這就意味著,XML元素的起始和終止標(biāo)簽必須匹配,拼寫和大小寫都必須一致。
RSS2.0 的根元素是<rss>元素,這個元素可以有一個版本號的屬性,例如:
<rss version="2.0">
...
</rss>
。紃ss>元素只有一個子元素<channel>,用來描述聚合的內(nèi)容。在<channel>元素里面有三個必需的子元素,用來描述 Web 站點的信息。這三個元素是:
·title—定義聚合文件的名稱,一般來說,還會包括Web站點的名稱;
·link—Web站點的URL;
·description—Web站點的一段簡短的描述。
除此之外,還有一些可選元素來描述站點信息。這些元素的更多信息請參見 RSS2.0規(guī)范。
每一個新聞項目放在一個單獨的<item>元素中。<channel>元素可以有任意數(shù)量的<item>元素。每個<item>元素可以有多種的子元素,唯一的要求是最少必須包含<title>元素和<description>元素其中一個作為子元素。以下列出了一些相關(guān)的<item> 子元素:
·title—新聞項目的標(biāo)題;
·link—新聞項目的URL;
·description—新聞項目的大綱;
·author—新聞項目的作者;
·pubDate—新聞項目的發(fā)布日期
下面是一個非常簡單的 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>W(wǎng)orking 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>W(wǎng)orking 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>
關(guān)于<pubDate>元素的格式有一點特別重要,再此要講一下。RSS 要求日期必須按照 RFC822 日期和時間規(guī)范 進行格式化,此格式要求:開頭是一個可選的3字母星期縮寫加一個逗號,接著必須是日加上3字母縮寫的月份和年份,最后是一個帶時區(qū)名的時間。另外,要注意 <description> 子元素是可選的:上 述文件第一個新聞沒有 <description> 元素,而第二個新聞就有一個。
通過 ASP.NET 頁面輸出聚合內(nèi)容 現(xiàn)在,我們已經(jīng)知道了如何按照 RSS2.0 規(guī)范存儲我們的新聞項,我們已經(jīng)就緒創(chuàng)建一個 ASP.NET 頁面,當(dāng)用戶發(fā)出請求時,就會返回網(wǎng)站聚合 的內(nèi)容。更確切地說,我們將建立一個名字叫 rss.aspx 的 ASP.NET 頁面,這個頁面會按照 RSS2.0 規(guī)范的格式返回 Articles 數(shù)據(jù)庫表中的最新的 5 個新聞項 。
可以有幾種方法來完成這件事,稍后將會講到。但是現(xiàn)在,我們首先要完成一件事,那就是先要從數(shù)據(jù)庫中獲得最新的5個新聞項。這可以用下面的 SQL 查詢語句獲得:
SELECT TOP 5 ArticleID,Title,Author,Description,DatePublished FROM Articles ORDER BY DatePublished DESC
獲得了這些信息以后,我們需要把這些信息轉(zhuǎn)換成相應(yīng)的 RSS2.0 格式聚合文件。要把數(shù)據(jù)庫的數(shù)據(jù)顯示為XML數(shù)據(jù)最簡單、快速的方法就是使用 Repeater 控件。準(zhǔn)確地說,Repeater 控件 將在 HeaderTemplate 和 FooterTemplate 模版里顯示<rss>元素、<channel>元素以及站點相關(guān)的 元素標(biāo)簽,在 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 標(biāo)記或 Web 控件。這是因為我們希望頁面只輸出 XML 格式的數(shù)據(jù)。實際上,觀察一下 @Page 指令,你就會發(fā)現(xiàn) ContentType 被設(shè)置為XML MIME 類型(text/xml)。其次要注意的是:在 ItemTemplate 模版里,當(dāng) 在 XML 輸出中添加數(shù)據(jù)庫字段Title、Description 和 Author 時,我們調(diào)用了輔助函數(shù) FormatForXML()。我們 很快就會看到,該函數(shù)被定義在后臺編碼的類中,其作用只是將非法的 xml 字符替換為它們對應(yīng)的合法的轉(zhuǎn)義字符。最后我們應(yīng)該注意,在 <pubDate> 元素里面的數(shù)據(jù)庫字段 DatePublished 是用 String.Format 來格式化的。標(biāo)準(zhǔn)的格式描述符“R”對 DatePublished 的值進行相應(yīng)的格式化 。
此 Web 頁面的后臺編碼類代碼并不復(fù)雜。Page_Load事件處理函數(shù)只是將數(shù)據(jù)庫查詢結(jié)果綁定到 Repeater控件,F(xiàn)ormatForXML()函數(shù)根據(jù)需要做一些簡單的字符串替換。為 簡單起見,下面的例子只列出了這兩個函數(shù)的代碼:
在瀏覽器中訪問 rss.aspx 頁面的截圖參見圖一。
圖一 通過瀏覽器訪問 Rss.aspx 頁面
在我們生成在線新聞聚合器之前,讓我談?wù)勥@個聚合引擎一些可能的增強功能。首先,每一次訪問 rss.aspx 頁面的時候,都要訪問一次數(shù)據(jù)庫。如果預(yù)期可能有大量的人頻繁地訪問 rss.aspx 頁面,使用輸出緩存是很有價值的。其次,通常新聞網(wǎng)站會將聚合的內(nèi)容分為不同的類別。例如:News.com 有一些專門的聚合內(nèi)容區(qū), 比如針對企業(yè)計算、電子商務(wù)、通信的內(nèi)容等等。在數(shù)據(jù)庫表 Articles 中加入表示類別的 Category 字段就可以很容易地提供這種支持。這樣 一來,在 rss.aspx 頁面中,可以接收一個表示顯示分類的查詢參數(shù),然后只搜索指定的新聞項分類即可。
[1] [2] [3] [4] 下一頁