Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
712 lines (625 sloc) 42.9 KB
<!DOCTYPE HTML>
<html lang=en>
<head>
<meta charset=utf-8>
<title>The myth of RSS compatibility [dive into mark]</title>
<link rel=alternate type=application/atom+xml href=/web/20110810162114/http://diveintomark.org/feed/>
<link rel=me type=text/html href=/web/20110810162114/http://www.google.com/profiles/pilgrim>
<link rel=author href=/web/20110810162114/http://diveintomark.org/about>
<link rel=search type=application/opensearchdescription+xml href=/web/20110810162114/http://wearehugh.com/public/2006/09/opensearch-full.xml title="dive into mark">
<link rel="shortcut icon" href=/web/20110810162114im_/http://diveintomark.org/favicon.ico>
<link rel=prev href="/web/20110810162114/http://diveintomark.org/archives/2004/02/01/feed-parser-3" title="Universal Feed Parser 3.0 beta">
<link rel=next href="/web/20110810162114/http://diveintomark.org/archives/2004/02/13/xml-media-types" title="Determining the character encoding of a feed">
<link rel=up href="/web/20110810162114/http://diveintomark.org/archives#p1470" title="February 2004">
<link rel='index' title='dive into mark' href='/web/20110810162114/http://diveintomark.org/' />
<link rel='prev' title='Universal Feed Parser 3.0 beta' href='/web/20110810162114/http://diveintomark.org/archives/2004/02/01/feed-parser-3' />
<link rel='next' title='Determining the character encoding of a feed' href='/web/20110810162114/http://diveintomark.org/archives/2004/02/13/xml-media-types' />
<link rel='canonical' href='/web/20110810162114/http://diveintomark.org/archives/2004/02/04/incompatible-rss' />
<link rel='shortlink' href='/web/20110810162114/http://diveintomark.org/?p=1470' />
<meta name="description" content="I would like to publicly apologize for my previous misstatements. There are not 7 different and incompatible versions of RSS; there are 9.">
<meta name="keywords" content="markup,rss">
<link href="/web/20110810162114cs_/http://fonts.googleapis.com/css?family=Lora" rel=stylesheet>
<style type=text/css>
/*dive into minimalism(c)2010 Mark Pilgrim,MIT-licensed including graphics*/
html{background:white url(/web/20110810162114/http://wearehugh.com/m.jpg) no-repeat bottom right;color:black}
body{font:normal medium Lora,serif;margin:1.75em auto;width:40em;line-height:1.75;word-spacing:0.1em}
em,i,blockquote{font-family:Lora,serif;font-style:oblique}
strong,b{font-family:Lora,serif;}
pre,code,var,samp,kbd,tt{font-family:monospace}
h2,h3{font-weight:bold}
.c{font-family:'Arial Unicode MS',FreeSerif,'DejaVu Sans',sans-serif}
a{background:transparent;text-decoration:none;border-bottom:1px dotted}
a:hover{border-bottom:1px solid}
a:link{color:#1b67c9}
a:visited{color:darkorchid}
h1 a,h2 a,h3 a,#nav a,.punch a{color:inherit !important}
abbr,.p{border:0;letter-spacing:0.1em;text-transform:lowercase;font-variant:small-caps}
h1,h2,h3,p,ul,ol,#nav{margin:1.75em 0}
h1,h2,h3{font-size:medium}
h1,h2{display:inline}
h1{font-weight:normal}
pre,tt{white-space:pre-wrap;font-size:medium;line-height:2.154}
cite{font-style:normal}
img{border:0}
.framed{border:1px solid}
.cl,#arc th,#arc td,.punch p{list-style:none;margin:0;padding:0}
.cl li{margin-bottom:-1px;border-bottom:1px dotted;overflow:hidden}
.sig,.tb,.pb,blockquote{font-size:small;line-height:2.154;margin:2.154em 0;padding:0}
blockquote{font-style:oblique;border-left:1px dotted;margin-left:2.154em;padding-left:2.154em}
blockquote p{margin:2.154em 0}
.tb,.pb{margin-top:0;padding:2.154em 0}
.sig,.punch,#arc th{text-align:right}
.f,.c{text-align:center;clear:both}
#comment,#arc{width:100%}
#comment{height:14.6em;margin:0;line-height:2.154}
.me{background:papayawhip;color:black;padding:1.75em 1.75em 0 1.75em;border-top:1px dotted;margin-top:-2px}
.me>p:first-child{margin-top:0}
.punch{float:right;font-size:x-small;margin:0 0 1.75em 1.75em;line-height:1.75}
#nav + .punch + p:first-letter{float:left;color:gainsboro;padding:0.11em 4px 0 0;font:normal 4em/0.68 serif}
#arc th{padding:0 1.75em 0 0;vertical-align:baseline}
#arc{border-collapse:collapse}
figure{display:block;text-align:center;margin:1.75em 0}
figure img{display:block;margin:0 auto}
</style>
<script>_gaq=[['_setAccount','UA-7434570-2'],['_trackPageview'],['_trackPageLoadTime']];(function(){var g=document.createElement('script');g.src='//www.google-analytics.com/ga.js';g.setAttribute('async','true');document.documentElement.firstChild.appendChild(g);})();</script>
<link rel=canonical href="/web/20110810162114/http://diveintomark.org/archives/2004/02/04/incompatible-rss">
</head>
<body>
<!-- BEGIN WAYBACK TOOLBAR INSERT -->
<script type="text/javascript" src="/static/js/disclaim-element.js" ></script>
<script type="text/javascript" src="/static/js/graph-calc.js" ></script>
<script type="text/javascript" src="/static/jflot/jquery.min.js" ></script>
<script type="text/javascript">
//<![CDATA[
var firstDate = 820454400000;
var lastDate = 1388534399999;
var wbPrefix = "/web/";
var wbCurrentUrl = "http:\/\/diveintomark.org\/archives\/2004\/02\/04\/incompatible-rss";
var curYear = -1;
var curMonth = -1;
var yearCount = 18;
var firstYear = 1996;
var imgWidth = 450;
var yearImgWidth = 25;
var monthImgWidth = 2;
var trackerVal = "none";
var displayDay = "10";
var displayMonth = "Aug";
var displayYear = "2011";
var prettyMonths = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function showTrackers(val) {
if(val == trackerVal) {
return;
}
if(val == "inline") {
document.getElementById("displayYearEl").style.color = "#ec008c";
document.getElementById("displayMonthEl").style.color = "#ec008c";
document.getElementById("displayDayEl").style.color = "#ec008c";
} else {
document.getElementById("displayYearEl").innerHTML = displayYear;
document.getElementById("displayYearEl").style.color = "#ff0";
document.getElementById("displayMonthEl").innerHTML = displayMonth;
document.getElementById("displayMonthEl").style.color = "#ff0";
document.getElementById("displayDayEl").innerHTML = displayDay;
document.getElementById("displayDayEl").style.color = "#ff0";
}
document.getElementById("wbMouseTrackYearImg").style.display = val;
document.getElementById("wbMouseTrackMonthImg").style.display = val;
trackerVal = val;
}
function getElementX2(obj) {
var thing = jQuery(obj);
if((thing == undefined)
|| (typeof thing == "undefined")
|| (typeof thing.offset == "undefined")) {
return getElementX(obj);
}
return Math.round(thing.offset().left);
}
function trackMouseMove(event,element) {
var eventX = getEventX(event);
var elementX = getElementX2(element);
var xOff = eventX - elementX;
if(xOff < 0) {
xOff = 0;
} else if(xOff > imgWidth) {
xOff = imgWidth;
}
var monthOff = xOff % yearImgWidth;
var year = Math.floor(xOff / yearImgWidth);
var yearStart = year * yearImgWidth;
var monthOfYear = Math.floor(monthOff / monthImgWidth);
if(monthOfYear > 11) {
monthOfYear = 11;
}
// 1 extra border pixel at the left edge of the year:
var month = (year * 12) + monthOfYear;
var day = 1;
if(monthOff % 2 == 1) {
day = 15;
}
var dateString =
zeroPad(year + firstYear) +
zeroPad(monthOfYear+1,2) +
zeroPad(day,2) + "000000";
var monthString = prettyMonths[monthOfYear];
document.getElementById("displayYearEl").innerHTML = year + 1996;
document.getElementById("displayMonthEl").innerHTML = monthString;
// looks too jarring when it changes..
//document.getElementById("displayDayEl").innerHTML = zeroPad(day,2);
var url = wbPrefix + dateString + '/' + wbCurrentUrl;
document.getElementById('wm-graph-anchor').href = url;
//document.getElementById("wmtbURL").value="evX("+eventX+") elX("+elementX+") xO("+xOff+") y("+year+") m("+month+") monthOff("+monthOff+") DS("+dateString+") Moy("+monthOfYear+") ms("+monthString+")";
if(curYear != year) {
var yrOff = year * yearImgWidth;
document.getElementById("wbMouseTrackYearImg").style.left = yrOff + "px";
curYear = year;
}
if(curMonth != month) {
var mtOff = year + (month * monthImgWidth) + 1;
document.getElementById("wbMouseTrackMonthImg").style.left = mtOff + "px";
curMonth = month;
}
}
//]]>
</script>
<style type="text/css">body{margin-top:0!important;padding-top:0!important;min-width:800px!important;}#wm-ipp a:hover{text-decoration:underline!important;}</style>
<div id="wm-ipp" style="display:none; position:relative;padding:0 5px;min-height:70px;min-width:800px; z-index:9000;">
<div id="wm-ipp-inside" style="position:fixed;padding:0!important;margin:0!important;width:97%;min-width:780px;border:5px solid #000;border-top:none;background-image:url(/static/images/toolbar/wm_tb_bk_trns.png);text-align:center;-moz-box-shadow:1px 1px 3px #333;-webkit-box-shadow:1px 1px 3px #333;box-shadow:1px 1px 3px #333;font-size:11px!important;font-family:'Lucida Grande','Arial',sans-serif!important;">
<table style="border-collapse:collapse;margin:0;padding:0;width:100%;"><tbody><tr>
<td style="padding:10px;vertical-align:top;min-width:110px;">
<a href="/web/" title="Wayback Machine home page" style="background-color:transparent;border:none;"><img src="/static/images/toolbar/wayback-toolbar-logo.png" alt="Wayback Machine" width="110" height="39" border="0"/></a>
</td>
<td style="padding:0!important;text-align:center;vertical-align:top;width:100%;">
<table style="border-collapse:collapse;margin:0 auto;padding:0;width:570px;"><tbody><tr>
<td style="padding:3px 0;" colspan="2">
<form target="_top" method="get" action="/web/form-submit.jsp" name="wmtb" id="wmtb" style="margin:0!important;padding:0!important;"><input type="text" name="url" id="wmtbURL" value="http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="width:400px;font-size:11px;font-family:'Lucida Grande','Arial',sans-serif;" onfocus="javascript:this.focus();this.select();" /><input type="hidden" name="type" value="replay" /><input type="hidden" name="date" value="20110810162114" /><input type="submit" value="Go" style="font-size:11px;font-family:'Lucida Grande','Arial',sans-serif;margin-left:5px;" /><span id="wm_tb_options" style="display:block;"></span></form>
</td>
<td style="vertical-align:bottom;padding:5px 0 0 0!important;" rowspan="2">
<table style="border-collapse:collapse;width:110px;color:#99a;font-family:'Helvetica','Lucida Grande','Arial',sans-serif;"><tbody>
<!-- NEXT/PREV MONTH NAV AND MONTH INDICATOR -->
<tr style="width:110px;height:16px;font-size:10px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="/web/20110514110921/http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="14 May 2011"><strong>MAY</strong></a>
</td>
<td id="displayMonthEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight:bold;text-transform:uppercase;width:34px;height:15px;padding-top:1px;text-align:center;" title="You are here: 16:21:14 Aug 10, 2011">AUG</td>
<td style="padding-left:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="/web/20110927015220/http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="27 Sep 2011"><strong>SEP</strong></a>
</td>
</tr>
<!-- NEXT/PREV CAPTURE NAV AND DAY OF MONTH INDICATOR -->
<tr>
<td style="padding-right:9px;white-space:nowrap;overflow:visible;text-align:right!important;vertical-align:middle!important;" nowrap="nowrap">
<a href="/web/20110726002019/http://diveintomark.org/archives/2004/02/04/incompatible-rss" title="0:20:19 Jul 26, 2011" style="background-color:transparent;border:none;"><img src="/static/images/toolbar/wm_tb_prv_on.png" alt="Previous capture" width="14" height="16" border="0" /></a>
</td>
<td id="displayDayEl" style="background:#000;color:#ff0;width:34px;height:24px;padding:2px 0 0 0;text-align:center;font-size:24px;font-weight: bold;" title="You are here: 16:21:14 Aug 10, 2011">10</td>
<td style="padding-left:9px;white-space:nowrap;overflow:visible;text-align:left!important;vertical-align:middle!important;" nowrap="nowrap">
<a href="/web/20110811202602/http://diveintomark.org/archives/2004/02/04/incompatible-rss" title="20:26:02 Aug 11, 2011" style="background-color:transparent;border:none;"><img src="/static/images/toolbar/wm_tb_nxt_on.png" alt="Next capture" width="14" height="16" border="0"/></a>
</td>
</tr>
<!-- NEXT/PREV YEAR NAV AND YEAR INDICATOR -->
<tr style="width:110px;height:13px;font-size:9px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight: bold;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="/web/20100615033748/http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="15 Jun 2010"><strong>2010</strong></a>
</td>
<td id="displayYearEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight: bold;padding-top:1px;width:34px;height:13px;text-align:center;" title="You are here: 16:21:14 Aug 10, 2011">2011</td>
<td style="padding-left:9px;font-size:11px!important;font-weight: bold;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="/web/20120918202737/http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="18 Sep 2012"><strong>2012</strong></a>
</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td style="vertical-align:middle;padding:0!important;">
<a href="/web/20110810162114*/http://diveintomark.org/archives/2004/02/04/incompatible-rss" style="color:#33f;font-size:11px;font-weight:bold;background-color:transparent;border:none;" title="See a list of every capture for this URL"><strong>112 captures</strong></a>
<div style="margin:0!important;padding:0!important;color:#666;font-size:9px;padding-top:2px!important;white-space:nowrap;" title="Timespan for captures of this URL">12 Apr 06 - 18 Sep 12</div>
</td>
<td style="padding:0!important;">
<a style="position:relative; white-space:nowrap; width:450px;height:27px;" href="" id="wm-graph-anchor">
<div id="wm-ipp-sparkline" style="position:relative; white-space:nowrap; width:450px;height:27px;background-color:#fff;cursor:pointer;border-right:1px solid #ccc;" title="Explore captures for this URL">
<img id="sparklineImgId" style="position:absolute; z-index:9012; top:0px; left:0px;"
onmouseover="showTrackers('inline');"
onmouseout="showTrackers('none');"
onmousemove="trackMouseMove(event,this)"
alt="sparklines"
width="450"
height="27"
border="0"
src="/web/jsp/graph.jsp?graphdata=450_27_1996:-1:000000000000_1997:-1:000000000000_1998:-1:000000000000_1999:-1:000000000000_2000:-1:000000000000_2001:-1:000000000000_2002:-1:000000000000_2003:-1:000000000000_2004:-1:000000000000_2005:-1:000000000000_2006:-1:0006054b1132_2007:-1:344212201601_2008:-1:111121963112_2009:-1:000000000000_2010:-1:001211000111_2011:7:000020321100_2012:-1:111210001000_2013:-1:000000000000"></img>
<img id="wbMouseTrackYearImg"
style="display:none; position:absolute; z-index:9010;"
width="25"
height="27"
border="0"
src="/static/images/toolbar/transp-yellow-pixel.png"></img>
<img id="wbMouseTrackMonthImg"
style="display:none; position:absolute; z-index:9011; "
width="2"
height="27"
border="0"
src="/static/images/toolbar/transp-red-pixel.png"></img>
</div>
</a>
</td>
</tr></tbody></table>
</td>
<td style="text-align:right;padding:5px;width:65px;font-size:11px!important;">
<a href="javascript:;" onclick="document.getElementById('wm-ipp').style.display='none';" style="display:block;padding-right:18px;background:url(/static/images/toolbar/wm_tb_close.png) no-repeat 100% 0;color:#33f;font-family:'Lucida Grande','Arial',sans-serif;margin-bottom:23px;background-color:transparent;border:none;" title="Close the toolbar">Close</a>
<a href="http://faq.web.archive.org/" style="display:block;padding-right:18px;background:url(/static/images/toolbar/wm_tb_help.png) no-repeat 100% 0;color:#33f;font-family:'Lucida Grande','Arial',sans-serif;background-color:transparent;border:none;" title="Get some help using the Wayback Machine">Help</a>
</td>
</tr></tbody></table>
</div>
</div>
<script type="text/javascript">
var wmDisclaimBanner = document.getElementById("wm-ipp");
if(wmDisclaimBanner != null) {
disclaimElement(wmDisclaimBanner);
}
</script>
<!-- END WAYBACK TOOLBAR INSERT -->
<div id=nav><h1><a accesskey=1 href=/web/20110810162114/http://diveintomark.org/>dive into mark</a></h1> &#8227;
<a href="/web/20110810162114/http://diveintomark.org/archives#p1470">February 4, 2004</a> &#8227;
<h2>The myth of RSS compatibility</h2> (<a href="/web/20110810162114/http://diveintomark.org/tag/markup" rel="tag">markup</a>, <a href="/web/20110810162114/http://diveintomark.org/tag/rss" rel="tag">rss</a>)</div>
<p>I have often stated (<a href="/web/20110810162114/http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html">1</a>, <a href="/web/20110810162114/http://feedvalidator.org/news/archives/2003/07/09/preliminary_pie_support.html">2</a>, <a href="/web/20110810162114/http://diveintomark.org/projects/feed_parser/">3</a>) that there are 7 different and incompatible versions of RSS. This was based on an embarassingly simple formula: I counted the version numbers in use (0.90, 0.91, 0.92, 0.93, 0.94, 1.0, and 2.0) and came up with the number <q>7</q>. But recently some people have taken to claiming that there are not 7 versions (despite obvious evidence to the contrary), and even if there are, that they are somehow <q>compatible</q> with each other so it doesn&#8217;t really matter. So I dug a little further to precisely document the incompatible changes in each version of RSS.</p>
<p>I would like to publicly apologize for my previous misstatements. There are not 7 different and incompatible versions of RSS; there are 9.</p>
<p>In March of 1999, Netscape released <a href="/web/20110810162114/http://www.purplepages.ie/RSS/netscape/rss0.90.html">RSS 0.90</a>. RSS 0.90 looks like this:</p>
<h4 id="example1">Example 1. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss090.xml">RSS 0.90</a></h4>
<pre><code>&lt;rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/">
&lt;channel>
&lt;title>Mozilla Dot Org&lt;/title>
&lt;link>http://www.mozilla.org&lt;/link>
&lt;description>the Mozilla Organization web site&lt;/description>
&lt;/channel>
&lt;image>
&lt;title>Mozilla&lt;/title>
&lt;url>http://www.mozilla.org/images/logo.gif&lt;/url>
&lt;link>http://www.mozilla.org&lt;/link>
&lt;/image>
&lt;item>
&lt;title>New Status Updates&lt;/title>
&lt;link>http://www.mozilla.org/status/&lt;/link>
&lt;/item>
&lt;/rdf:RDF></code></pre>
<p>In July of 1999, Netscape released <a href="/web/20110810162114/http://my.netscape.com/publish/formats/rss-spec-0.91.html">RSS 0.91</a>. Netscape&#8217;s RSS 0.91 was intentionally incompatible with RSS 0.90. They dropped the RDF-compatible syntax and redesigned RSS to be pure XML. They also added a DTD which defined several allowable entities (more on these below).</p>
<p>Netscape&#8217;s RSS 0.91 looks like this:</p>
<h4 id="example2">Example 2. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/netscape-rss091.xml">Netscape RSS 0.91</a></h4>
<pre><code>&lt;!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd">
&lt;rss version="0.91">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
&lt;textinput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textinput>
&lt;skipHours>
&lt;hour>0&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;lt; 2, 3 &amp;lt; 4.
In HTML, &amp;lt;b&amp;gt; starts a bold phrase
and you start a link with &amp;lt;a href=
&lt;/description>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>In June of 2000, Userland took Netscape&#8217;s RSS specification, removed Netscape&#8217;s copyright statement, made several incompatible changes, added a Userland copyright statement, called it <q><a href="/web/20110810162114/http://backend.userland.com/rss091">RSS 0.91</a></q>, and claimed that it was compatible with Netscape&#8217;s RSS 0.91.</p>
<p>Userland&#8217;s flavor of RSS 0.91 looks like this:</p>
<h4 id="example3">Example 3. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/userland-rss091.xml">Userland&#8217;s RSS 0.91</a></h4>
<pre><code>&lt;rss version="0.91">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
<strong>&lt;textInput></strong>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
<strong>&lt;/textInput></strong>
&lt;skipHours>
<strong>&lt;hour>24&lt;/hour></strong>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;lt; 2, 3 &amp;lt; 4.
In HTML, &amp;lt;b&amp;gt; starts a bold phrase
and you start a link with &amp;lt;a href=
&lt;/description>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>Userland&#8217;s RSS 0.91 is incompatible with Netscape&#8217;s RSS 0.91 in several ways:</p>
<ol>
<li>Netscape&#8217;s RSS 0.91 specifies that <code>&lt;hour></code> within <code>&lt;skipHours></code> has a range from 0 to 23. Userland&#8217;s RSS 0.91 specifies that <code>&lt;hour></code> has a range of 1 to 24.</li>
<li>Netscape&#8217;s RSS 0.91 contains a <code>textinput</code> element. Userland&#8217;s RSS 0.91 contains a <code>textInput</code> element. Note the capitalization; XML element names are case-sensitive, so this is a completely different element.</li>
<li>Netscape&#8217;s RSS 0.91 uses a DTD which allows publishers to use 96 named entities: <code>&amp;nbsp;</code>, <code>&amp;iexcl;</code>, <code>&amp;cent;</code>, <code>&amp;pound;</code>, <code>&amp;curren;</code>, <code>&amp;yen;</code>, <code>&amp;brvbar;</code>, <code>&amp;sect;</code>, <code>&amp;uml;</code>, <code>&amp;copy;</code>, <code>&amp;ordf;</code>, <code>&amp;laquo;</code>, <code>&amp;not;</code>, <code>&amp;shy;</code>, <code>&amp;reg;</code>, <code>&amp;macr;</code>, <code>&amp;deg;</code>, <code>&amp;plusmn;</code>, <code>&amp;sup2;</code>, <code>&amp;sup3;</code>, <code>&amp;acute;</code>, <code>&amp;micro;</code>, <code>&amp;para;</code>, <code>&amp;middot;</code>, <code>&amp;cedil;</code>, <code>&amp;sup1;</code>, <code>&amp;ordm;</code>, <code>&amp;raquo;</code>, <code>&amp;frac14;</code>, <code>&amp;frac12;</code>, <code>&amp;frac34;</code>, <code>&amp;iquest;</code>, <code>&amp;Agrave;</code>, <code>&amp;Aacute;</code>, <code>&amp;Acirc;</code>, <code>&amp;Atilde;</code>, <code>&amp;Auml;</code>, <code>&amp;Aring;</code>, <code>&amp;AElig;</code>, <code>&amp;Ccedil;</code>, <code>&amp;Egrave;</code>, <code>&amp;Eacute;</code>, <code>&amp;Ecirc;</code>, <code>&amp;Euml;</code>, <code>&amp;Igrave;</code>, <code>&amp;Iacute;</code>, <code>&amp;Icirc;</code>, <code>&amp;Iuml;</code>, <code>&amp;ETH;</code>, <code>&amp;Ntilde;</code>, <code>&amp;Ograve;</code>, <code>&amp;Oacute;</code>, <code>&amp;Ocirc;</code>, <code>&amp;Otilde;</code>, <code>&amp;Ouml;</code>, <code>&amp;times;</code>, <code>&amp;Oslash;</code>, <code>&amp;Ugrave;</code>, <code>&amp;Uacute;</code>, <code>&amp;Ucirc;</code>, <code>&amp;Uuml;</code>, <code>&amp;Yacute;</code>, <code>&amp;THORN;</code>, <code>&amp;szlig;</code>, <code>&amp;agrave;</code>, <code>&amp;aacute;</code>, <code>&amp;acirc;</code>, <code>&amp;atilde;</code>, <code>&amp;auml;</code>, <code>&amp;aring;</code>, <code>&amp;aelig;</code>, <code>&amp;ccedil;</code>, <code>&amp;egrave;</code>, <code>&amp;eacute;</code>, <code>&amp;ecirc;</code>, <code>&amp;euml;</code>, <code>&amp;igrave;</code>, <code>&amp;iacute;</code>, <code>&amp;icirc;</code>, <code>&amp;iuml;</code>, <code>&amp;eth;</code>, <code>&amp;ntilde;</code>, <code>&amp;ograve;</code>, <code>&amp;oacute;</code>, <code>&amp;ocirc;</code>, <code>&amp;otilde;</code>, <code>&amp;ouml;</code>, <code>&amp;divide;</code>, <code>&amp;oslash;</code>, <code>&amp;ugrave;</code>, <code>&amp;uacute;</code>, <code>&amp;ucirc;</code>, <code>&amp;uuml;</code>, <code>&amp;yacute;</code>, <code>&amp;thorn;</code>, and <code>&amp;yuml;</code>. Userland&#8217;s RSS 0.91 removes the DTD, therefore all of these named entities are invalid and may not be used.</li>
</ol>
<p>In December of 2000, the RSS-DEV Working Group released <a href="/web/20110810162114/http://purl.org/rss/1.0/spec">RSS 1.0</a>, which they claimed was compatible with RSS 0.90. (In fact, it is completely incompatible and shares no elements with RSS 0.90 at all, since it uses a different namespace.) RSS 1.0 was also intentionally incompatible with both Netscape RSS 0.91 and Userland RSS 0.91, due to RSS 1.0&#8242;s RDF syntax.</p>
<p>RSS 1.0 looks like this:</p>
<h4 id="example4">Example 4. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss10.xml">RSS 1.0</a></h4>
<pre><code>&lt;rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/">
&lt;channel>
&lt;title>Example Dot Org&lt;/title>
&lt;link>http://www.example.org&lt;/link>
&lt;description>the Example Organization web site&lt;/description>
<strong>&lt;items>
&lt;rdf:Seq>
&lt;rdf:li resource="http://www.example.org/status/"/>
&lt;/rdf:Seq>
&lt;/items></strong>
&lt;/channel>
<strong>&lt;image rdf:about="http://www.example.org/images/logo.gif"/></strong>
&lt;image <strong>rdf:about="http://www.example.org/images/logo.gif"</strong>>
&lt;title>Example&lt;/title>
&lt;url>http://www.example.org/images/logo.gif&lt;/url>
&lt;link>http://www.example.org&lt;/link>
&lt;/image>
&lt;item <strong>rdf:about="http://www.example.org/status/"</strong>>
&lt;title>New Status Updates&lt;/title>
&lt;link>http://www.example.org/status/&lt;/link>
<strong>&lt;description>News about the Example project&lt;/description></strong>
&lt;/item>
&lt;/rdf:RDF></code></pre>
<p>Later in December of 2000, Userland released <a href="/web/20110810162114/http://backend.userland.com/rss092">RSS 0.92</a>, which they claimed was compatible with their flavor of RSS 0.91.</p>
<h4 id="example5">Example 5. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss092.xml">RSS 0.92</a></h4>
<pre><code>&lt;rss version="0.92">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>24&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;lt; 2, 3 &amp;lt; 4.
In HTML, &amp;lt;b&amp;gt; starts a bold phrase
and you start a link with &amp;lt;a href=
&lt;/description>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>RSS 0.92 is incompatible with Netscape RSS 0.91 for all the reasons that Userland RSS 0.91 is incompatible with Netscape RSS 0.91. It is also incompatible with Userland RSS 0.91, because the content model of <code>&lt;description></code> was changed from plain text to HTML. The RSS 0.92 example (example 5) appears identical to the Userland RSS 0.91 example (example 3) in every way except the version number, <em>but it means something different</em>. To create an RSS 0.92 feed that means the same thing as example 3, you need to escape the <code>&lt;description></code>, like this:</p>
<h4 id="example6">Example 6. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss092-b.xml">RSS 0.92, properly escaped</a></h4>
<pre><code>&lt;rss version="0.92">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>24&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
<strong>&lt;description>1 &amp;amp;lt; 2, 3 &amp;amp;lt; 4.
In HTML, &amp;amp;lt;b&amp;amp;gt; starts a bold phrase
and you start a link with &amp;amp;lt;a href=
&lt;/description></strong>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>In April of 2001, Userland released a draft of <a href="/web/20110810162114/http://backend.userland.com/rss093">RSS 0.93</a>, which they claimed was compatible with RSS 0.92 and their flavor of RSS 0.91. Although never officially <q>blessed</q> for public use, RSS 0.93 is in fact currently being used by companies <a href="/web/20110810162114/http://www.intertwingly.net/blog/1632.html">as large as Disney</a> (who is <a href="/web/20110810162114/http://conferences.oreillynet.com/cs/et2004/view/e_sess/4763">quite proud of it</a>). RSS 0.93 shares the same content model as RSS 0.92, and is therefore incompatible with all versions of RSS prior to 0.92. It also adds an optional <code>&lt;expirationDate></code> element, the significance of which will become apparent shortly.</p>
<p>RSS 0.93 looks like this:</p>
<h4 id="example7">Example 7. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss093.xml">RSS 0.93</a></h4>
<pre><code>&lt;rss version="0.93">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>24&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;amp;lt; 2, 3 &amp;amp;lt; 4.
In HTML, &amp;amp;lt;b&amp;amp;gt; starts a bold phrase
and you start a link with &amp;amp;lt;a href=
&lt;/description>
<strong>&lt;expirationDate>Sat, 29 Nov 2003 10:17:13 GMT&lt;/expirationDate></strong>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>In August of 2002, Userland released a draft of <a href="/web/20110810162114/http://backend.userland.com/rss094">RSS 0.94</a>, which they claimed was compatible with RSS 0.93, RSS 0.92, and their flavor of RSS 0.91. Although never officially <q>blessed</q> for public use, RSS 0.94 is currently being used by several popular technically-oriented sites such as <a href="/web/20110810162114/http://www.arstechnica.com/">Ars Technica</a>, as well as the official project feed for at least one RSS aggregator.</p>
<p>RSS 0.94 is incompatible with all previous versions of RSS in several ways:</p>
<ol>
<li>RSS 0.94 is incompatible with RSS 0.93, because RSS 0.94 drops the <code>&lt;expirationDate></code> element introduced in RSS 0.93.</li>
<li>RSS 0.94 introduces a significant change to the content model: a new <code>type</code> attribute on the <code>&lt;description></code> element, which gives the MIME type of the description. The default type is &#8220;text/html&#8221;, which means that if not specified, RSS 0.94 shares the content mode of RSS 0.92, and is therefore incompatible with all versions of RSS prior to RSS 0.92. And if type is specified, RSS 0.93-aware clients that do not know about the new attribute will misinterpret the content by incorrectly assuming it is HTML.</li>
</ol>
<p>Due to odd historical circumstances, no official copies of the RSS 0.94 specification exist. The above-linked RSS 0.94 specification incorrectly claims that it describes RSS 2.0.</p>
<p>RSS 0.94 looks like this:</p>
<h4 id="example8">Example 8. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss094.xml">RSS 0.94</a></h4>
<pre><code>&lt;rss version="0.94">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>24&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
<strong>&lt;description type="text/plain">1 &amp;lt; 2, 3 &amp;lt; 4.
In HTML, &amp;lt;b&amp;gt; starts a bold phrase
and you start a link with &amp;lt;a href=
&lt;/description></strong>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>In September of 2002, Userland released RSS 2.0, which they claimed was compatible with RSS 0.94, RSS 0.93, RSS 0.92, and their flavor of RSS 0.91. RSS 2.0 is incompatible with all previous versions of RSS in several ways:</p>
<ol>
<li>RSS 2.0 drops the <code>&lt;rating></code> element that was allowed in Netscape&#8217;s RSS 0.91, Userland&#8217;s RSS 0.91, RSS 0.92, RSS 0.93, and RSS 0.94.</li>
<li>RSS 2.0 drops the <code>type</code> attribute introduced in RSS 0.94, because <q><a href="/web/20110810162114/http://archive.scripting.com/2002/09/06#theRoadToRss20">it is a mistake</a> to add confusion to the all-important description element.</q> The RSS 2.0 specification states that <code>&lt;description></code> <q>may contain HTML</q>, but there is no way for consumers to programmatically distinguish HTML from plain text (especially text that talks about markup). In other words, the content model for RSS 2.0 is <q>Here&#8217;s something that might be HTML. Or maybe not. I can&#8217;t tell you, and you can&#8217;t guess.</q></li>
</ol>
<p>RSS 2.0 looks like this:</p>
<h4 id="example9">Example 9. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss20.xml">RSS 2.0</a></h4>
<pre><code>&lt;rss version="2.0">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>24&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
<strong>&lt;description>1 &amp;amp;lt; 2, 3 &amp;amp;lt; 4.
In HTML, &amp;amp;lt;b&amp;amp;gt; starts a bold phrase
and you start a link with &amp;amp;lt;a href=
&lt;/description></strong>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>In November of 2002, Userland released RSS 2.01, which they claimed was compatible with RSS 2.0, RSS 0.94, RSS 0.93, RSS 0.92, and their flavor of RSS 0.91. RSS 2.01 changes the semantics of the <code>&lt;skipHours></code> element. In RSS 0.94, RSS 0.93, RSS 0.92, and Userland&#8217;s RSS 0.91, hours had a range of 1 to 24. In RSS 2.01, hours now have a range of 0 to 23. RSS 2.01 shares the content model of RSS 2.0, which means it is incompatible with RSS 0.94 and all versions of RSS prior to RSS 0.92.</p>
<p>RSS 2.01 looks like this:</p>
<h4 id="example10">Example 10. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss20-b.xml">RSS 2.0, post-11/11/2002 (RSS 2.01)</a></h4>
<pre><code>&lt;rss version="2.0">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
<strong>&lt;skipHours>
&lt;hour>0&lt;/hour>
&lt;/skipHours></strong>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;amp;lt; 2, 3 &amp;amp;lt; 4.
In HTML, &amp;amp;lt;b&amp;amp;gt; starts a bold phrase
and you start a link with &amp;amp;lt;a href=
&lt;/description>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>The RSS 2.01 specification was published in place of the RSS 2.0 specification; no official copies of the RSS 2.0 specification exist. As you can see from example 10, RSS 2.01 feeds use the same &#8220;2.0&#8243; version number as RSS 2.0, making it impossible to programmatically distinguish them. All RSS 2.0 feeds must be assumed to be RSS 2.01 feeds, despite the fact that RSS 2.01 is incompatible with RSS 2.0. This means that, if you published an valid RSS 2.0 feed on November 10th that contained <code>&lt;hour>24&lt;/hour></code>, you would wake up on November 11th to find that your feed had become invalid while you slept.</p>
<p>In January of 2003, Userland changed the already-published RSS 2.01 specification, to add a <code>&lt;rating></code> element again. The content model remains the same, which means RSS 2.01 is still incompatible with RSS 0.94 and all versions of RSS prior to RSS 0.92.</p>
<p>RSS 2.01 now looks like this:</p>
<h4 id="example11">Example 11. <a title="download this example as a separate file" href="/web/20110810162114/http://diveintomark.org/public/2004/01/rss20-c.xml">RSS 2.0, post-1/21/2003 (RSS 2.01 rev 2)</a></h4>
<pre><code>&lt;rss version="2.0">
&lt;channel>
&lt;title>Example Channel&lt;/title>
&lt;link>http://example.com/&lt;/link>
&lt;description>an example feed&lt;/description>
&lt;language>en&lt;/language>
<strong>&lt;rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))&lt;/rating></strong>
&lt;textInput>
&lt;title>Search this site:&lt;/title>
&lt;description>Find:&lt;/description>
&lt;name>q&lt;/name>
&lt;link>http://example.com/search&lt;/link>
&lt;/textInput>
&lt;skipHours>
&lt;hour>0&lt;/hour>
&lt;/skipHours>
&lt;item>
&lt;title>1 &amp;lt; 2&lt;/title>
&lt;link>http://example.com/1_less_than_2.html&lt;/link>
&lt;description>1 &amp;amp;lt; 2, 3 &amp;amp;lt; 4.
In HTML, &amp;amp;lt;b&amp;amp;gt; starts a bold phrase
and you start a link with &amp;amp;lt;a href=
&lt;/description>
&lt;/item>
&lt;/channel>
&lt;/rss></code></pre>
<p>Once again, the new RSS 2.01 specification was published in place over the old specification; no official copies of the previous version of the RSS 2.01 specification exist. Neither the revision number of the spec (&#8220;2.01&#8243;) nor the version number of the format (&#8220;2.0&#8243;) was changed, making it impossible to programmatically distinguish between them. This means that if a feed contains a <code>&lt;rating></code> element and declares itself as RSS 2.0, it is impossible to know whether the feed is valid unless you also know when the feed was created.</p>
<h4>Summary</h4>
<p>There are 9 versions of RSS, all of which are incompatible with various other versions. RSS 0.90 is incompatible with Netscape&#8217;s RSS 0.91, Netscape&#8217;s RSS 0.91 is incompatible with Userland&#8217;s RSS 0.91, Netscape&#8217;s RSS 0.91 is incompatible with RSS 1.0, Userland&#8217;s RSS 0.91 is incompatible with RSS 0.92, RSS 0.92 is incompatible with RSS 0.93, RSS 0.93 is incompatible with RSS 0.94, RSS 0.94 is incompatible with RSS 2.0, and RSS 2.0 is incompatible with itself.</p>
<p class=c>&#167;
<h3 id=respond>Respond privately</h3>
<p><i>I am no longer accepting public comments on this post, but you can use this form to contact me privately. (Your message will not be published.)</i></p>
<form action="/web/20110810162114/http://wearehugh.com/public/contact.cgi" method=POST id=commentform>
<p><label for=author>Name </label><br>
<input type=text name=author id=author>
<p><label for=email>Email</label><br>
<input type=text name=email id=email></p>
<p><label for=comment>Message</label>
<textarea name=comment id=comment rows=10 cols=40></textarea></p>
<p><input type=submit value="Send message">
</p>
</form>
<p class=c>&#167;
<div class=f>
<p>
<a title="my comments here and elsewhere" href=/web/20110810162114/http://firehose.diveintomark.org/>firehose</a> &#x2027;
<a title="my current open source projects" href="/web/20110810162114/http://code.google.com/u/@UxdWQ1xUDhhBWwd%2F/">code</a> &#x2027;
<a title="my personal news aggregator" href=/web/20110810162114/http://feeds.diveintomark.org/>planet</a>
<p>&#169; 2001&#8211;present <a accesskey=9 href=/web/20110810162114/http://diveintomark.org/about>Mark Pilgrim</a>
</div>
</body>
</html>
<!-- Dynamic page generated in 0.266 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2011-06-13 10:23:33 -->
<!-- super cache -->
<!--
FILE ARCHIVED ON 16:21:14 Aug 10, 2011 AND RETRIEVED FROM THE
INTERNET ARCHIVE ON 21:11:40 Jan 16, 2013.
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
SECTION 108(a)(3)).
-->