Click here to Skip to main content
15,884,537 members
Articles / Web Development / ASP.NET

Building a web based RSS Feed Viewer using System.XML

Rate me:
Please Sign up or sign in to vote.
3.95/5 (15 votes)
20 Apr 20042 min read 137.8K   1.8K   66  
This article illustrates building a class to parse RSS Feeds and return the details in a form that they can be eaisly manipulated and displayed.
Imports System.Xml
Imports System
Imports System.Net
Imports System.Text
Imports System.IO


Public Enum RSSVersion
    version_Unknown = 0
    version_0_91 = 1
    version_0_92 = 2
    version_2_00 = 3
End Enum


Public Structure RSSItem
    Dim Title As String
    Dim Description As String
    Dim pubDate As DateTime
    Dim Link As Uri
End Structure


Public Structure RSSHeader
    Dim Title As String
    Dim Link As Uri
    Dim Description As String
    Dim Language As String
    Dim Copyright As String
    Dim managingEditor As String
    Dim webMaster As String
    Dim lastBuildDate As DateTime

End Structure

Public Class RSSItemCollection
    Inherits CollectionBase

    Default Public Property Item(ByVal index As Integer) As RSSItem
        Get
            Return List(index)
        End Get
        Set(ByVal Value As RSSItem)
            List(index) = Value
        End Set
    End Property

    Public Function Add(ByVal value As RSSItem) As Integer
        Return List.Add(value)
    End Function

    Public Function IndexOf(ByVal value As RSSItem) As Integer
        Return List.IndexOf(value)
    End Function

    Public Sub Insert(ByVal index As Integer, ByVal value As RSSItem)
        List.Insert(index, value)
    End Sub

    Public Sub Remove(ByVal value As RSSItem)
        List.Remove(value)
    End Sub

    Public Function Contains(ByVal value As RSSItem) As Boolean
        Return List.Contains(value)
    End Function
End Class


Public Class csRSSFeed
    Inherits csXMLParser

    Property Version() As RSSVersion
        Get
            Return Me.myRSSVersion
        End Get
        Set(ByVal value As RSSVersion)
            Me.myRSSVersion = value
        End Set
    End Property

    Property Item(ByVal index As Integer) As RSSItem
        Get
            Return Me.myRSSItems(index)
        End Get
        Set(ByVal Value As RSSItem)
            Me.myRSSItems(index) = Value
        End Set
    End Property

    Property Items() As RSSItemCollection
        Get
            Return Me.myRSSItems
        End Get
        Set(ByVal Value As RSSItemCollection)
            Me.myRSSItems = Value
        End Set
    End Property

    Property Header() As RSSHeader
        Get
            Return Me.myRSSHeader
        End Get
        Set(ByVal Value As RSSHeader)
            Me.myRSSHeader = Value
        End Set
    End Property

    Private myRSSVersion As RSSVersion
    Private myRSSItems As New RSSItemCollection
    Private myRSSHeader As RSSHeader


    Private Function getRSSVersion() As RSSVersion
        Dim myrootNode As XmlNode
        Dim versionAttribute As XmlAttribute
        Dim myRSSVersion As RSSVersion
        myRSSVersion = RSSVersion.version_Unknown
        myrootNode = fetchNode(Document.ChildNodes, "rss")
        versionAttribute = fetchAttribute(myrootNode, "version")
        Select Case versionAttribute.Value
            Case "0.91"
                myRSSVersion = RSSVersion.version_0_91
            Case "0.92"
                myRSSVersion = RSSVersion.version_0_92
            Case "2.00"
                myRSSVersion = RSSVersion.version_2_00
        End Select
        Return myRSSVersion
    End Function

    Private Sub PopulateMembers()
        Dim myNode As XmlNode        
        Dim myItemNode As XmlNode        
        Dim i As Integer
        Me.myRSSHeader.Copyright = ""
        Me.myRSSHeader.Description = ""
        Me.myRSSHeader.Language = ""
        Me.myRSSHeader.Title = ""
        Me.myRSSHeader.webMaster = ""
        Me.myRSSHeader.managingEditor = ""
        Me.myRSSHeader.lastBuildDate = Nothing
        Mybase.DocumentRoot = Me.fetchNode(Document.ChildNodes, "rss")
        Mybase.DocumentRoot = Me.fetchNode(Mybase.DocumentRoot.ChildNodes, "channel")
        Me.myRSSVersion = Me.getRSSVersion
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "title")
        If Not IsNothing(myNode) Then Me.myRSSHeader.Title = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "link")
        If Not IsNothing(myNode) Then Me.myRSSHeader.Link = New Uri(myNode.InnerText)
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "description")
        If Not IsNothing(myNode) Then Me.myRSSHeader.Description = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "language")
        If Not IsNothing(myNode) Then Me.myRSSHeader.Language = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "copyright")
        If Not IsNothing(myNode) Then Me.myRSSHeader.Copyright = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "managingEditor")
        If Not IsNothing(myNode) Then Me.myRSSHeader.managingEditor = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "webMaster")
        If Not IsNothing(myNode) Then Me.myRSSHeader.webMaster = myNode.InnerText
        myNode = fetchNode(Mybase.DocumentRoot.ChildNodes, "lastBuildDate")
        If Not IsNothing(myNode) Then
            Me.myRSSHeader.lastBuildDate = DateTime.Parse(myNode.InnerText)
        End If

        Me.myRSSItems.Clear()

        For i = 0 To Mybase.DocumentRoot.ChildNodes.Count - 1
            If Mybase.DocumentRoot.ChildNodes(i).Name = "item" Then
                myItemNode = Mybase.DocumentRoot.ChildNodes(i)
                Dim myItem As RSSItem
                myItem.pubDate = Nothing
                myNode = fetchNode(myItemNode.ChildNodes, "description")
                If Not IsNothing(myNode) Then myItem.Description = myNode.InnerText
                myNode = fetchNode(myItemNode.ChildNodes, "title")
                If Not IsNothing(myNode) Then myItem.Title = myNode.InnerText
                myNode = fetchNode(myItemNode.ChildNodes, "link")
                If Not IsNothing(myNode) Then myItem.Link = New Uri(myNode.InnerText)

                myNode = fetchNode(myItemNode.ChildNodes, "pubDate")
                If Not IsNothing(myNode) Then myItem.pubDate = DateTime.Parse(myNode.InnerText)

                Select Case Me.myRSSVersion
                    Case RSSVersion.version_0_91
                    Case RSSVersion.version_0_92
                    Case RSSVersion.version_2_00
                End Select
                Me.myRSSItems.Add(myItem)
            End If
        Next

    End Sub

    Public Sub New()
        Me.myRSSVersion = RSSVersion.version_Unknown
    End Sub

    Public Sub Load(ByVal filename As String)
        MyBase.LoadFromFile(filename)
        PopulateMembers()
    End Sub

    Public Sub LoadFromHttp(ByVal Url As String)
        MyBase.LoadFromUrl(Url)
        PopulateMembers()
    End Sub

End Class

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
United Kingdom United Kingdom
Ive came to the conclusion recently Job Titles exist merely to massage the ego. Everybody in my workplace is a manager of something (sometimes they manage themselves solely) I Prefer to be judged not on my job title but my ability to do a good job of what I am supposed to do.

Comments and Discussions