Contents
Contents of this writing:
- Contents
- Overview
- Definition
- Feeds
- Aggregators/Readers
- Version History
- Schema
- Sample; RSS Bars Library
- Download
- Further Readings
Overview
This writing does not include a full discussion or even the full details of RSS or XML. Rather, it includes a nice introduction to RSS and its XML schema. In addition, it incorporates what you get in a sample application that is easy-to-code, understand, and to extend.
Definition
RSS (commonly expanded as Really Simple Syndication or, sometimes, Rich Site Summary) is an XML content with specific schema used to deliver frequently changing web content (like news headlines, blogs, etc.).
RSS content is also known as a feed, web feed, syndication feed, web syndication, and a channel. It is widely known and distinguished by its icon “”.
RSS feeds are usually files that reside in a specific location. Those files usually (not extensively) have the extension rss or xml.
Feeds
Today, most -if not all – of the blogs and sites that have frequently changing web content incorporate RSS.
For instance, The New York Times has more than one hundred of RSS feeds available for subscription (listed here.) Every feed delivers the latest headlines for a specific category (Technology, Sports, etc.)
Aggregators/Readers
How can you benefits from RSS feeds? Surely, XML data is not the flexible and readable content that can be used. Thus, users usually access feeds via applications (or web clients) that are known as Feed Readers, RSS Readers, and Aggregators. Those applications read the RSS XML content, parse it, and display feed items (e.g. news headlines) to the user in a friendly interface
.
Version History
RSS undergoes several changes that result in different versions and two major branches:
- RDF (Resource Description Framework) or RSS 1.* in other words.
- RSS 2.*
We will assume RSS 2.* is our discussion.
Schema
As any other XML format, RSS has a specific schema that RSS contents (i.e., feeds) should comply with; they are required to implement obligatory elements, and they had the choice to implement other optional elements.
As a matter of discussion, we will take the CodeProject latest articles RSS feed (available here) as an example and extract the RSS schema from it.
The following is a sample from the CodeProject RSS feed content (at the time of this writing):
="1.0"="utf-8"
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0">
<channel>
<title>The Code Project Latest Articles</title>
<link>http://www.codeproject.com</link>
<description>Latest Articles from The Code Project</description>
<language>en-us</language>
<image>
<title>The Code Project</title>
<url>http://www.codeproject.com/images/codeproject100x30.gif</url>
<link>http://www.codeproject.com</link>
<width>100</width>
<height>30</height>
<description>The Code Project</description>
</image>
<copyright>Copyright © CodeProject, 1999-2010</copyright>
<webMaster>webmaster@codeproject.com</webMaster>
<lastBuildDate>Sun, 04 Apr 2010 12:27:00 GMT</lastBuildDate>
<ttl>20</ttl>
<generator>C# Hand-coded goodness</generator>
<item xsi:type="article">
<title>Comparison of Architecture presentation patterns MVP(SC),MVP(PV), ...</title>
<description>This article will compare four important architecture ...</description>
<link>http://www.codeproject.com/KB/aspnet/ArchitectureComparison.aspx</link>
<author>Shivprasad koirala</author>
<pubDate>Sun, 04 Apr 2010 12:27:00 GMT</pubDate>
<subject>ASP.NET</subject>
<GUID>http://www.codeproject.com/KB/aspnet/ArchitectureComparison.aspx</GUID>
</item>
<item xsi:type="article">
<title>Arcade Button in Expression Blend & Silverlight</title>
<description>Discover the power of the Grid object, & how it controls ...</description>
<link>http://www.codeproject.com/KB/expression/ArcadeButton.aspx</link>
<author>Alan Beasley</author>
<pubDate>Sun, 04 Apr 2010 11:42:00 GMT</pubDate>
<subject>Expression</subject>
<GUID>http://www.codeproject.com/KB/expression/ArcadeButton.aspx</GUID>
</item>
<item xsi:type="article">
<title>How to translate your forms application</title>
<description>Translate your forms application to multiple languages ...</description>
<link>http://www.codeproject.com/KB/dotnet/forms-translator.aspx</link>
<author>Davide Vitelaru</author>
<pubDate>Sun, 04 Apr 2010 07:19:00 GMT</pubDate>
<subject>.NET Framework</subject>
<GUID>http://www.codeproject.com/KB/dotnet/forms-translator.aspx</GUID>
</item>
</channel>
</rss>
If we have a look at the file in XML Notepad, we can see the following results:
To gain more understanding of the schema, let’s have a look at this diagram:
Required elements surrounded by the red border. Many other optional elements are available.
Most elements are self-explanatory from their names. However, the following may need more explanation:
- rss\channel\language: Content language (e.g. en-us for English for United States.)
- rss\channel\lastBuildDate: The date of the last change of the content.
- rss\channel\ttl: Time to Live. The number of minutes that indicate how long a channel can be cached before refreshing from the source. You would ignore this element, in many cases.
- rss\channel\generator: The name of the program used to generate this feed.
- rss\channel\item\guid: A Globally Unique Identifier used to identify this feed item.
Sample; RSS Bars Library
Our sample project is not an application in itself. Actually it is a WinForms control library that is called Geming.WinForms.RssBars
. This library includes bars that read RSS content from a specific feeds and display it to the user.
This is an extensible library you can extend to read from any RSS feed you like. The following are snapshots of the RssBars
controls (reading CodeProject, just Like a Magic, BBC, and the Nile News channels.)
The following figure shows library class diagram:
As you see, we have only one business object, RssItem
structure. It encapsulates fields related to a feed item.
The RssBar
is the base MustInherit
(abstract
in C#) class. It defines the base functionality of a RSS bar. All other classes are just children of the base class. They incorporate the functionality of RssBar
by just setting its RSS feed path.
The RssBar
requires two parameters for instantiation, the RSS path, and the banner image. For the sake of performance, we have required the developer to pass a banner image of the feed instead of automatically loading it from the image
element of the feed content.
To avoid duplication, members of the RssBar
are documented in the code.
The core function of the RssBar
is the ReadRss()
function. This function accesses the RSS feed and populates the list of feed items and display them to the user.
Since RSS is a XML format, we will need to reference the System.Xml.dll library as it is the core library for accessing XML via .NET. (Do not forget to import the System.Xml namespace.)
The following is a sample from the function code. Code abbreviated for clarity.
Public Sub ReadRss()
Dim xmlDoc As New Xml.XmlDocument
xmlDoc.Load(m_rss)
Dim ndChannel As Xml.XmlNode = xmlDoc.Item("rss").Item("channel")
Dim collItems As New Collections.Generic.List(Of RssItem)
Dim ndItem As Xml.XmlNode
For i As Integer = 0 To ndChannel.ChildNodes.Count - 1
ndItem = ndChannel.ChildNodes(i)
If (ndItem.Name = "item") Then
collItems.Add( _
NewRssItem(ndItem.Item("title").ChildNodes(0).InnerText, _
ndItem.Item("link").ChildNodes(0).InnerText, _
ndItem.Item("description").ChildNodes(0).InnerText))
End If
Next
Do While enumerator.MoveNext
lbl = New Label
Me.CtrlsPanel.Controls.Add(lbl)
AddHandler lbl.Click, AddressOf Me.RssItem_Click
AddHandler lbl.MouseMove, AddressOf Me.RssItem_MouseMove
image = New PictureBox
Me.CtrlsPanel.Controls.Add(image)
AddHandler image.Click, AddressOf Image_Click
AddHandler image.MouseMove, AddressOf Image_MouseMove
Loop
End Sub
Child classes simply do not contain any code, just the line that instantiates the base RssBar
and sets the RSS feed path and image. For instance:
Public Sub New()
MyBase.New("http://www.codeproject.com/webservices/articlerss.aspx?cat=1", m_image)
Me.RightToLeft = Windows.Forms.RightToLeft.No
End Sub
Download
Further Readings
Need more about RSS? Here are a few good references:
Filed under: .NET Framework, CodeProject, Samples, XML
Tagged: .NET, CodeProject, Products, Samples, VB.NET, XML