Sep
28
2006
Simple RSS reader class
Posted by admin under
ASP.NET articles

Being able to read RSS feeds are becoming more and more important today, even for website publishers. Here's a very simple (ASP.NET 2.0) example - but the class and code could easily be used in .NET 1.1 as well.
The top of our default.aspx looks like this when running:

After clicking on the button a gridview blow is databound:

Now - the secret is to use the ReadXml capabilities of the dataset class. This way we are able to get the RSS feed into a plain dataset - and use that for databinding:
/// <summary>
/// Summary description for RSSClient
/// </summary>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
public class RSSClient
{
private DataSet m_ds = null;
public DataSet GetRSSDataSet()
{
if (m_ds == null)
{
System.Xml.XmlTextReader oXml = null;
m_ds = new DataSet();
try
{
oXml = new System.Xml.XmlTextReader(m_strAdress);
m_ds.ReadXml(oXml, System.Data.XmlReadMode.Auto);
}
catch
{
m_ds = null;
}
if (oXml != null)
oXml.Close();
}
return m_ds;
}
public DataTable Items
{
get
{
DataSet ds = GetRSSDataSet();
if (ds == null)
return null;
foreach (DataTable dt in ds.Tables)
if (dt.TableName.ToUpper() == "ITEM")
return dt;
return null;
}
}
public DataTable Channel
{
get
{
DataSet ds = GetRSSDataSet();
if (ds == null)
return null;
foreach (DataTable dt in ds.Tables)
if (dt.TableName.ToUpper() == "CHANNEL")
return dt;
return null;
}
}
public DataTable GUID
{
get
{
DataSet ds = GetRSSDataSet();
if (ds == null)
return null;
foreach (DataTable dt in ds.Tables)
if (dt.TableName.ToUpper() == "GUID")
return dt;
return null;
}
}
public DataTable RSS
{
get
{
DataSet ds = GetRSSDataSet();
if (ds == null)
return null;
foreach (DataTable dt in ds.Tables)
if (dt.TableName.ToUpper() == "RSS")
return dt;
return null;
}
}
private string m_strAdress;
public RSSClient(string sAddress)
{
m_strAdress = sAddress;
}
}
oXml = new System.Xml.XmlTextReader(m_strAdress);
m_ds.ReadXml(oXml, System.Data.XmlReadMode.Auto);
is pretty much what it all boils down to!
I have added some properties around the dataset - cause all sections of the RSS feed are turned into separate datatables inside the dataset - for example the Items property simply retrieves the items.
Lets look at the code for our ASPX page:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="RSS Feed url"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Width="450px">http://www.aspcode.net/articles/rss.ashx</asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Get" OnClick="Button1_Click" /><br />
<br />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
and the code behind:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
RSSClient oRSSClient = new RSSClient( TextBox1.Text );
GridView1.DataSource = oRSSClient.Items;
GridView1.DataBind();
}
}
So feel free to download the solution and try it for yourself!
Note: there is an updated (better) version available here
Attachments