Spring til indhold

RSS

det ældste af de to XML-formater, et feed skrives i

Hvad det er

RSS er et XML-format til at udgive et feed: ét channel-element, der beskriver et site og rummer en liste af item-elementer, hvert et indlæg med et link, en dato og noget tekst, på en adresse, som feedlæsere henter med faste mellemrum. Specifikationen skriver navnet ud som Really Simple Syndication, mange siger »RSS-feed« om et feed i et hvilket som helst format, og RSS 1.0, »RDF Site Summary«, er et selvstændigt format bygget på RDF og ikke en tidligere version af det, der bruges i dag.

Formatet begyndte hos Netscape, som udgav RSS 0.90 i marts 1999 og 0.91 i juli samme år. UserLand udgav sin egen 0.91 i juni 2000, derefter 0.92 og i august 2002 RSS 2.0. Berkman Klein Center ved Harvard Law School udgav 2.0.1, skrevet af Dave Winer, i juli 2003, og siden har RSS Advisory Board passet teksten under en Creative Commons-licens. Udvalgets køreplan siger, at formatet i al praktisk forstand er frosset ved 2.0.1. Udvalget har udgivet reviderede udgaver af dokumentet siden, den gældende i marts 2009, men nye behov dækkes af udvidelser i deres egne XML-navnerum og ikke af nye versioner af RSS.

Et dokument er lille. Roden er et rss-element, hvis version-attribut skal være 2.0, og som rummer en enkelt channel. Kanalen skal have en title, et link og en description. Alle elementer i et indlæg er valgfrie, så længe indlægget har mindst en titel eller en beskrivelse. Alt andet, fra pubDate og guid til kanalens image og ttl, er der, når udgiveren vil have det:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Eksempelnoter</title>
    <link>https://example.com/</link>
    <description>Korte noter om at drive servere.</description>
    <item>
      <title>Databasen flytter</title>
      <link>https://example.com/notes/db-move/</link>
      <guid isPermaLink="true">https://example.com/notes/db-move/</guid>
      <pubDate>Sat, 17 Oct 2026 09:00:00 GMT</pubDate>
      <description>Hvorfor flytningen tog én aften.</description>
    </item>
  </channel>
</rss>

Hvorfor det betyder noget

RSS er løst, og løsheden er det, en udgiver skal forstå. Et indlægs description kan rumme ren tekst eller HTML, der er escapet ind i elementet, og intet i filen siger hvilket, så læseren afgør det. guid er valgfri, så uden den må en læser selv regne ud, om et indlæg er nyt. Datoer følger RFC 822, en e-mailstandard fra 1982, som strenge som Sat, 17 Oct 2026 09:00:00 GMT med engelske navne på dage og måneder, og specifikationen tillader stadig et tocifret årstal. Og formatet har ingen måde at erklære en basis-URL på, så et relativt link inde i et indlæg har intet pålideligt at blive opløst imod.

Udvalgets svar er RSS Best Practices Profile, udgivet i oktober 2007: anbefalinger til dokumenter, der virker på tværs af den brede vifte af software, der læser dem. Profilen beder om en guid på hvert indlæg og om absolutte URL’er i links og beskrivelser. Den fortæller, at de eneste datoformer, som alle de testede aggregatorer håndterede, var i Universal Time og endte på GMT, +0000 eller -0000. Den beskriver også et atom:link med rel="self", der angiver feedets egen adresse. Et feed, der er skrevet efter profilen, lader sine læsere gætte langt mindre.

To udvidelser bærer det meste af det, et moderne feed lægger til. atom:link låner elementet fra Atom. content:encoded, fra et modul, der oprindelig blev skrevet til RSS 1.0, rummer et indlægs fulde HTML. Profilen beskriver at bruge begge sammen, den fulde tekst i content:encoded og et kortere resumé i description, og fandt, at når et indlæg havde begge, viste seks af de otte testede aggregatorer content:encoded og så bort fra resuméet. enclosure-elementet hæfter en mediefil til et indlæg med tre krævede attributter: filens url, dens length i bytes og dens MIME-type.

Frosset er også en styrke. Et format, der har stået stille siden 2003, er et fast mål, og et feed, der skrives efter det i dag, læses af software, der blev skrevet efter samme tekst for mange år siden. Atom lukker de fleste af hullerne ovenfor i selve specifikationen, så argumentet for også at udgive RSS handler om læserne og ikke om stringens: nogle tager kun RSS, og en RSS-adresse, der blev delt ud for år tilbage, bliver stadig hentet.

