Introduction

There's already quite a comprehensive RSS tool on The Code Project: RSS 2.0 Framework written by "Jerry Maguire". The purpose of this, RssReader class, is to provide a simple tool for retrieving RSS feeds from remote and local sources, without needing to parse XML in each application you require the RSS feed in. The class, as its name suggests, only reads RSS feeds - it has no capabilities for writing feeds.

The RSS Format

The RSS (Really Simple Syndication) specification is found at http://blogs.law.harvard.edu/tech/rss. It's an XML format for retrieving, typically, headlines or the latest article details from other sites. For example the New York Times provide an RSS feed of their main headlines, which you can access and put inside your own site or application.

The RSS format is true to its name - simple. As the image below shows, it contains a root RSS node, which has a channel node beneath it. Inside this channel node there are a number of elements to describe the feed. Then after these is a list of articles, headlines, stories or whatever they contain in the form of item nodes. Each item node contains elements to describe themselves - title, description and link are the 3 required elements, there are other optional ones which you can be read about in the specification and the RssReader class docs.

RssFeed and RssItem objects

Given the simpilicity of the RSS format, it was straightforward to map its structure to a value type (struct).The image below shows the RssFeed object.

In this are most (some haven't been implemented in this version) of the fields that RSS offers. There is an Items property, which contains a collection of RssItem objects. The RssItem type maps to an RSS item, containing most of the fields available to an RssItem.

The RssReader class has one main method, RetrieveFeed which returns an RssFeed object, given a url. This url can be in the format of file:// as well as the standard http://, if you want to open a local file (it's not been tried with ftp://).

Static methods

I added several static methods to make the process even simpler, they're all self explanatory. Also included in the class library is a class called RssHtmlMaker. This is a simple tool I wrote to turn a RssFeed object into a html (or any other format) document, given a template containing tokens. These tokensmap to the rss fields available. Details of the tokens are in the documentation.

RDF

Included in the RssReader is the ability to read simple RDF format feeds. RDF (Resource Description Framework) is an W3C XML format for describing web resources. The format caters for describing the content of the web resource, including items such as title, description and url. There were a couple of RDF feeds which i wanted to use, specifically the slashdot.org feed and the register.com feed. The main way these RDF documents differ from their RSS counter-parts is the the <items> nodes are children of the main root rss (or in this case rdf) node, rather than the <channel> node.. This is catered for in the RssReader class via the member variable RdfMode, which is set to false by default. The RDF specification is found at http://www.w3.org/TR/2004/REC-rdf-primer-20040210/ .

Final note

One final thing to note: to save yourself at worst being ip-banned by the hosts of the feeds, and at best just upsetting the feed providers, I'd recommend caching the feeds once you get them, rather than retrieving the feed each time it's required. This can be done by serializing the RssFeed class, or creating a html version of the feed and saving it to disk.

Hopefully the class is useful to people - I've not managed to find any C# Rss Feeds about, if there are any then leave a url below.

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.

You are right. To fix this, go to line number 552, and change "pubdate" to "pubDate".

I also changed reading of pubDate so that RssItem.PubDate is a DateTime variable, and the date gets parsed: rssItem.Pubdate = DateTime.Parse(xmlNode.ChildNodes[i].InnerText.Remove(xmlNode.ChildNodes[i].InnerText.IndexOf(" +")));

That way you can get out the date in any format you wish, for instance:
string date = String.Format("{0:dd.MM.yyyy}", feed.Items[i].PubDate)

Hi all,
I found another problem with this date (both for the rssfeed.pubdate and the rssitem.pubdate): in case of date in this format "Wed, 10 Nov 2010 03:20:28 EST" the conversion failes and so I used this code lines:

Hello, thanks for explaining your code. Do you have any suggestions on how to process HTML code that's in the description node correctly? i.e. I have text between anchors, and also youtube videos in my blog, but it's not processing them in the feed reader and everything is just text. As a matter of fact, I don't even see the code for youtube videos. Thanks!

btw for example, sometimes i get \n\n\n in the description when there should be a lot of text, and youtube video...also...all the descriptions are truncated with [...]...i'm trying to reproduce what you would actually see when you go to the blog. I'm testing with a wordpress feed, which uses cdata in the description, which from what I read, should protect the Html, correct?

btw for example, sometimes i get \n\n\n in the description when there should be a lot of text, and youtube video...also...all the descriptions are truncated with [...]...i'm trying to reproduce what you would actually see when you go to the blog. I'm testing with a wordpress feed, which uses cdata in the description, which from what I read, should protect the Html, correct?

Hi, first of all, thanks for writing this article, it was a great help.
I'm extensively using your RSS reader class.
I would just like to mention a small bug here (as your website is down) :
You just forgot to match against the "link" markup, which is why the RssFeed.Link property is always an empty string.

at the top (you'll need to edit the text in the richtextbox on the app). I've updated this in a new version of the app I'll be releasing in the next week or so, which also contains changes that people have suggested here.

from help:CheckForIllegalCrossThreadCalls
Property Value
true if calls on the wrong thread are caught; otherwise, false.
Remarks
When a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results. A common invalid thread activity is a call on the wrong thread that accesses the control's Handle property. Set CheckForIllegalCrossThreadCalls to true to find and diagnose this thread activity more easily.

So to get it to work, I put a CheckForIllegalCrossThreadCalls = false; in the readRss() method... probably a no no, but it worked... I guess I will be using delegates more often in the future.