概要
本文講解了如何使用XMLWeb控件獲取遠程XML數據並在ASP.NET頁面顯示這些XML數據,以及使用Repeater控件發布數據庫中的XML數據。在過去的幾年間,隨著異構平台間共享數據的需求不斷增長,XML的使用也呈爆炸性增長。意識到這種趨勢,微軟在整個.NET框架中對XML提供了健壯的支持。這意味著,對於ASP.NET開發者來說,在Web頁面中顯示和處理XML數據從來沒有這麼容易過。本文將通過生成一個RSS2.0聚合引擎和在線新聞聚合器來學習XML和ASP.NET技術。本文假設讀者熟悉ASP.Net和XML。
目錄
簡介
使用RSS2.0規范的聚合內容
通過ASP.Net頁面輸出聚合內容
在ASP.Net頁面中使用聚合摘要
顯示聚合摘要列表
顯示特定聚合摘要的新聞項
顯示特定新聞項的詳細內容
未來的擴展和當前程序的缺點
總結
簡介
隨著辦公室和家庭上網在線時間的延長,以及Web站點和可訪問的互聯網應用程序呈持續爆炸性增長,應用程序之間能數據共享變得越來越重要。在異構平台之間共享數據需要一種平台中立的數據格式,這種數據格式要求能易於通過標准的互聯網協議來傳輸,而這正是XML的用武之地。因為XML文件本質上只是一個文本文件,其編碼格式眾所周知,而且現有的XML解析器能為所有主流編程語言所用,所以XML數據能被任何平台輕松使用。
Web網站聚合就是一種使用XML來共享數據的范例,在新聞站點和網志中經常可以看到。采用Web網站聚合技術,網站能以XML格式的Web可訪問的聚合文件來發布最新內容。網站使用的聚合格式有很多種,其中最流行的一種格式就是RSS2.0。(RSS2.0規范被發布在HarvardLaw網站的技術欄目上)。此外,MSDN雜志有一個聚合文件:MSDN雜志:本期刊物,其中列出了最新一期MSDN雜志上的文章,包括到在線版本文章的鏈接。
一旦Web站點有了公開發布聚合文件,那麼不同的客戶端就可以消費它。消費聚合文件的方式有很多種,比如,某個提供.Net技術資源的站點可能希望在網站中添加最新的MSDN雜志文章標題。聚合文件還常常被新聞聚合器程序所用,這種程序被專門設計用來獲取和顯示不同來源的聚合文件。
隨著人們越來越注重使用XML數據,在ASP.NET頁面中處理XML數據的能力變得比以往更關鍵。既然Web站點聚合如此重要,本文我們就來創建一個Web站點聚合文件生成程序和一個在線新聞聚合器。在建立這兩個微型程序的過程中,我們將講述如何訪問和顯示XML數據,不論這些數據是來自遠端的Web服務器還是本地的文件系統。我們將演示如何多種不同的方法顯示XML數據,比如:用Repeater控件以及用ASP.NetXMLWeb控件。
因為這只是一篇小文章,不可能長篇大論,我會假設讀者您熟悉XSLT和XPath。如果您不熟悉,建議在看這篇文章之前先訪問以下資源:
FAQ:WhatisXSLTandHowDoesitRelatetoXML
XSLTutorial
XPathTutorial
使用RSS2.0規范的聚合內容
本文我們將要創建的第一個微型程序是一個聚合文件生成器。針對這個迷你程序,假設你是一個大型新聞網站(如MSNBC.com)的web開發者,所有的新聞內容都保存在MicrosoftSQLServer2000數據庫中。具體地說,這些文章是都保存在一個名為Articles的表中,表中以下字段與我們的程序密切相關:
ArticleID—主鍵,自增長的整型字段,用來唯一標識每一篇文章;
Title—指定標題,字段數據類型:varchar(50);
Description—新聞內容描述,字段數據類型:varchar(2000);
DatePublished—新聞發布日期,字段數據類型:datetime
請注意,Articles表中可能還有其它字段,上面所列的只是我們在創建聚合文件的時候所要用到的字段。而且,這只是一個非常簡單的數據模型,在是應用的數據庫環境中,你可能會使用更加標准化的數據庫模型,比如具備一個單獨的authors(作者)表,有一個建立作者和文章之間多對多關系的表等等。
下一步,我們將創建一個ASP.NET頁面,用格式化好的RSS2.0XML文件顯示一個最新的新聞列表。在講述如何在ASP.Net頁面中完成這種轉換之前,我們要先介紹一下RSS2.0規范的內容。我們應該記住,在整個規范中,RSS是被設計用來為聚合內容提供一個數據模型。那麼毫無疑問,它會有一系列的XML元素,用來描述Web站點要聚合的內容信息,以及一系列用來描述某一特定新聞項的XML元素。最後,不要忘記RSS聚合文件是一個XML格式文件,必須符合XML格式化的准則,也就是:
所有XML元素必須正確嵌套;
所有的屬性值要用引號包含起來;
< ,>,&,"和''符號要相應地替換為< ,>,&,"和';
而且,XML格式是大小寫敏感的,這就意味著,XML元素的起始和終止標簽必須匹配,拼寫和大小寫都必須一致。
RSS2.0的根元素是< rss>元素,這個元素可以有一個版本號的屬性,例如:
< rssversion="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聚合文件。你可以從RSSgeneratedbyRadioUserLand看到其他的RSS2.0文件的例子。
< rssversion="2.0">
< channel>
< title>LatestDataWebControls.comFAQs< /title>
< link>http://datawebcontrols.com< /link>
< description>
ThisisthesyndicationfeedfortheFAQs
atDataWebControls.com
< /description>
< item>
< title>WorkingwiththeDataGrid< /title>
< link>http://datawebcontrols.com/faqs/DataGrid.ASPx< /link>
< pubDate>Mon,07Jul200321:00:00GMT< /pubDate>
< /item>
< item>
< title>WorkingwiththeRepeater< /title>
< description>
ThisarticleexamineshowtoworkwiththeRepeater
control.
< /description>
< link>http://datawebcontrols.com/faqs/Repeater.ASPx< /link>
< pubDate>Tue08Jul200312:00:00GMT< /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查詢語句獲得:
SELECTTOP5ArticleID,Title,Author,Description,DatePublishedFROMArticlesORDERBYDatePublishedDESC
獲得了這些信息以後,我們需要把這些信息轉換成相應的RSS2.0格式聚合文件。要把數據庫的數據顯示為XML數據最簡單、快速的方法就是使用Repeater控件。准確地說,Repeater控件將在HeaderTemplate和FooterTemplate模版裡顯示< rss>元素、< channel>元素以及站點相關的元素標簽,在ItemTemplate模版裡面顯示< item>元素。下面是我們這個ASP.Net頁面(.ASPx文件)的Html部分:
< %@Pagelanguage="c#"ContentType="text/XML"Codebehind="rss.ASPx.cs"
AutoEventWireup="false"Inherits="SyndicationDemo.rss"%>
< ASP:Repeaterid="rptRSS"runat="server">
< HeaderTemplate>
< rssversion="2.0">
< channel>
< title>ASP.NetNews!< /title>
< li >