RSS is an XML file. It has few simple rules/tags.
There are couple of versions of it. The latest version and the most used one is 2.0. You should also check ATOM which will replace RSS in the future.

I've also written an RSS aggregator called "dRSSReader" which can be downloaded at
http://sourceforge.net/projects/drssreader
which has Delphi 7 source.

You can also find RSSBandit at
http://sourceforge.net/projects/rssbandit/
with C# code.

To use RSS within HTML I also use a javascript class.
All you need is to call "loadRSS" function with the RSS URL. I do recommend to download URL within the same domain. Otherwise IE will popup a security window.

Regards
Mert
The code is below...

//RSS Parser, Version 1.0
function loadRSS(URL) {
 var xml = new ActiveXObject('MSXML2.DOMDocument.4.0');
 xml.async = false;
 xml.load(URL);
 return new RSS(xml);
}


function rss_GetNodeVal(node, XPath) {
 if(node==null) return "";
 var n = node.selectSingleNode(XPath);
 return (n==null) ? "" : n.text;
}

function rss_GetNodeValwBaseName(node, baseName, XPath) {
 if(node==null) return "";
 var n = node.childNodes;
 for(var i = 0; i < n.length; i++)
  if(n[i].nodeName==baseName+":"+XPath)
   return n[i].text; 
 return "";
}

function rss_GetAsDate(str) {
 if(str != "") try {
  return (new Date(str))
 } catch (e) {
  return new Date(0,0,0,0,0,0);
 } else
  return new Date(0,0,0,0,0,0);
}

function rss_GetAsW3CDTFDate(str) {
 //ISO 8601 - http://www.w3.org/TR/NOTE-datetime
 // YYYY-MM-DDThh:mm:ss.s+02:00
 if(str.length > 3) try {
  var year, month=1, day=1, hour=0, minute=0, sec=0, tzSign="", delta=0, tzSign=0, tzHour = 0, tzMinute = 0;
  year = parseInt(str.substr(0,4));
  month = (parseInt(str.substr(5,2))-1); if(isNaN(month)) month = 0;
  day = str.substr(8,2);if(day.substr(0,1)=="0") day = day.substr(1,1); day = parseInt(day);
  if(isNaN(day)) day = 1;
  var timePointer = str.indexOf("T");
  if(timePointer >= 0) {
   hour = parseInt(str.substr(timePointer+1,2)); if(isNaN(hour)) hour = 0;
   minute = parseInt(str.substr(timePointer+4,2)); if(isNaN(minute)) minute = 0;
   sec = parseInt(str.substr(timePointer+7,2)); if(isNaN(sec)) sec = 0;
  }
  if(str.length > 6) {
   var i;
   zSign = str.charAt(str.length-6);
   if((zSign=="+"||zSign=="-") && timePointer >= 0) {
    tzHour = parseInt(str.substr(str.length-5,2));
    tzMinute = parseInt(str.substr(str.length-2));
    if(isNaN(tzHour)) tzHour = 0;
    if(isNaN(tzMinute)) tzMinute = 0;
    tzMinute += (tzHour * 60);
    delta = ((zSign=="-") ? -1 : 1) * tzMinute * 60000;
    return new Date((Date.UTC(year, month, day, hour, minute, sec)) + delta);
   } //else if(str.charAt(str.length-1)=="Z")
  }
  return new Date(year, month, day, hour, minute, sec);
 } catch (e) {
  return new Date(0,0,0,0,0,0);
 } else
  return new Date(0,0,0,0,0,0);
}

