Introduction
The RSS Feed project is aimed as demonstrating writing VB code to
consume RSS feeds from the Internet and putting the data from these RSS feeds
into a database for you to use in your own applications. In my sample we are
concerned with getting a link, title and description for each of the items in
the feed. We will be consuming the RSS feeds provided by SlashDot.org and
WiredNews.com.
Project Setup
To run the project you will need to create a Sql Server database
and run the RssFeed.sql script. RssFeed.sql can be found in the support
directory in the zip file. This will create the tables and stored procedures you
will neeed. It also populates the WebNewsSource with the data needed to use the
RSS feeds from SlashDot.org and WiredNews.com. You will also need to modify the
connection stiring in the Rss Feed.exe.config to point to your database. The Rss
Feed.exe.config needs to be in the same directory as the exe that you are
running. When running the app from the IDE in debug mode the exe is in the
bin\debug directory.
The Database
The database I designed for this application consists of two
tables. WebNewsSource holds the information we need to connect to a RSS feed and
the field names of the data that we want to keep (Link, title and description).
The WebNewsItem table is the table that we will use to hold the data we retrive
from the feeds.
Defining a RSS Feed
An RSS Feed is an especially formated XML document. I used a
database to hold the data that the application will need to know how to consume
the RSS feed. The data is kept in the WebNewsSource table. The application will
need to know the URL of the RSS feed; this data is kept in the RSSURL field. The
RSSSelect field tells the application how to get to the nodes in the RSS Feed
that we are interested in. The RSSTitle, RSSLink and RSSDescription fields tell
the application which pieces of data we want to store in the Title, Link and
ArticleDescriptions fields respectively in the WebNewsItem table.
The Code
The sample contains two classes. Feed.vb is class that will get
the RSS feed as an XML document and go through it to get the data we are looking
for. RSSItem.vb will read the RSS Feed information from the database and hold
it. We need to use the System.Xml.XPath, System.Data, and System.Data.SqlClient
namespaces.
Imports
System.Xml.XPath
Imports
System.Data
Imports
System.Data.SqlClient
The GetFeed() method of the
Feed class will get
the RSS Feed and bring it back into a XPathDocument using a select that we
defined in our database. It then loops through the nodes of the document passing
each node to the ProcessNode method.
Public
Sub
GetFeed()
Try
' Bring back the
Feed
Dim
doc As
New
XPathDocument(rssURL)
Dim
nav As
XPathNavigator = doc.CreateNavigator()
Dim
iter As
XPathNodeIterator = nav.Select(rssSelect)
' Loop through the
nodes
While
iter.MoveNext()
' Get the data we
need from the node
ProcessNode(iter.Current)
End
While
Catch ex As
Exception
Console.WriteLine(ex.Message.ToString())
End
Try
End
Sub
'GetFeed
The ProcessNode method
gets the child nodes of the passed XPathNavigator and loops through them. We are
looking for three nodes (Link, Title and Description) as we defined them in the
database. We then make sure that the link and title are at least 10 characters
long and pass the WebNewsSourceID, link, title and description to the InsertNews
method.
Sub
ProcessNode(ByVal
lstNav As
XPathNavigator)
Dim
title As
String
= ""
Dim
link As
String
= ""
Dim
description As
String
= ""
' Get the child
nodes
Dim
iterNews As
XPathNodeIterator = lstNav.SelectDescendants(XPathNodeType.Element,
False)
' Loop through the
child nodes
While
iterNews.MoveNext()
' Save the current
Name
Dim
rssName As
String
= iterNews.Current.Name
' Is this the title?
If
rssName.ToUpper() = rssTitle.ToUpper()
Then
title =
iterNews.Current.Value
End
If
' Is this the
Link?
If
rssName.ToUpper() = rssLink.ToUpper() Then
link = iterNews.Current.Value
End
If
' Is this the
Description?
If
rssName.ToUpper() = rssDescription.ToUpper()
Then
description =
iterNews.Current.Value
End
If
End While
' Make sure
the link and title are at least 10 characters long
If
link.Length > 10 And
title.Length > 10 Then
' Update the
database
InsertNews(webNewsSourceID, link,
title, description)
End
If
End
Sub
'ProcessNode
The InsertNews method reads the connection string
from the config file. Sets up a command to run the upWebNewsItem_Insert stored
procedure and executes it.
Sub
InsertNews(ByVal
webNewsSourceID As
Integer,
ByVal link
As
String,
ByVal title
As
String,
ByVal description
As
String)
Try
' Create Connection
Dim
objConnection As
New
SqlConnection
System.Configuration.ConfigurationSettings.AppSettings("ConnectString"))
' Set up the command
Dim
objCommand As
New
SqlCommand("upWebNewsItem_Insert", objConnection)objCommand.CommandType =
CommandType.StoredProcedure
' Set up the
parameters
objCommand.Parameters.Add("@WebNewsSourceID",
SqlDbType.Int).Value = webNewsSourceID
objCommand.Parameters.Add("@Link", SqlDbType.VarChar, 255).Value = link
objCommand.Parameters.Add("@Title", SqlDbType.VarChar, 500).Value = title
objCommand.Parameters.Add("@ArticleDescription", SqlDbType.VarChar,
1000).Value = description
objCommand.Parameters.Add("@ID", SqlDbType.Int)
objCommand.Parameters("@ID").Direction = ParameterDirection.Output
' Execute the
command
objConnection.Open()
objCommand.ExecuteNonQuery()
objConnection.Close()
Catch
ex As
Exception
Console.WriteLine(("ERROR:" + ex.Message.ToString()))
End
Try
End
Sub
'InsertNewsvIntroduction
The RSS Feed project is aimed as demonstrating writing VB code to
consume RSS feeds from the Internet and putting the data from these RSS feeds
into a database for you to use in your own applications. In my sample we are
concerned with getting a link, title and description for each of the items in
the feed. We will be consuming the RSS feeds provided by SlashDot.org and
WiredNews.com.
Project Setup
To run the project you will need to create a Sql Server database
and run the RssFeed.sql script. RssFeed.sql can be found in the support
directory in the zip file. This will create the tables and stored procedures you
will neeed. It also populates the WebNewsSource with the data needed to use the
RSS feeds from SlashDot.org and WiredNews.com. You will also need to modify the
connection stiring in the Rss Feed.exe.config to point to your database. The Rss
Feed.exe.config needs to be in the same directory as the exe that you are
running. When running the app from the IDE in debug mode the exe is in the
bin\debug directory.
The Database
The database I designed for this application consists of two
tables. WebNewsSource holds the information we need to connect to a RSS feed and
the field names of the data that we want to keep (Link, title and description).
The WebNewsItem table is the table that we will use to hold the data we retrive
from the feeds.
Defining a RSS Feed
An RSS Feed is an especially formated XML document. I used a
database to hold the data that the application will need to know how to consume
the RSS feed. The data is kept in the WebNewsSource table. The application will
need to know the URL of the RSS feed; this data is kept in the RSSURL field. The
RSSSelect field tells the application how to get to the nodes in the RSS Feed
that we are interested in. The RSSTitle, RSSLink and RSSDescription fields tell
the application which pieces of data we want to store in the Title, Link and
ArticleDescriptions fields respectively in the WebNewsItem table.
The Code
The sample contains two classes. Feed.vb is class that will get
the RSS feed as an XML document and go through it to get the data we are looking
for. RSSItem.vb will read the RSS Feed information from the database and hold
it. We need to use the System.Xml.XPath, System.Data, and System.Data.SqlClient
namespaces.
Imports
System.Xml.XPath
Imports
System.Data
Imports
System.Data.SqlClient
The GetFeed() method of the
Feed class will get
the RSS Feed and bring it back into a XPathDocument using a select that we
defined in our database. It then loops through the nodes of the document passing
each node to the ProcessNode method.
Public
Sub
GetFeed()
Try
' Bring back the
Feed
Dim
doc As
New
XPathDocument(rssURL)
Dim
nav As
XPathNavigator = doc.CreateNavigator()
Dim
iter As
XPathNodeIterator = nav.Select(rssSelect)
' Loop through the
nodes
While
iter.MoveNext()
' Get the data we
need from the node
ProcessNode(iter.Current)
End
While
Catch ex As
Exception
Console.WriteLine(ex.Message.ToString())
End
Try
End
Sub
'GetFeed
The ProcessNode method
gets the child nodes of the passed XPathNavigator and loops through them. We are
looking for three nodes (Link, Title and Description) as we defined them in the
database. We then make sure that the link and title are at least 10 characters
long and pass the WebNewsSourceID, link, title and description to the InsertNews
method.
Sub
ProcessNode(ByVal
lstNav As
XPathNavigator)
Dim
title As
String
= ""
Dim
link As
String
= ""
Dim
description As
String
= ""
' Get the child
nodes
Dim
iterNews As
XPathNodeIterator = lstNav.SelectDescendants(XPathNodeType.Element,
False)
' Loop through the
child nodes
While
iterNews.MoveNext()
' Save the current
Name
Dim
rssName As
String
= iterNews.Current.Name
' Is this the title?
If
rssName.ToUpper() = rssTitle.ToUpper()
Then
title =
iterNews.Current.Value
End
If
' Is this the
Link?
If
rssName.ToUpper() = rssLink.ToUpper() Then
link = iterNews.Current.Value
End
If
' Is this the
Description?
If
rssName.ToUpper() = rssDescription.ToUpper()
Then
description =
iterNews.Current.Value
End
If
End While
' Make sure
the link and title are at least 10 characters long
If
link.Length > 10 And
title.Length > 10 Then
' Update the
database
InsertNews(webNewsSourceID, link,
title, description)
End
If
End
Sub
'ProcessNode
The InsertNews method reads the connection string
from the config file. Sets up a command to run the upWebNewsItem_Insert stored
procedure and executes it.
Sub
InsertNews(ByVal
webNewsSourceID As
Integer,
ByVal link
As
String,
ByVal title
As
String,
ByVal description
As
String)
Try
' Create Connection
Dim
objConnection As
New
SqlConnection
System.Configuration.ConfigurationSettings.AppSettings("ConnectString"))
' Set up the command
Dim
objCommand As
New
SqlCommand("upWebNewsItem_Insert", objConnection)objCommand.CommandType =
CommandType.StoredProcedure
' Set up the
parameters
objCommand.Parameters.Add("@WebNewsSourceID",
SqlDbType.Int).Value = webNewsSourceID
objCommand.Parameters.Add("@Link", SqlDbType.VarChar, 255).Value = link
objCommand.Parameters.Add("@Title", SqlDbType.VarChar, 500).Value = title
objCommand.Parameters.Add("@ArticleDescription", SqlDbType.VarChar,
1000).Value = description
objCommand.Parameters.Add("@ID", SqlDbType.Int)
objCommand.Parameters("@ID").Direction = ParameterDirection.Output
' Execute the
command
objConnection.Open()
objCommand.ExecuteNonQuery()
objConnection.Close()
Catch
ex As
Exception
Console.WriteLine(("ERROR:" + ex.Message.ToString()))
End
Try
End
Sub
'InsertNewsv