RSS提供給網站以一種非常簡單的共享方式來和其他站點或者客戶端程序共享內容。一個RSS Feed,或者可以稱其為頻道(channel),是一個簡單的XML文件,它使用一些預定義的標記(tag)來描述站點和一些項(item)的集合。每個項提供一個標題,一個轉向的URL,和對該項的描述。不同的組織開發了不同版本的RSS,不過它們非常相似。
RSS瀏覽器的總覽
使用VB2005編程顯示RSS Feed或者頻道內容是非常簡單的。本文將教會你編寫一個簡單的RSS瀏覽器。這個瀏覽器允許你填寫一個RSS Feed的URL地址,然后它將為你取回該頻道的標題,內容,描述和鏈接等相關信息。它也將獲取和顯示該Feed相關的項的列表。它將每個項的標題顯示在一個listbox里,地址顯示在一個LinkLabel里,項的描述和URL則顯示在一個WebBrower控件里。(見圖1)
圖1
為了簡單起見,我將只用RSS2.0進行測試。同樣的,我使用VB2005 Express Edition作為開發工具,讀者可以從Microsoft公司得到這個開發工具。
RSSItem和RSSChannel類
兩個類組成了這個RSS瀏覽器的核心部分:RSSItem和RSSChannel。RSSItem類是一個簡單的類,它除了構造函數以外不提供其他的方法。RSSItem類簡單的封裝了RSS項的標題、鏈接和描述屬性。
RSSItem類有3個私有成員其相關屬性。構造函數簡單的將每個成員初始化為空字符串,如下:Private m_Title As String
Private m_Link As String
Private m_Description As String
Public Sub New()
Title = "\"
Link = ""
Description = ""
End Sub
RSSChannel類是這個程序真正的核心所在。它像RSSItem類封裝RSS項一樣,封裝了RSS頻道的標題,鏈接和描述等屬性。然而,它真正的功能體現在提供了獲取RSS頻道的信息和頻道相關項的信息的方法。
RSSChannel類同樣也擁有三個私有成員變量及相關屬性。它還擁有一個私有成員和相關屬性來存儲RSS頻道的URL。構造函數使用一個指向RSS Feed的URL作為參數。它使用此參數來初始化FeedURL,剩下的成員被初始化為空字符串。然后它調用GetChannelInfo來獲取頻道屬性,如下: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 方法
在這個方法里,程序創建了一個XmlNodeList的對象,并且調用GetXMLDoc函數,將字符串"rss/channel"作為Node路徑。在函數返回的時候,你將獲得一個包含有頻道標題、鏈接和描述屬性的XML的XMLNodeList。通過使用XmlNodeList里存儲的值,你可以設置你的RSSChannel類的屬性,如下: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函數使用一個Node路徑作為參數。該路徑指定了你需要獲取的XML的哪個部分。這個函數首先創建一個空的XmlNodeList,這里將存儲函數返回時的Node內容。然后它創建一個WebRequest和WebResponse對象來從URL里獲取數據,并且取得響應。當你獲取一個響應之后,你可以創建一個Stream對象來存放從WebResponse對象的GetResponseStream方法中獲取的數據。然后你可以創建一個XmlDocument對象并通過Load方法來調用其中的數據。這時,你可以輕松的使用SelectedNodes方法來訪問XML數據,并且指定你想訪問哪個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函數來獲取真正的RSS Feed項。
GetChannelItem方法
GetChannelItem和GetChannelInfo工作方式非常類似,主要區別在于在這里,你將會處理多個項,這就需要你使用一個For循環來讀入每個項并且存儲在一個ArrayList結構里。如果需要處理所有的項,可以直接返回這個ArraryList對象: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
結束語
本文的源代
碼你可以從這里下載,當然你可以給它添加更多的功能,如:
·增加錯誤處理代碼,使用Try...Catch...Finally,以處理遇到的一些錯誤;
·增加對多個版本的RSS的支持;
·擴展RSSChannel類,增加包括語言,文檔,版權,生成器等的信息解析支持,擴展RSSItem類來包含對公布時間,GUID和評論標記的解析支持(當前只支持處理RSS Feed標記);
·增強對圖像標記的處理(目前只是提供了一個圖像地址鏈接和標題)
·增強同時訪問多個RSS項的處理
·增加數據庫支持,來記錄你訪問過的RSS Feed,以及每個頻道里你讀過的的若干項。