Sådan ser det ud i praksis

Dette site udgiver RSS 2.0 på /da/index.xml ved siden af et Atom-feed og et JSON Feed. Kolofonen forklarer, hvorfor der er to XML-feeds: alle tre har den fulde tekst, og der er to XML-feeds og ikke ét, fordi nogle læsere kun tager det ene af de to, og det er ikke til at forudsige hvilket. Samme side linker RSS-feedet til W3C’s feed-validator ved siden af Atom-feedet, så enhver kan køre tjekket selv uden at tage sitets ord for noget.

Siden om at læse sitet fra en terminal behandler feedsene som data. Den siger, at porteføljen udgives i tre formater, som hver har den fulde tekst af hvert punkt og ikke bare en smagsprøve, og henter RSS-feedet med intet andet end curl:

curl -s https://engineer.company/da/index.xml

Hvor det går galt

Kanalens billede mangler, og validatoren protesterer. En læser viser intet billede ved feedets navn, og W3C’s tjeneste advarer om billedformatet. RSS' image-element er det strengeste billedelement i de tre feedformater: kun GIF, JPEG eller PNG, højst 144 pixel bredt og 400 højt. Et delingskort til sociale medier i WebP er den forkerte fil til det. Dette sites RSS-skabelon peger i stedet image på sitets PNG-ikon på 144 pixel, og kommentaren ved siden af noterer, at WebP-kortet havde udløst en ImageUrlFormat-advarsel, som blev fanget ved at validere igen efter ændringen.

Indlæg står i forkert rækkefølge, og intet melder det. En læser placerer nye indlæg under gamle eller viser dem med forkert dato. RSS-datoer er strenge, så en dato i ISO 8601, et layout med en stavefejl eller et dagnavn på et andet sprog giver stadig velformet XML, og kun læserens datoparser opdager det. I Hugo skriver en skabelons Format-metode på en dato engelske navne, mens funktionen time.Format lokaliserer dem, og en pubDate med danske dag- og månedsnavne er ikke en RFC 822-dato. Dette site formaterer hver pubDate med metoden ud fra et layout, der ligger i én partial-skabelon sammen med Atoms, og kommentaren dér siger, at en tastefejl i et af dem ikke er en buildfejl, men et feed, der parses og sorteres forkert i en andens læser.

Ikoner i et indlæg tegner ingenting, og validatoren lister fejl. Den fulde tekst i content:encoded forlader sin side, så alt, der afhænger af siden, forsvinder. Et SVG-ikon, der peger ind i en sprite, som er defineret et andet sted på siden, tegner ingenting i en læser, og W3C’s tjeneste markerer selve svg-elementet. Dette sites feeds får deres overskrifter uden brandets tandhjul som skillelinje af den grund; kommentaren i den skabelon noterer, at validatoren havde rapporteret tolv Non-html tag: svg-meddelelser og seks klager over en role-attribut.

Links inde i et indlæg fører ingen steder hen. En abonnent følger et link i et indlæg og lander på en side, der mangler, eller på ingenting. Et rodrelativt link som /da/notes/ virker på websiden, fordi browseren kender sidens adresse, men et RSS-dokument kan ikke erklære en basis-URL. Profilen siger, at en beskrivelse ikke bør indeholde relative URL’er, og at en aggregator kan forsøge at opløse en imod kanalens link; en læser, der lader være, efterlader linket i stykker. Skriv hvert link i et feeds HTML som en absolut URL.

To kategorier med samme ord ligner én. Et indlæg, der er mærket i to vokabularer, viser et begreb to gange, eller en læser slår to begreber sammen, der betyder noget forskelligt. RSS’ category-element har en valgfri domain-attribut, der navngiver det vokabular, et begreb kommer fra. Dette sites RSS-skabelon skriver den på hver kategori, fordi de to vokabularers overlappende begreber ellers ville ligne dubletter, som kommentaren siger.

Læs mere

  • RSS 2.0 Specification — RSS Advisory Boards tekst til formatet, element for element, med køreplanen, der erklærer det frosset.
  • RSS Best Practices Profile — udvalgets anbefalinger og det, det fandt, da det testede rigtige aggregatorer.
  • RSS History — hver version fra Netscapes 0.90 til den gældende tekst, med datoer og udgivere.
  • RDF Site Summary (RSS) 1.0 — det selvstændige RDF-baserede format, der deler navnet.
  • RFC 822 — e-mailstandarden fra 1982, hvis syntaks for dato og klokkeslæt RSS stadig bruger.

Ordliste