Tim Tepaße: Wo ist das Bild im RSS?

Beitrag lesen

Hallo,

http://focus.msn.de/fol/XML/rss_folnews.xml

Hast Du Dir auch mal den tatsächlichen Inhalt dieses Feeds angeschaut?

$image = $item['image'];

Es gibt kein Kindelement von <item> namens <image>. Tatsächlich ist dies in der RSS 2.0 Spezifikation überhaupt nicht vorgesehen; es sei denn mit einer Erweiterung.

So nun aber ein kleines Problem ich bekomme die Bilder nicht mit. Kann mir jemand sagen warum das NICHT geht? Denn hier auf der Seite http://timeshot.de/news.php werden die Bilder auch mit ausgegeben und die verwenden den gleichen RSS Feed.

Guck Dir noch mal den Quellcode des RSS-Feeds an, hier mal rauskopiert ein Beispiel eines Eintrages da drin:

<item>  
  <title>VW-Aff&#228;re - Der tiefe Fall des Peter H.</title>  
  <link>http://focus.msn.de/hps/fol/redirect/redirect.htm?r_u=http%3A%2F%2Ffocus.msn.de%2Ffinanzen%2Fgeldanlage%2FVW-Affaere_nid_28590.html&amp;r_si=3118&amp;r_re=4002&amp;r_ru=1&amp;r_st=100&amp;r_pa=263667&amp;r_ti=Der+tiefe+Fall+des+Peter+H.</link>  
  <description>Ex-Personalvorstand Hartz drohen ein peinlicher Prozess und  
      wom&#246;glich gar eine Gef&#228;ngnisstrafe.</description>  
  <content:encoded><![CDATA[<table align="LEFT" valign="top"  
      width="90"><tr><td><IMG WIDTH="75" HEIGHT="75" ALT="VW-Affäre FOCUS"  
      SRC="http://focus.msn.de/fol/XML/images/75x75_20060506_103629_HBpsPYrz.jpg"></IMG></td></tr></table>  
      Ex-Personalvorstand Hartz drohen ein peinlicher Prozess und wom&#246;glich  
      gar eine Gef&#228;ngnisstrafe.]]></content:encoded>  
  <pubDate>Sat, 06 May 2006 10:55:00 GMT</pubDate>  
  <category>Finanzen Geldanlage</category>  
</item>

Wenn Du genau hinsiehst befindet sich dort dieselbe Information – die Beschreibung des Elementes – zweimal da drin, einmal in dem zu RSS 2.0 gehörenden description-Element, zum anderen in dem Element content:encoded, einem RSS 1.0 Modul, das auch gerne in RSS 2.0 eingesetzt wird. Letzteres hat „reichhaltigeren“ Inhalt, genauer das von Dir gesuchte Bild als HTML-Quellcode in einer vollkommen unnötigen Tabelle.

Warum macht man so etwas? Das bezeichnet eines der Probleme mit RSS.

Ursprünglich ist als Inhalt von <description> nur ein rein textuelle Beschreibung vorgesehen gewesen. Reiner Text. Kein (X)HTML. Aber die Leute wollten auch den reichhaltigere (X)HTML Inhalt ihrer Webseite mit RSS übermitteln, weil sie fanden, dass das wichtig sei, dass ihre fettgedruckten Wörter auch fett dargestellt werden. Man kann aber nicht einfach Elemente aus anderen XML- oder SGML-Syntaxen (hier HTML) so in ein anderen XML (hier RSS) reinkopieren, das würde das letztere ungültig machen, ein Parser könnte davon und Schluckauf kriegen, weil er das für ihn fremde Zeugs einfach nicht kennt. Also muss man es maskieren. Da gibt es zwei Varianten, zum einen alle XML-kritischen Zeichen in seinem Text durch Entities ersetzen, "<b>" wird dann also zu "&lt;b>" oder für sehr gründliche zu "&lt;b&gt;". Oder man schließt es in CDATA-Abschnitte ein, Markup das darin vorkommt, wird vom XML-Parser nicht interpretiert.

Jetzt versetze Dich mal in die Lage eines RSS Parser. Du kommst an einem description-Element vorbei. Für die Ausgabe wüsstest Du gerne ob Du nur Text oder HTML-Inhalt hättest. Du weisst es nicht. Du bist ja nur ein dummes Programm, dass ein paar Bytes bekommt. Und diese paar Bytes sind dann entweder nur reiner Textinhalt oder aber eben HTML. Hat man als Ausgabemöglichkeit eine HTML-Seite ist das nicht so schlimm; in einem Desktop-RSS-Reader will man aber nicht komische HTML-Tags lesen, nur weil dort nur Test angezeigt wird. Und man hat keine Möglichkeit es zu wissen. Doof das.

Als RSS 2.0 noch relativ neu und hip war, borgte man sich dann gerne das Element content:encoded aus dem nicht mit RSS 2.0 kompatiblen Dialekt RSS 1.0 aus, aus einem RSS 1.0 Modul; schließlich war die Neuerung von RSS 2.0 ja, dass man beliebige eigene Elemente aus anderen XML Namensräumen einfügen durfte. content:encoded sagt über seinen Inhalt verpflichtend: Der ist immer maskiert. Als dummer RSS Parser weiss man also immer: hier ist maskiertes HTML.

Damals hat sich dann diese Praxis der Duplikation für Feed-Anbieter heraus gebildet:

• Das description-Element enthält nur den reinen Textinhalt eines Eintrages
content:encoded enthält den reichhaltigeren HTML-Inhalt eines Eintrages

... und RSS-Parser können sich dann den passenden Inhalt herausfischen. Bei dieser Praxis ist dann auch der Anbieter dieses Feeds stehen geblieben.

Ich sage „stehen geblieben“ deswegen, weil es inzwischen eine Revision der RSS 2.0 Spezifikation gab, die sagt, dass das description-Element auch explizit maskiertes HTML enthalten darf. Als RSS Parser weiss man also nicht genau, was der Inhalt des Elementes nun ist. Und auch Raten ist da eher ungünstig.

Aber ich schweife ab.

Du hast schon gemerkt: Dein Bild befindet sich als maskierter HTML-Quellcode im Element content:encoded und der andere Feed, den Du als Vergleich genommen hast, grapscht nun einfach das HTML daraus und bindet das so in seine Seite ein. Das könntest Du natürlich auch machen, in dem von Dir verwendeten Magpie RSS Parser sähe das dann so aus:

$content = $item[content][encoded];

(Hier Grummeln über offenkundiges Missverständnis von XML Namensräumen auf Magpies Seiten einfügen)

Wenn Dir der HTML Quellcode aber in der Ausgabe nicht passt – mir würde das nicht – dann bleibt Dir wohl nichts anderes übrig als bei diesem speziellen Feeds die HTML-Quellcodeschnipsel nach der URI des Bildes zu parsen. Stressig.

$datum = $item[dc][date];

Übrigens: Der von Dir oben angebene Feed enthält seine Zeitpunktsangaben nicht im Element dc:date aus dem RSS 1.0 Modul Dublin Core sondern in dem in RSS 2.0 eingebautem Element <pubDate>, also wäre ein $item[pubDate] erfolgreicher.

Tim