RSS提供給網(wǎng)站以一種非常簡(jiǎn)單的共享方式來(lái)和其他站點(diǎn)或者客戶端程序共享內(nèi)容。一個(gè)RSS Feed,或者可以稱(chēng)其為頻道(channel),是一個(gè)簡(jiǎn)單的XML文件,它使用一些預(yù)定義的標(biāo)記(tag)來(lái)描述站點(diǎn)和一些項(xiàng)(item)的集合。每個(gè)項(xiàng)提供一個(gè)標(biāo)題,一個(gè)轉(zhuǎn)向的URL,和對(duì)該項(xiàng)的描述。不同的組織開(kāi)發(fā)了不同版本的RSS,不過(guò)它們非常相似。
RSS瀏覽器的總覽
使用VB2005編程顯示RSS Feed或者頻道內(nèi)容是非常簡(jiǎn)單的。本文將教會(huì)你編寫(xiě)一個(gè)簡(jiǎn)單的RSS瀏覽器。這個(gè)瀏覽器允許你填寫(xiě)一個(gè)RSS Feed的URL地址,然后它將為你取回該頻道的標(biāo)題,內(nèi)容,描述和鏈接等相關(guān)信息。它也將獲取和顯示該Feed相關(guān)的項(xiàng)的列表。它將每個(gè)項(xiàng)的標(biāo)題顯示在一個(gè)listbox里,地址顯示在一個(gè)LinkLabel里,項(xiàng)的描述和URL則顯示在一個(gè)WebBrower控件里。(見(jiàn)圖1)
圖1
為了簡(jiǎn)單起見(jiàn),我將只用RSS2.0進(jìn)行測(cè)試。同樣的,我使用VB2005 Express Edition作為開(kāi)發(fā)工具,讀者可以從Microsoft公司得到這個(gè)開(kāi)發(fā)工具。
RSSItem和RSSChannel類(lèi)
兩個(gè)類(lèi)組成了這個(gè)RSS瀏覽器的核心部分:RSSItem和RSSChannel。RSSItem類(lèi)是一個(gè)簡(jiǎn)單的類(lèi),它除了構(gòu)造函數(shù)以外不提供其他的方法。RSSItem類(lèi)簡(jiǎn)單的封裝了RSS項(xiàng)的標(biāo)題、鏈接和描述屬性。
RSSItem類(lèi)有3個(gè)私有成員其相關(guān)屬性。構(gòu)造函數(shù)簡(jiǎn)單的將每個(gè)成員初始化為空字符串,如下:Private m_Title As String
Private m_Link As String
Private m_Description As String
Public Sub New()
Title = "\"
Link = ""
Description = ""
End Sub
RSSChannel類(lèi)是這個(gè)程序真正的核心所在。它像RSSItem類(lèi)封裝RSS項(xiàng)一樣,封裝了RSS頻道的標(biāo)題,鏈接和描述等屬性。然而,它真正的功能體現(xiàn)在提供了獲取RSS頻道的信息和頻道相關(guān)項(xiàng)的信息的方法。
RSSChannel類(lèi)同樣也擁有三個(gè)私有成員變量及相關(guān)屬性。它還擁有一個(gè)私有成員和相關(guān)屬性來(lái)存儲(chǔ)RSS頻道的URL。構(gòu)造函數(shù)使用一個(gè)指向RSS Feed的URL作為參數(shù)。它使用此參數(shù)來(lái)初始化FeedURL,剩下的成員被初始化為空字符串。然后它調(diào)用GetChannelInfo來(lái)獲取頻道屬性,如下:Private m_FeedURL As String
Private m_Title As String
Private m_Link As String
Private m_Description As String
Public Sub New(ByVal url As String)
FeedURL = url
Title = "\"
Link = ""
Description = ""
GetChannelInfo()
End Sub
GetChannelInfo 方法
在這個(gè)方法里,程序創(chuàng)建了一個(gè)XmlNodeList的對(duì)象,并且調(diào)用GetXMLDoc函數(shù),將字符串"rss/channel"作為Node路徑。在函數(shù)返回的時(shí)候,你將獲得一個(gè)包含有頻道標(biāo)題、鏈接和描述屬性的XML的XMLNodeList。通過(guò)使用XmlNodeList里存儲(chǔ)的值,你可以設(shè)置你的RSSChannel類(lèi)的屬性,如下:Private Sub GetChannelInfo()
Dim rss As XmlNodeList = GetXMLDoc("rss/channel")
Title = rss(0).SelectSingleNode("title").InnerText
Link = rss(0).SelectSingleNode("link").InnerText
Description = rss(0).SelectSingleNode("description").InnerText
End Sub
GetXMLDoc方法
GetXMLDoc函數(shù)使用一個(gè)Node路徑作為參數(shù)。該路徑指定了你需要獲取的XML的哪個(gè)部分。這個(gè)函數(shù)首先創(chuàng)建一個(gè)空的XmlNodeList,這里將存儲(chǔ)函數(shù)返回時(shí)的Node內(nèi)容。然后它創(chuàng)建一個(gè)WebRequest和WebResponse對(duì)象來(lái)從URL里獲取數(shù)據(jù),并且取得響應(yīng)。當(dāng)你獲取一個(gè)響應(yīng)之后,你可以創(chuàng)建一個(gè)Stream對(duì)象來(lái)存放從WebResponse對(duì)象的GetResponseStream方法中獲取的數(shù)據(jù)。然后你可以創(chuàng)建一個(gè)XmlDocument對(duì)象并通過(guò)Load方法來(lái)調(diào)用其中的數(shù)據(jù)。這時(shí),你可以輕松的使用SelectedNodes方法來(lái)訪問(wèn)XML數(shù)據(jù),并且指定你想訪問(wèn)哪個(gè)Node:Private Function GetXMLDoc(ByVal node As String) As XmlNodeList
Dim tempNodeList As System.Xml.XmlNodeList = Nothing
Dim request As WebRequest = WebRequest.Create(Me.FeedURL)
Dim response As WebResponse = request.GetResponse()
Dim rssStream As Stream = response.GetResponseStream()
Dim rssDoc As XmlDocument = New XmlDocument()
rssDoc.Load(rssStream)
tempNodeList = rssDoc.SelectNodes(node)
Return tempNodeList
End Function
然后,你可以使用相同的GetXMLDoc函數(shù)來(lái)獲取真正的RSS Feed項(xiàng)。
GetChannelItem方法
GetChannelItem和GetChannelInfo工作方式非常類(lèi)似,主要區(qū)別在于在這里,你將會(huì)處理多個(gè)項(xiàng),這就需要你使用一個(gè)For循環(huán)來(lái)讀入每個(gè)項(xiàng)并且存儲(chǔ)在一個(gè)ArrayList結(jié)構(gòu)里。如果需要處理所有的項(xiàng),可以直接返回這個(gè)ArraryList對(duì)象:Public Function GetChannelItems() As ArrayList
Dim tempArrayList As New ArrayList
Dim Dim rssItems As XmlNodeList = GetXMLDoc("rss/channel/item")
Dim Dim item As XmlNode
For Each item In rssItems
Dim newItem As New RSSItem
With newItem
.Title = item.SelectSingleNode("title").InnerText
.Link = item.SelectSingleNode("link").InnerText
.Description =item.SelectSingleNode("description").InnerText
End With
tempArrayList.Add(newItem)
Next
Return tempArrayList
End Function
結(jié)束語(yǔ)
本文的源代
碼你可以從這里下載,當(dāng)然你可以給它添加更多的功能,如:
·增加錯(cuò)誤處理代碼,使用Try...Catch...Finally,以處理遇到的一些錯(cuò)誤;
·增加對(duì)多個(gè)版本的RSS的支持;
·擴(kuò)展RSSChannel類(lèi),增加包括語(yǔ)言,文檔,版權(quán),生成器等的信息解析支持,擴(kuò)展RSSItem類(lèi)來(lái)包含對(duì)公布時(shí)間,GUID和評(píng)論標(biāo)記的解析支持(當(dāng)前只支持處理RSS Feed標(biāo)記);
·增強(qiáng)對(duì)圖像標(biāo)記的處理(目前只是提供了一個(gè)圖像地址鏈接和標(biāo)題)
·增強(qiáng)同時(shí)訪問(wèn)多個(gè)RSS項(xiàng)的處理
·增加數(shù)據(jù)庫(kù)支持,來(lái)記錄你訪問(wèn)過(guò)的RSS Feed,以及每個(gè)頻道里你讀過(guò)的的若干項(xiàng)。