VB2005實(shí)現(xiàn)簡(jiǎn)單的RSS瀏覽器功能

2010-08-28 10:48:18來(lái)源:西部e網(wǎng)作者:

 “沖浪”一詞在五六年前很時(shí)髦,現(xiàn)在則是菜鳥(niǎo)的代名詞,老鳥(niǎo)們張嘴就是個(gè)性化,而最容易個(gè)性化的則是RSS。通過(guò)RSS訂閱自己喜歡的內(nèi)容,不再在網(wǎng)上盲目溜達(dá)浪費(fèi)時(shí)間。各大網(wǎng)站也紛紛推出RSS訂閱服務(wù),網(wǎng)上也有不少RSS閱讀器下載,不過(guò)作為程序員有必要掌握RSS閱讀器的設(shè)計(jì)原理和方法。

  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)。

關(guān)鍵詞:dotnet

贊助商鏈接: