News-Feeds im RSS-Format (XML) sind eine sehr praktische Sache, um auf
dem Laufenden zu bleiben. RSS steht für Really Simple Syndication
und bedeutet frei übersetzt "wirklich einfache Zusammenfassung". RSS-Feeds
sind Zusammenfassungen bedeutsamer Meldungen einer Web-Seite in einem
speziellen XML-Format. So bieten inzwischen fast alle großen Tageszeitungen,
Magazine und andere Massenpublikationen solche XML-Feeds an, die der
geneigte Benutzer in speziellen RSS-Readern lesen kann.
Die Grundstruktur einer solchen RSS-Datei ist recht simpel. Neben den
Feed-Informationen wie Titel, Sprache, Autor, etc., sind optimalerweise 15
Nachrichteneinträge mit Titel, Link zur Meldung im Internet (URL) und einer
Kurzbeschreibung der Meldung definiert. Es gibt z.Zt. drei verschiedene
RSS-Spezifikationen (Version 0.91, 0.92 und 2.0), wobei Version 2.0 wohl
inzwischen die gebräuchlichste ist. Eine recht gute Beschreibung der RSS
2.0-Spezifikation gibt es unter
RSS at Harvard Law.
Wer nun ein Web sein Eigen nennt, dessen aktuelle Meldungen es wert wären
in einem RSS-News-Feed anderen Personen zu Verfügung gestellt zu werden,
muss sich überlegen, wie er die Meldungen in eine XML-Datei packt. Die
einfachste Herangehensweise ist sicherlich die XML-Datei manuell zu pflegen
und nach jedem Update zu veröffentlichen. Eine Automatisierung des Vorgangs
ist möglich, wenn man Aktuelles in einer Datenbank pflegt und per ASP oder
PHP auf die Web-Seiten bringt.
Als ich mir überlegt habe für dieses Web einen RSS-Feed anzubieten,
kreisten die Gedanken eine Zeit lang darum, wie ich es anstelle, aus den in
der Datenbank abgelegten Meldungen und Artikeln, eine XML-Datei zu
generieren, wobei die Betonung auf dem Wort DATEI liegt. Mir wurde jedoch
bald klar, dass XML nichts anderes ist als ein Ausgabeformat, d.h. ob ich
nun den Internet-Server per ASP HTML-Code ausliefern lasse oder XML-Code
spielt keine Rolle. Wie man nun einen solchen XML-Feed on the fly erzeugt,
ist Gegenstand dieses Artikels.
Sehen wir uns zunächst das Grundgerüst einer RSS-XML-Datei an. Die erste
Ebene stellt das rss-Tag dar, in dem per version-Attribut definiert wird, um
welche RSS-Version es sich in dem folgenden Dokument handelt. Die zweite
Ebene bildet immer das Tag channel, das alle weiteren Informationen
beinhaltet. In der dritten Ebene stehen die Feed-Information und die
einzelnen Meldungsblöcke. Die Auswahl der hier dargestellten Tags ist nicht
abschließend, d.h. es existieren in der Spezifikation weit mehr Tags, die
zum Einsatz kommen können. Ich verwende hier lediglich die wichtigsten.
Alle Pflicht-Tags sind dabei fett dargestellt.
<rss version="2.0">
<channel>
/* Feed-Informationen */
<title>Titel des News-Feeds</title>
<link>URL des Webs</link>
<description>Beschreibung des News-Feeds</description>
<language>Sprache des News-Feeds</language>
<lastBuildDate>Datum der Erstellung des News-Feeds</lastBuildDate>
<generator>ASP</generator>
<docs>Dokumentation der eingesetzten Spezifikation</docs>
<managingEditor>eMail des RSS-Autors</managingEditor>
<webMaster>eMail des Webmasters</webMaster>
<image>
<url>URL zum Logo des RSS-Feeds/Webs (GIF, JPG oder PNG)</url>
<title>Titel des Logos</title>
<link>Seite auf die mit dem Logo verlinkt wird</link>
</image>
/* Meldungen */
<item>
<title>Titel der Meldung</title>
<link>URL zur Meldung</link>
<description>
Kurzbeschreibung der Meldung (auch HTML-Code)
</description>
<pubDate>Datum der Veröffentlichung der Meldung</pubDate>
</item>
<item>
... Meldung 2 ..
</item>
...
</channel>
</rss>
Anzumerken ist bei der Definition eines item, dass
es entweder einen Titel (title) oder eine Beschreibung (description) haben
muss, um gültig zu sein.
Sehen wir uns einzelne Tags genauer an:
language |
Hier kommen Sprach-Codes zum Einsatz. Eine deutscher News-Feed sollte die Kennung de-de tragen, wenn er aus Deutschland kommt.
Ein Feed aus Österreich de-at und einer aus der Schweiz de-ch.
Amerikanische Feeds tragen die Kennung en-us. |
lastbuilddate pubdate |
Alle Datumsfelder in einem Feed müssen nach dem RFC
822-Standard (GMT) formatiert sein, also z.B. Fri, 27 May 2005 14:21:21 +0200 |
generator |
Hier sollte eingetragen werden mit welchem Hilfsmittel
der Feed erstellt wurde. In unserem Beispiel ASP |
docs |
Der zerbit-News-Feed verweist z.B. auf die URL der o.g.
Harvard Law-Spezifikation |
Wenn nun die Meldungen in einer Datenbank vorliegen, ist es ein Leichtes
diese Informationen über ein ADO-Recordset in RSS-Items zu transformieren.
Die Kopfinformationen werden schlicht hard-coded.
Da es in ASP keine Funktion gibt, die das Formatieren eines Datums nach
RFC-822 erlaubt, verwenden wir dafür eine kleine selbst geschriebene
Funktion:
Public Function GetRFCDate(strDate, strTime)
'*** Datum nach RFC #822: Tue, 04 Jan 2005 04:00:00 GMT
'Wochentag in Kurzform ermitteln
strWeekDayName = WeekDayName(WeekDay(strDate),true)
'Tageszahl ermitteln und auf zwei Ziffern auffüllen
strDay = Day(strDate)
if len(strDay) = 1 then strDay = "0" & strDay
'Monat und Jahr ermitteln
strMonthName = MonthName(Month(strDate),true)
strYear = Year(strDate)
'Vorläufigen Rückgabewert festlegen
GetRFCDate = strWeekDayName & ", " & strDay & " " & strMonthName & " " & strYear
'---Wenn ein Zeit-String übergeben wurde...
'Stunden, Minuten und Sekunden ermitteln
if len(strTime) > 0 then
strHour = Hour(strTime)
if len(strHour) = 1 then strHour = "0" & strHour
strMinute = Minute(strTime)
if len(strMinute) = 1 then strMinute = "0" & strMinute
strSecond = Second(strTime)
if len(strSecond) = 1 then strSecond = "0" & strSecond
GetRFCDate = GetRFCDate & " " & strHour & ":" & strMinute & ":" & strSecond
else
GetRFCDate = GetRFCDate & " " & "00:00:00"
end if
'Plus 2 Stunden für deutsche Zeit
GetRFCDate = GetRFCDate & " +0200"
End Function
Wichtig ist bei der Generierung eines Datums nach RFC 822, dass das Format
des Wochentags englisch ist, d.h. dass die Kurzform z.B. des Tages Freitag "FRI"
lautet. Setzt man aber einen deutschen Internet Information Server ein, so
ergibt die Funktionen WeekDayName die deutsche Kurzform des Wochentags und nicht
die englische. Nun könnte man dieses Problem mit einem select-Statement
abhandeln, aber sinnvoller ist, den VBScript-Code im amerikanischem
Gebietsschema ablaufen zu lassen. Hierzu muss man lediglich den Language-Descriptor in der
ersten Zeile der ASP-Seite um das LCID-Attribut ergänzen und mit dem
amerikanischen Ländercode 1033 versehen (deutsch=1031):
<% @ Language="VBScript" LCID=1033 %>
Da wir hier, wie oben erwähnt ja keinen HTML-Stream, sondern XML ausgeben,
ist es wichtig, das über den ContentType des Dokuments auch festzulegen. Dies
geschieht in der zweiten Zeile über:
<% Response.ContentType="text/xml" %>
In der dritten Zeile wird festgelegt, dass das Dokument ein XML 1.0 Dokument
ist und die enthaltenen Informationen in deutscher Sprache (encoding) vorliegen,
damit das Dokument trotz Umlaute gültig ist:
<?xml version="1.0" encoding="iso-8859-1"?>
Da die fertige ASP-Seite gültiges XML im RSS-Format liefert, kann ein
Benutzer
die URL der Seite direkt in seinen RSS-Reader einbinden, um den RSS-Feed zu
lesen.
Hinweis
Benutzern des Browsers Firefox können Sie über die Einbindung eines
speziellen link-Tags mitteilen, dass Ihr Web über einen RSS-Feed verfügt.
In der Statuszeile blendet der Gecko-Browser dann ein kleines RSS-Icon ein, über
das Sie den RSS-Feed abonnieren können. Das Tag sieht für den zerbit.de-Feed wie folgt aus:
<link rel="alternate" type="application/xml+rss"
title=""zerbit.de - RSS-Feed"
href="http://www.zerbit.de/extras/rssfeed.asp">