function RSS(xmlNode) {
 this.XmlNode = xmlNode;
 this.Items = new Array();
 var verNode = xmlNode.documentElement.selectSingleNode("@version");
 var attr, i;
 this.ToHtml=rss_ChannelToHtml;
 this.DublinCore = this.Syndication = this.Content = this.RDF = this.wfw = this.slash = "";
 for(i=0; i < xmlNode.documentElement.attributes.length; i++) {
  attr = xmlNode.documentElement.attributes[i];
  if(attr.prefix == "xmlns") {
   switch(attr.value) {
    case "http://purl.org/dc/elements/1.1/": this.DublinCore = attr.baseName; break;
    case "http://purl.org/rss/1.0/modules/syndication/": this.Syndication = attr.baseName; break;
    case "http://purl.org/rss/1.0/modules/content/": this.Content = attr.baseName; break;
    case "http://www.w3.org/1999/02/22-rdf-syntax-ns#": this.RDF = attr.baseName; break;
    case "http://wellformedweb.org/CommentAPI/": this.wfw = attr.baseName; break;
    case "http://purl.org/rss/1.0/modules/slash/": this.slash = attr.baseName; break;    
   }
  }
  }
 this.Version = (xmlNode.documentElement.baseName=="RDF") ?  "1.0" :  ((verNode==null)?"0.9":verNode.text.substr(0,3));
 var tmpNode = this.XmlNode.documentElement.childNodes[0];
 this.Link = rss_GetNodeVal(tmpNode, "link");
 this.Title = rss_GetNodeVal(tmpNode, "title");
 this.Description = rss_GetNodeVal(tmpNode, "description");
 this.Language = rss_GetNodeVal(tmpNode, "language");
 this.Copyright = rss_GetNodeVal(tmpNode, "copyright");
 this.ManagingEditor = rss_GetNodeVal(tmpNode, "managingEditor");
 this.WebMaster = rss_GetNodeVal(tmpNode, "webMaster");
 this.PubDate = rss_GetAsDate(rss_GetNodeVal(tmpNode, "pubDate"));
 this.ModifiedDate = rss_GetAsDate((rss_GetNodeVal(tmpNode, "lastBuildDate")));
 this.Category = rss_GetNodeVal(tmpNode, "category");
 this.Category_Domain = rss_GetNodeVal(tmpNode, "category/@domain");
 this.Generator = rss_GetNodeVal(tmpNode, "generator");
 this.Docs = rss_GetNodeVal(tmpNode, "docs");
 this.Cloud = new RSSCloud(tmpNode.selectSingleNode("cloud"));
 this.Ttl = rss_GetNodeVal(tmpNode, "ttl");
 this.Image = new RSSImage(tmpNode.selectSingleNode("image"));
 this.Rating = rss_GetNodeVal(tmpNode, "rating");
 this.TextInput = new RSSTextInput(tmpNode.selectSingleNode("textInput"));
 this.SkipHours = rss_GetNodeVal(tmpNode, "skipHours");
 this.SkipDays = rss_GetNodeVal(tmpNode, "skipDays");
 if(this.DublinCore!="") {
  if(this.Language == "") this.Language = rss_GetNodeValwBaseName(tmpNode, this.DublinCore, "language");
  this.Creator = rss_GetNodeValwBaseName(tmpNode, this.DublinCore, "creator");
  this.Rights = rss_GetNodeValwBaseName(tmpNode, this.DublinCore, "rights");
 } else {
  this.Creator = this.Rights = "";
 }
 var nodes = tmpNode.selectNodes("item"), node;
 for(var i = 0; i < nodes.length; i ++) {
  node = nodes[i];
  this.Items.push(new RSSItem(node, this));
 }
 return this;
}

