XML/RSS/RDF-Parser
depp
- sonstiges
moin
hab mir nun nen parser gebastelt, der bei http://www.phpclasses.org/browse.html/latest/latest.xml bestens funktioniert.
auch mit dem ergebnis des rss tutorials auf http://www.mnot.net/rss/tutorial/ klappts einwandfrei.
ABER z.b. mit http://www.tagesschau.de/newsticker.rdf kommt gar kein ergebnis zustande.
könnt Ihr mir sagen, was der unterschied zwischen denen ist??
oder sind euch möglich fehlerquellen bekannt?
vielen dank für eure hilfe...
Hallo »Depp«,
könnt Ihr mir sagen, was der unterschied zwischen denen ist??
oder sind euch möglich fehlerquellen bekannt?
Es gibt lauter verschiedene Formate, die sich dummerweise alle gleich
RSS nennen. Am besten erklärt man das, wenn man die Geschichte von RSS
nacherzählt:
Es begann mit der Firma Netscape. Diese entwickelte für ihr Portal MyNetscape
so ziemlich das erste RSS, ein XML-Format, mit dem man Neuigkeitenschnipsel
aus den unterschiedlichsten auf einer zentralen Seite zusammenfassen konnte.
Diese RSS-Version ist RSS 0.9. Technisch basierte das auf dem damals in
Entwicklung befindlichen RDF-Standard, dementsprechend steht RSS für diese
Version für »RDF Site Summary«. Das ist das Format von Tagesschau.de
Erkennbar ist das an dem Namensraum, der oben im Rootelement definiert wird
und als eindeutige URL die Netscape-URL nimmt:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/">
Auftritt der Firma Userland von Dave Winer. Userland hatte ein ähnliches
Format für einen ähnlichen Zweck in der Mache, dann sind sie auf RSS
umgeschwenkt. Und damit geriet die Weiterentwicklung in die Hände der Firma
Userland, Netscape gerät hiermit auf dem Blickfeld. Dave Winer entwickelte
nun nacheinander die RSS-Standards RSS 0.91, 0.92, 0.93, 0.94; die beiden
letzteren waren aber nur experimentelle Versionen, trotzdem werden sie
benutzt.
Diese sind nicht mit RSS 0.9 kompatibel. Der Grund liegt darin, daß hier
auf das kompliziertere RDF-Modell verzichtet wurde, das Ziel lag mehr
darin, ein ziemlich einfaches XML-Format definieren, daß man leicht
erlernen kann, wenn man sich einfach nur den Quellcode anguckt, ähnlich,
wie viele Leute HTML gelernt haben. Das KISS-Prinzip. Manche sagen, es
wurde zu wenig spezifiziert. Wie auch immer. Konsequenterweise steht hier
RSS für »Rich Site Summary«. Diese RSS-Versionen erkennt man auf die
Schnelle an diesem Rootelement und dessen Versionsattribut:
<rss version="0.91">
Auftritt einer neuen Gruppe irgendwo zwischen Privatleuten, dem W3C und
des Computerbuchverlages O'Reilly. Diese fand Dave Winers Version zu
unterspezifiziert, fanden das RDF-Modell besser und schöner und hatten ein
Bedürfnis nach mehr. Diese entwickelten dann einen neuen RSS-Dialekt, den
sie RSS 1.0 nannten und empfanden diesen als legitime Weiterentwicklung
des alten RSS 1.0. Die wichtigste Neuerung sind hier die sogenannten
Namensräume, das heißt, man hat wie in XML üblich hier die Möglichkeit
neue Elemente einzubinden, wenn man denn meint, daß man sie braucht. RSS 1.0
ist sehr schlank ausgelegt, alles andere spielt sich in Namensräumen ab.
Für mehr siehe hier: http://web.resource.org/rss/1.0/
Hier steht RSS konsequenterweise wieder für »RDF Site Summary«. Die RSS-Feeds,
die Du parsen kannst, gehören dieser Kategorie an, man erkennt sie auf dem
ersten Blick an der URL http://purl.org/rss/1.0/ in der Namensraumdeklaration:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/">
(Mit dem Namensraum dc werden hier Elemente aus dem Dublin Core Metadaten
Standard eingebunden)
Nun kommt wieder Dave Winer ins Spiel. Zu dem Zeitpunkt gab es zwei konkurrierende
RSS-Formate, RSS 0.9x und RSS 1.0. Wegen der manchmal etwas schwierigen
Art von Dave, war er nicht an der Entwicklung von RSS 1.0 beteiligt. In
etwa sah er ein Format, das zwar sehr viel mehr bot als das »simple« RSS 0.9x,
aber auch wegen des RDF-Modells schwieriger zu erlernen war. Aber trotzdem
wechselten viele auf RSS 1.0, eine »1.0« klingt halt sympatischer als eine
»0.9x«. Sein nächster Standard war dann RSS 2.0, in etwa ein etwas erweitertes
RSS 0.9x, in dem nun auch Namensräume erlaubt waren. Also in etwa das gleiche.
Tja. Die Verwirrung war groß. Schon allein, weil RSS hier für »Really
Simple Syndication« steht. Auf dem ersten Blick erkennt man RSS 2.0 wieder
am Rootelement:
<rss version="2.0">
Die »Spezifikation« dafür liegt hier: http://blogs.law.harvard.edu/tech/rss
Ich schreibe Spezifikation in Anführungsstrichen, weil es dann doch etwas
unterspezifiziert ist. Es gibt Doppeldeutigkeiten, Dinge, die nicht bis
ins letzte i-Tüpfelchen spezifiziert sind, all sowas eben. Die meiste
Zeit und für die meisten Zwecke bemerkt man es nicht mal. Aber manchmal
stolpert man doch etwas darüber. Und es sind einige darüber gestolpert.
Weswegen hier eine neue Gruppe ins Spiel kommt, eine Menge von unzufriedenen
Entwicklern, die sich daran setzten, einen neues Format zu spezifizieren,
diesmal so wasserdicht und ausgeklügelt wie möglich. Das ist jetzt bald
anderthalb Jahre her und sie sind immer noch dabei. Gerechterweise muß
man sagen, daß sie einen härteren und langsamen Weg gewählt haben, sie
wollen ihren Standard durch die IETF standardisieren lassen. Die IETF ist
so in etwa das Standardisierungsgremium des Internets, Mail, News, SSH
und vieles anderes wurde dort spezifiziert. In etwa wird das dann etwas
mehr »offizieller« als nur ein im Web rumfliegendes Dokument.
Gottseidank haben sie - um sich von dem ganzen Durcheinander abzusetzen -
einen neuen Namen gewählt: Atom. Und nein, diesmal steht das für nix,
Akronyme sind out. ;o) Auch wenn sich das ganze immer noch im Prozess der
Standardisierung befindet - Atom wird bereits benutzt. Der vorläufige
Standard dafür liegt hier: http://www.atomenabled.org/developers/syndication/atom-format-spec.php
Um es zusammenzufassen: Wenn man einen Parser für RSS und ähnliche Formate
schreiben will, muß man sich mit lauter unterschiedlichen, untereinander
nicht kompatiblen Spezifikationen befassen, wenn man es noch viel richtiger
machen will, muß man sich durch viele Diskussionen in vielen unterschiedlichen
Weblogeinträgen quälen, auf der Suche nach versteckten Hinweisen und man
darf sich von dem ganzen Durcheinander nicht panisch machen lassen. ;)
(Für mehr Auflistung von Inkompabilitäten siehe http://diveintomark.org/archives/2004/02/04/incompatible-rss
Und es gibt viele, die das schon getan haben. Ein Beispiel für einen
universellen Parser ist der »Universal Feed Parser« von Mark Pilgrim,
programmiert in Python. Mark Pilgrim ist einer der Korinthenkacker, der
RSS immer kritisch begleitet haben, der sich sehr häßliche Gefechte mit
Dave Winer geliefert hat und dann Atom mit ins Leben gerufen hat. Aufgrund
viele kleiner korinthenkackenden Einträge in seinem Weblog, kann man mit
sehr großer Sicherheit davon ausgehen, daß er weiß, was er macht und ziemlich
viel beachtet hat. Sein Parser parst RSS von 0.9 bis 2.0 und Atom in den
unterschiedlichsten Textkodierungen, unter den unterschiedlichsten Umständen
aus dem Web gefischt: http://feedparser.org/
Aber es gibt auch andere solche Projekte, einfach mal bei PEAR oder CPAN
gucken. Das letzte Projekt, das mir aufgefallen ist, ist ein bei Sun
entwickelter Feed Parser in Java: https://rome.dev.java.net/
Oder Du machst Dir ganz viel Arbeit und schreibst etwas eigenes. ;o)
Tim
Hallo Tim,
möchte nur mal kurz sagen: vielen Dank für den tollen Text!
Gruß,
_Dirk
P.S.: damit hast du die Erwartungen an einen Feature-Artikel zu diesem Thema allerdings weiter verstärkt, das weißt du? :-)