Il formato 0.91 si è evoluto perdendo alcune limitazioni nella versione 0.92 ed è stato ulteriormente perfezionato nella versione 2.0 (distribuito da Userland nel 2002). Di fatto, abbiamo a che fare con almeno tre differenti "dialetti":
Chi produce contenuti da distribuire in formato RSS è così costretto a scegliere quale versione utilizzare o, come avviene nella maggior parte dei casi, a esportare i propri contenuti in tutti i formati disponibili.
Nonostante le differenti implementazioni delle diverse versioni, i documenti RSS condividono tutti la stessa struttura di base, che prevede:
Nel maggio del 1999 la Netscape commercializzò RSS 0.90. RSS 0.90 appare così:
Esempio 1. RSS 0.90
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/"> <channel> <title>Mozilla Dot Org</title> <link>http://www.mozilla.org</link> <description>the Mozilla Organization web site</description> </channel> <image> <title>Mozilla</title> <url>http://www.mozilla.org/images/logo.gif</url> <link>http://www.mozilla.org</link> </image> <item> <title>New Status Updates</title> <link>http://www.mozilla.org/status/</link> </item> </rdf:RDF>
Nel giugno 1999, Netscape commercializzò RSS 0.91. RSS 0.91 fu intenzionalmente incompatibile con RSS 0.90. Netscape eliminò la sintassi RDF compatibile e riprogettò RSS per essere puro XML. Aggiunsero anche un DTD che definiva diverse entità permesse.
RSS 0.91 di Netscape appare così: Esempio 2. Netscape RSS 0.91
<!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd"> <rss version="0.91"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textinput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textinput> <skipHours> <hour>0</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
Nel giugno del 2000, Userland prese la specifica RSS di Netscape, rimosse le dichiarazioni di copyright della Netscape inserendone di proprie, fece dei cambiamenti incompatibili, chiamò questa RSS 0.91, sostenendo che fosse compatibile con l'RSS 0.90 di Netscape.
l'RSS 0.91 di Userland appare così: Esempio 3. RSS 0.91 di Userland
<rss version="0.91"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
RSS 0.91 di Userland è incompatibile con quello di Netscape per diverse cose (in questo elenco sarà sottinteso "RSS 0.91", indicando le 2 diverse specifiche con l'azienda che le ha prodotte):
- Netscape dice che <hour>, dentro <skipHours> va da 0 a 23. Userland invece va da 1 a 24.
- Netscape contiene l'elemento "textinput". Userland contiene invece l'elemento "textInput". Essendo XML case-sensitive, questi sono elementi nettamente diversi.
- Netscape usa un DTD che permette di usare 96 entità: , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, -, ®, ¯, °, ±, ², ³, ´, µ, ¶, ·, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, e ÿ. Userland elimina questo DTD, così da rendere invalide queste entità e non permettere il loro uso.
Nel dicembre 2000, il RSS-DEV Working Group, gruppo del W3C, commercializzò la specifica 1.0, dichiarando la compatibilità con RSS 0.90. Di fatto era completamente incompatibile e non condivideva alcun elemento con RSS 0.90, usando un XML namespace completamente diverso. RSS 1.0 fu intenzionalmente incompatibile con RSS 0.91 (sia quello di Netscape che quello di Userland) per via della sua sintassi RDF, che faceva parte del progetto originale dell'RSS prima delle modifiche di Netscape.
RSS 1.0 appare così: Esempio 4. RSS 1.0
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> <channel> <title>Example Dot Org</title> <link>http://www.example.org</link> <description>the Example Organization web site</description> <items> <rdf:Seq> <rdf:li resource="http://www.example.org/status/"/> </rdf:Seq> </items> </channel> <image rdf:about="http://www.example.org/images/logo.gif"/> <image rdf:about="http://www.example.org/images/logo.gif”> <title>Example</title> <url>http://www.example.org/images/logo.gif</url> <link>http://www.example.org</link> </image> <item rdf:about="http://www.example.org/status/”> <title>New Status Updates</title> <link>http://www.example.org/status/</link> <description>News about the Example project</description> </item> </rdf:RDF>
Più tardi, nello stesso dicembre del 2000, Userland commercializzò RSS 0.92, dichiarandolo compatibile con la loro versione 0.91.
Esempio 5. RSS 0.92
<rss version="0.92"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
RSS 0.92 è incompatibile con RSS 0.91 di Netscape per gli stessi motivi per cui lo era la versione 0.91. Ma questa è anche incompatibile con la stessa 0.91 di Userland per via del formato del contenuto del tag <description> che cambia da plain text a HTML. L'esempio di RSS 0.92 (esempio 5) sembra uguale all'esempio di RSS 0.91 di Userland (l'esempio 3) tranne la versione, ma il significato della descrizione è diverso, per avere semanticamente lo stesso risultato bisogna convertire il testo così:
Esempio 6. RSS 0.92, propriamente convertito
<rss version="0.92"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 &lt; 2, 3 &lt; 4. In HTML, &lt;b&gt; starts a bold phrase and you start a link with &lt;a href= </description> </item> </channel> </rss>
Nell'aprile del 2001, Userland commercializzò una "bozza" (un draft) di RSS 0.93, in cui era dichiarata la compatibilità sia con la versione 0.92 che con la loro versione 0.91. Nonostante non sia stata mai distribuita per uso pubblico la versione RSS 0.93 è attualmente usata da aziende del calibro di Disney. RSS 0.93 mantiene la stessa struttura di RSS 0.92, e per questo è incompatibile con le versioni precedenti alla 0.92. Aggiunse infine l'elemento opzionale <expirationDate>.
RSS 0.93 appare così:
Esempio 7. RSS 0.93
<rss version="0.93"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 &lt; 2, 3 &lt; 4. In HTML, &lt;b&gt; starts a bold phrase and you start a link with &lt;a href= </description> <expirationDate>Sat, 29 Nov 2003 10:17:13 GMT</expirationDate> </item> </channel> </rss>
Nell'agosto del 2002, Userland commercializzò una bozza di RSS 0.94 (e la 0.93 che fine fece?), dichiaratamente compatibile RSS 0.93, RSS 0.92, la loro versione 0.91. Anche se non fu mai distribuita per uso pubblico, la versione RSS 0.94 è usata da diversi siti e aggregatori.
RSS 0.94 è incompatibile con tutte le versioni precedenti RSS per questi motivi:
- con RSS 0.93 per l'eliminazione dell'elemento <expirationDate>, elemento introdotto proprio nella versione 0.93.
- RSS 0.94 introduce un cambiamento significativo al formato: all'elemento <description> è stato aggiunto l'attributo "type", col quale indicare il tipo MIME della descrizione. Il tipo di default è “text/html”, ciò significa che se non specificato, RSS 0.94 si comporta come RSS 0.92, ed è quindi incompatibile con le versioni a questa precedente. Se invece è specificato, i client compatibili 0.93 non riconoscendo il nuovo attributo interpreteranno male il contenuto della descrizione, considerandolo HTML.
Per circostanze storiche, non esistono copie ufficiali della specifica RSS 0.94. La specifica sopra citata si riferisce alla versione 2.0, di cui parleremo sotto.
RSS 0.94 appare così: Esempio 8. RSS 0.94
<rss version="0.94"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 "http://www.classify.org/safesurf/" l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description type="text/plain">1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
Nel settembre del 2002, Userland commercializzò RSS 2.0 (partendo dalla bozza della 0.94), dichiarando retrocompatibilità con RSS 0.94, RSS 0.93, RSS 0.92, e la loro versione di RSS 0.91. RSS 2.0 è in realtà incompatibile con tutte le versioni precedenti per questo:
- RSS 2.0 elimina l'elemento <rating>, permesso invece in RSS 0.91 di Netscape e di Userland, RSS 0.92, RSS 0.93, and RSS 0.94.
- RSS 2.0 elimina l'attributo "type" introdotto RSS 0.94, perché considerato un errore che creava confusione. La specifica RSS 2.0 dice che <description> "può contenere o meno" HTML, ma non c'è modo per l'utente di distinguere con un'applicazione l'HTML dal testo puro (specialmente in testi che citano html). Di fatto, l'eliminazione di questo attributo crea infinitamente più confusione per un programma di quanto facesse la versione 0.94.
RSS 2.0 appare così: Esempio 9. RSS 2.0
<rss version="2.0"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>24</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
Nel novembre 2002, Userland commercializzò RSS 2.01, compatibile, secondo loro, con RSS 2.0, RSS 0.94, RSS 0.93, RSS 0.92, e la loro versione di RSS 0.91. RSS 2.01 cambiò la semantica dell'elemento <skipHours>. In RSS 0.94, RSS 0.93, RSS 0.92, e RSS 0.91 di Userland, le ore andavano da 1 a 24. In RSS 2.01, come nelle versioni di Netscape le ore andavano da 0 a 23. RSS 2.01 condivide il modello interno di RSS 2.0, il che vuol dire che è incompatibile con RSS 0.94 e tutte le versioni di RSS prima della 0.92.
RSS 2.01 appare così: Esempio 10. RSS 2.0, post-11/11/2002 (RSS 2.01)
<rss version="2.0"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>0</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
La specifica RSS 2.01 è stata pubblicata al posto della 2.0; non esistono copie ufficiali della specifica 2.0. Come puoi vedere dall'esempio 10, RSS 2.01 usa lo stesso "2.0" come numero della versione, come RSS 2.0, rendendo impossibile la distinzione da parte di un programma. Tutti i flussi RSS 2.0 sono da considerarsi feed RSS 2.01, nonostante l'incompatibilità tra RSS 2.01 e RSS 2.0. Questo significa che, pubblicando un feed RSS 2.0 valido il 10 novembre contenente <hour>24</hour>, potresti svegliarti l'11 e scoprire che il tuo flusso è diventato invalido mentre dormivi.
Nel gennaio 2003, Userland cambiò la specifica, già pubblicata, RSS 2.01, per riaggiungere l'elemento <rating>. Il formato restò invariato, il che vuol dire che RSS 2.01 è ancora incompatibile con RSS 0.94 e tutte le versioni RSS prima della 0.92.
RSS 2.01 appare così: Esempio 11. RSS 2.0, post-1/21/2003 (RSS 2.01 rev 2)
<rss version="2.0"> <channel> <title>Example Channel</title> <link>http://example.com/</link> <description>an example feed</description> <language>en</language> <rating>(PICS-1.1 “http://www.classify.org/safesurf/” l r (SS~~000 1))</rating> <textInput> <title>Search this site:</title> <description>Find:</description> <name>q</name> <link>http://example.com/search</link> </textInput> <skipHours> <hour>0</hour> </skipHours> <item> <title>1 < 2</title> <link>http://example.com/1_less_than_2.html</link> <description>1 < 2, 3 < 4. In HTML, <b> starts a bold phrase and you start a link with <a href= </description> </item> </channel> </rss>
Ancora una volta, la nuova specifica 2.01 fu pubblicata al posto della vecchia, senza nessuna copia ufficiale della versione precedente. Né la versione di revisione ("2.01″) né la versione del formato ("2.0″) cambiarono, rendendo impossibile ancora una volta distinguere tra i due formati. Questo vuol dire che se un flusso contiene l'elemento <rating> e si dichiara come RSS 2.0, è impossibile sapere se è valido senza sapere quando è stato creato.
Ci sono in tutto 9 versioni di RSS, tutte incompatibili per qualche motivo con una parte delle altre. RSS 0.90 è incompatibile con RSS 0.91 di Netscape, RSS 0.91 di Netscape è incompatibile con RSS 0.91 di Userland, RSS 0.91 di Netscape è incompatibile con RSS 1.0, quella del W3C, RSS 0.91 di Userland è incompatibile con la loro stessa 0.92, RSS 0.92 è incompatibile con la 0.93, 0.93 con la 0.94, 0.94 con la 2.0, e la 2.0 è incompatibile con sé stessa.