function RSSItem(xmlNode, owner) {
 this.XmlNode = xmlNode;
 this.Owner = owner;
 this.GetComments = rss_GetComments;
 this.ToString = rss_ItemToString;
 this.ToHtml = rss_ItemToHtml;

 this.Title = rss_GetNodeVal(xmlNode, "title");
 this.Link = rss_GetNodeVal(xmlNode, "link");
 this.Description = rss_GetNodeVal(xmlNode, "description");
 
 this.Enclosure = new RSSEnclosure(xmlNode.selectSingleNode("enclosure"));
 this.Image = new RSSImage(xmlNode.selectSingleNode("image"));
 this.Cloud = new RSSCloud(xmlNode.selectSingleNode("cloud"));
 this.TextInput = new RSSTextInput(xmlNode.selectSingleNode("textInput"));
 
 this.Body = rss_GetNodeVal(xmlNode, "body")
 this.Author = rss_GetNodeVal(xmlNode, "author");
 this.Category = rss_GetNodeVal(xmlNode, "category");
 this.Category_Domain = rss_GetNodeVal(xmlNode, "category/@domain");
 this.Comments = rss_GetNodeVal(xmlNode, "comments");
 this.Guid = rss_GetNodeVal(xmlNode, "guid");
 this.Guid_IsPermaLink = ( rss_GetNodeVal(xmlNode, "guid/@isPermaLink") != "false");
 this.PubDate = rss_GetAsDate(rss_GetNodeVal(xmlNode, "pubDate"));
 this.Source = rss_GetNodeVal(xmlNode, "source");
 this.Source_Url = rss_GetNodeVal(xmlNode, "source/@url");
 if(this.DublinCore!="") {
  //http://dublincore.org/documents/dcmi-terms/
  if(this.Author=="") this.Author= rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "creator");
  this.Date = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "date"));
  this.Subject = rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "subject");
  this.Publisher = rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "publisher");
  this.Rights = rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "rights");
  this.Created = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "created"));
  this.Valid = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "valid"));
  this.Available = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "available"));
  this.Issued = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "issued"));
  this.Modified = rss_GetAsW3CDTFDate(rss_GetNodeValwBaseName(xmlNode, owner.DublinCore, "modified"));
 } else {
  this.Author = this.Subject = this.Publisher = this.Rights = "";
  this.Date = this.Created = this.Valid = this.Available = this.Issued = this.Modified = new Date(0,0,0,0,0,0);
 }
 if(this.wfw!="") {
  this.CommentAPI = rss_GetNodeValwBaseName(xmlNode, owner.wfw, "comment");
  this.CommentRSS = rss_GetNodeValwBaseName(xmlNode, owner.wfw, "commentRss");
 } else {
  this.CommentAPI = this.CommentRSS = "";
 }
 if(this.slash!="") {
  this.CommentCount = parseInt(rss_GetNodeValwBaseName(xmlNode, owner.slash, "comments"));
  if(isNaN(this.CommentCount)) this.CommentCount = 0;
 } else {
  this.CommentCount = 0;
 }
 if(this.Body=="" && this.Description != "")
  this.Body = this.Description;
 return this;
}

function RSSCloud(xmlNode) {
 this.XmlNode = xmlNode;
 this.Domain = rss_GetNodeVal(xmlNode, "@domain");
 this.Port = rss_GetNodeVal(xmlNode, "@port");
 this.Path = rss_GetNodeVal(xmlNode, "@path");
 this.RegisterProcedure = rss_GetNodeVal(xmlNode, "@registerProcedure");
 this.Protocol = rss_GetNodeVal(xmlNode, "@protocol");
 return this;
}

function RSSTextInput(xmlNode) {
 this.XmlNode = xmlNode;
 this.Title = rss_GetNodeVal(xmlNode, "title");
 this.Description = rss_GetNodeVal(xmlNode, "description");
 this.Name = rss_GetNodeVal(xmlNode, "name");
 this.Link = rss_GetNodeVal(xmlNode, "link");
 return this;
}

function RSSImage(xmlNode) {
 this.XmlNode = xmlNode;
 this.Title = rss_GetNodeVal(xmlNode, "title");
 this.Description = rss_GetNodeVal(xmlNode, "description");
 this.Name = rss_GetNodeVal(xmlNode, "name");
 this.Link = rss_GetNodeVal(xmlNode, "link");
 this.Url= rss_GetNodeVal(xmlNode, "url");
 this.Width = rss_GetNodeVal(xmlNode, "width");
 this.Height= rss_GetNodeVal(xmlNode, "height");
 this.Width = (this.Width=="")?88:parseInt(this.Width);
 if(this.Width>144) this.Width = 144;
 this.Height = (this.Height=="")?31:parseInt(this.Height);
 if(this.Height>400) this.Height = 400;
 return this;
}

function RSSEnclosure(xmlNode) {
 this.XmlNode = xmlNode;
 this.Url = rss_GetNodeVal(xmlNode, "url");
 this.Length = rss_GetNodeVal(xmlNode, "length");
 this.Type = rss_GetNodeVal(xmlNode, "type");
 return this;
}


function rss_GetComments() {
 if(this.CommentRSS != '')
  return loadRSS(this.CommentRSS);
}

