图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函数使用一个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,以及每个频道里你读过的的若干项。进入讨论组讨论。