function rss_ItemToString() {
var txt = 'Channel Link = {Channel_Link}"\n\r'+
   'Channel Title = {Channel_Title}\n\r'+
   'Channel Image Title = {Channel_Img_Title}\n\r'+
   'Channel Image Url = {Channel_Img_Url}\n\r'+
   'Channel Image Link = {Channel_Img_Link}\n\r'+
   'Channel Image Width = {Channel_Img_Width}\n\r'+
   'Channel Image Height = {Channel_Img_Height}\n\r'+
   'Item_Link = {Item_Link}\n\r'+
   'Item_Title = {Item_Title}\n\r'+
   'Item_Author = {Item_Author}\n\r'+
   'Item_Comments = {Item_Comments}\n\r'+
   'Item_CommentCount = {Item_CommentCount}\n\r'+
   'Item_Body = {Item_Body}\n\r';
 return _rss_Item_replace(txt, this);
}

function rss_ItemToHtml() {
 var html = '<table width="100%" bgcolor="#cccccc" cellpadding="0" cellspacing="0" border="0">'+
     '<tr><td>'+
      ((this.Owner.Image.Url=='')?'':'<a href="{Channel_Img_Link}"><img align="left" border="0" src="{Channel_Img_Url}" alt="{Channel_Img_Title}" width="{Channel_Img_Width}" height="{Channel_Img_Height}"></a>')+
      '&nbsp;<a href="{Channel_Link}" class="black"><b>Feed: </b>{Channel_Title}</a><br/>'+
      '&nbsp;<a href="{Item_Link}" class="black"><b>Title: </b>{Item_Title}</a>'+
     '</td><td align="right">'+
      ((this.Author=='')?'':'<b>Author: </b>{Item_Author}<br/>')+
      ((this.Comments=='')?'':'<a href="{Item_Comments}" class="black">{Item_CommentCount} Comments</a>')+
     '</td></tr>'+
     '<tr bgcolor="#666666" height="1"><td colspan="2"></td></tr>'+
    '</table>'+
    '<table width="100%" cellpadding="2" cellspacing="2" border="0"><tr><td>'+
     '{Item_Body}'+
    '</td></tr>'+
    '</table>';
 return _rss_Item_replace(html, this);
}

function _rss_Item_replace(data, item) {
 return data.replace(/{Channel_Link}/gi, item.Owner.Link
   ).replace( /{Channel_Title}/gi, item.Owner.Title
   ).replace( /{Channel_Img_Link}/gi, item.Owner.Image.Link
   ).replace( /{Channel_Img_Url}/gi, item.Owner.Image.Url
   ).replace( /{Channel_Img_Title}/gi, item.Owner.Image.Title
   ).replace( /{Channel_Img_Width}/gi, item.Owner.Image.Width
   ).replace( /{Channel_Img_Height}/gi, item.Owner.Image.Height
   ).replace( /{Item_Link}/gi, item.Link
   ).replace( /{Item_Title}/gi, item.Title
   ).replace( /{Item_Author}/gi, item.Author
   ).replace( /{Item_Comments}/gi, item.Comments
   ).replace( /{Item_CommentCount}/gi, item.CommentCount
   ).replace( /{Item_Body}/gi, item.Body
   );
}

function rss_ChannelToHtml() {
 var aHtml = new Array();
 aHtml.push('<table width="100%" class="d" cellpadding="0" cellspacing="0" border="0">');
 aHtml.push('<tr><th>Title</th><th>Date</th><th>Author</th><th>Subject</th><th>Category</th></tr>');
 for(var i = 0; i < this.Items.length; i++)
  aHtml.push(rss_DrawChannelItemAsHtml(this.Items[i],i));
 aHtml.push('</table>');
 return aHtml.join('');
}

function rss_DrawChannelItemAsHtml(item, line) {
 var arHtml = new Array();
 arHtml.push("<tr>"); 
 arHtml.push('<td><a href="#" onClick="drawLine('+line+')" class="black">'+item.Title+'</a></td>');
 arHtml.push('<td>'+item.Date.toLocaleString()+'</td>');
 arHtml.push('<td>'+item.Author+'</td>');
 arHtml.push('<td>'+item.Subject+'</td>');
 arHtml.push('<td>'+item.Category+'</td>');
 arHtml.push("</tr>"); 
 return arHtml.join('');
}