XML RSS Feed mit PHP und DOM erstellen

» Mit der Programmiersprache PHP hat man ein mächtiges Werkzeug in der Hand, dass alle nötigen Werkzeuge mitbringt um valide XML RSS Feeds zu erstellen. «

Um mit PHP einen validen XML RSS Feed zu erstellen gibt es mehrere Möglichkeiten. Eine einfache und effektive Methode ist die Nutzung der DOM Funktion von PHP. Doch starten wir am besten gleich einmal durch ...
Der Kopfbereich:­

Jeder RSS Feed besitzt einen Kopfbereich mit gewissen Grundangaben, an Hand derer Webbrowser oder Feedreader erkennen können, dass es sich bei der vorliegenden Datei/ Seite um einen RSS Feed handelt.

    $xml = new DOMDocument('1.0', 'UTF-8');
    $xml->formatOutput = true;

    $roo = $xml->createElement('rss');
    $roo->setAttribute('version', '2.0');
    $xml->appendChild($roo);

    $cha = $xml->createElement('channel');
    $roo->appendChild($cha); 
 
Das sieht im ersten Moment komplizierter aus als es wirklich ist. Daher dazu ein paar kurze Anmerkungen.

    $xml = new DOMDocument('1.0', 'UTF-8');

Mit dem Befehl erstellen wir ein neues DOM Dokument, das die Basis unseres RSS Feeds darstellt. Die zusätzliche Angabe '1.0' ist derzeitiger Standard und sollte so übernommen werden. Bei der zweiten Angabe 'UTF-8' handelt es sich um die Kodierung des verwendeten Zeichensatzes unseres Feeds. Es gibt einige verschiedene Kodierungen die man hier nutzen könnte, jedoch setzt sich UTF-8 zur Zeit als quasi Standard durch, da er weitaus mehr Zeichen unterstützt als die älteren "ISO"-Versionen. $xml ist eine Variable, die beliebig heissen kann, wer möchte kann es also auch '$ichbintoll' oder wie auch immer benennen.

Als Ergebnis dieser Codezeile erhalten wir folgendes:

    <?xml version="1.0" encoding="UTF-8"?>



Mit dem folgendem Befehl:
      $xml->formatOutput = true;

... sagen wir dem Computer das er unseren RSS Feed formatieren soll. Das sieht dann so aus wie man es von den normalen Feeds kennt, in einer hirarchischen Baumstruktur. Ohne diesen Befehl würde der Feed in eine Zeile ohne Absätze erstellt werden. Das ist zwar nun nicht zwingend notwendig, doch es sieht besser und professioneller aus.

Nun erstellen wir das allererste Kind-Element (child) unseres neuen DOM Dokuments. Die Spezifikation für valide RSS Feeds sieht hierbei simplerweise den tag <rss> vor.

Dazu benötigen wir folgende Befehle:

    $roo = $xml->createElement('rss');
    $roo->setAttribute('version', '2.0');
    $xml->appendChild($roo);

$roo ist hierbei wiederum ein freiwählbarer Variablenname. In diesem Beispiel habe ich die Variable $roo benannt um einerseits bei drei Zeichen zu bleiben (hat keinen tieferen Sinn und im Endeffekt nur da ich zum einen "schreibfaul" bin und zum anderen hat unser Hauptdokument nun auch schon drei Zeichen ($xml)). $roo ist abgeleitet von root (übersetzt: Wurzel oder auch Basis), da dieser tag (<rss>) der erste und allumschliessende ist.

In der ersten Zeile erstellen wir also unser Kind/ Element <rss> und '$xml->...' besagt lediglich, dass wir das neue Element für unser derzeit aktuelles DOM Dokument kreieren.

In der nächsten Zeile weisen wir unserem neuem Element (<rss>) ein Attribut zu, was auch gleichzeitig die Version unseres RSS Feeds festlegt. Wer einen RSS Feed Version '1' erstellen möchte, muß hierbei anstatt '2.0' dann '0.91' eintragen (so die offizielle Versionsnummer). Ansonsten wie in unserem Beispiel oben für die RSS Feed Version 2.0.

Die letze Codezeile sorgt nun dafür das unser neues Kind/ Element dem DOM Dokument hinzugefügt wird. '$xml->appendChild($roo);' könnte man also übersetzen mit: 'Zu unserem DOM Dokument ($xml) füge das eben erstellte Kind ($roo) hinzu.'. Wenn man diese Zeile vergisst, hat man ein Problem. In der ersten Zeile wird das neue Element vorerst nur "virtuell" erstellt, jedoch erst durch das Hinzufügen tatsächlich aktiviert.

Jetzt haben wir etwas in dieser Art:

    <?xml version="1.0" encoding="UTF-8"?>
        <rss version="2.0">
        </rss> 


Um eine valide Basis für unseren RSS Feed zu erhalten müßen nun noch ein weiteres Element (Kind) hinzufügen und zwar den gem. Spezifikation vorgegebenen <channel>:

    $cha = $xml->createElement('channel');
    $roo->appendChild($cha); 

Wie vorher schon angesprochen ist $cha wieder ein freiwählbarer Variablenname (in diesem Beispiel wieder drei Zeichen und abgeleitet von "channel"). Die Befehlszeile mit dem erstellen eines Elementes kennen wir ja nun sowie auch das Hinzufügen des neuen Elementes (child). Einziger kleiner Unterschied ist, das wir unser neues Element <channel> nun als child (Kind)
von $roo ('root'(<rss>)) hinzufügen und nicht wie vorher zum DOM Dokument ($xml).
Das Ganze sieht dann so aus:
    <?xml version="1.0" encoding="UTF-8"?>

        <rss version="2.0">
            <channel>
            </channel>

        </rss> 

Damit steht unser Grundgerüst. Jetzt wollen wir natürlich auch das Ganze ein wenig mit Leben (Inhalt) erfüllen. Als ersten Step legen wir einige Elemente an, die den eigentlich Feed beschreiben, dazu benutzen wir die folgenden Codezeilen:

    $hea = $xml->createElement('title',
        utf8_encode('Name des RSS Feed'));
    $cha->appendChild($hea);


      $hea = $xml->createElement('description',
        utf8_encode('Feed Beschreibung'));
    $cha->appendChild($hea);


      $hea = $xml->createElement('language',
        utf8_encode('de'));
    $cha->appendChild($hea);


      $hea = $xml->createElement('link',
        htmlentities('http://xml-rss.de'));
    $cha->appendChild($hea);


      $hea = $xml->createElement('lastBuildDate',
        utf8_encode(date("D, j M Y H:i:s ").'GMT'));
    $cha->appendChild($hea);

Die grundsätzlichen Befehle sind ja mittlerweile bekannt. Immer erst ein neues Element "create" (erstellen) und anschliessend das Element "append" (hinzufügen) zu dem übergeordneten Element, hier ist es das <channel>-Element.

In dem ersten Schritt legen wir den Namen unseres RSS Feeds fest. Hierbei ist zu beachten, das 'title' festgelegt ist und Bestandteil der Spezifikation ist, der folgende Part: utf8_encode('Name des RSS Feed') besagt das der Name (title) des Feeds UTF8 kodiert werden soll dafür sorgt der PHP-Befehl utf8_encode() ( Dekodieren kann man übrigends mit dem Befehl uft8_decode(); ).

Wo jetzt 'Name des RSS Feed' steht ist der Platz wo man dann seine eigene Bezeichnung einfügt. Das Ganze kann man natürlich auch dynamisch gestalten mit Variablen, wer z.B. die Variable $feedname nutzen will muß die Codezeile umschreiben auf:

    $hea = $xml->createElement('title', utf8_encode($feedname));

$hea ist wieder eine freiwählbare Variable, in diesem Beispiel ist sie angelehnt an das Wort 'head' (Kopf), da diese Codezeilen im Endeffekt den Kopfbereich unseres RSS Feeds ausmachen.

Im nächsten Codeblock beschreiben ('description') wir kurz den Inhalt unseres Feeds, 'description' ist hierbei wieder festgelegt und 'Feed Beschreibung' ist der Bereich wo wir uns frei auslassen können.
Nachfolgend geben wir eine Auskunft zur Sprache ('language') des Feeds, üblicherweise in Deutsch ('de'), wer einen englischen Feed erstellt muss hier natürlich 'de' gegen 'en' austauschen.

Nun verweisen wir auf unsere eigentliche website, woher der Feed stammt. Dafür gibt es das Element 'link'. Links kodieren wir nicht in uft8 sondern mit 'htmlentities', daher ist dort der PHP-Befehl htmlentities(); dieser sorgt dafür das der Feed valide bleibt und wir keine Probleme mit eventuellen Sonderzeichen (z.B.: '&', etc...) im Link bekommen.

Der letze Codeblock fügt das Element 'lastBuildDate' hinzu. Dieses ist zwar nicht zwingend notwendig doch gehört im Internet "zum guten Ton", anhand dieses Elementes kann man erkennen wann der Feed erstellt wurde. Der PHP-Befehl: date("D, j M Y H:i:s ").'GMT' spuckt das aktuelle Datum aus und zwar in einer Form, die gem. XML RSS Standard vorgegeben ist, das sieht ungefähr so aus:

Sat, 1. Jan 2000 00:00:00 GMT

Alles zusammen würde unser Feed so aussehen ...
Darstellung eines RSS Feed im Firefox
Wie man sieht ist unser Feed (Darstellung im Firefox Browser) noch nicht wirklich spektakulär, aber man sieht zumindest wo unsere grundsätzlichen Kopfangaben "abgeblieben" sind.
Nun kommen wir zu dem eigentlichen Teil, der einen RSS Feed ausmacht, nämlich die einzelnen Nachrichten.
Bisher haben wir die einzelnen Element zu unserem <channel> ($cha) hinzugefügt, da diese global den gesamten Feed beschreiben, doch nun fügen wir einzelne Nachrichten-Objekte ('items') hinzu, dafür müssen wir zu erst ein 'item'-Element erstellen:

    $itm = $xml->createElement('item');
    $cha->appendChild($itm);

Auch hier sind wieder unsere "alten Bekannten": 'create' & 'append'. Dieses item-Element fügen wir dem channel-Element hinzu. Den Variablenname $itm habe ich praktischerweise von dem Wort 'item' abgeleitet.
Jetzt fügen wir die eigentlichen Bestandteile einer Nachricht ein:

    $dat = $xml->createElement('title',
        utf8_encode('Titel der Nachricht'));
    $itm->appendChild($dat);
 

      $dat = $xml->createElement('description',
        utf8_encode('Die Nachricht an sich'));
    $itm->appendChild($dat);   
 
    $dat = $xml->createElement('link',
        htmlentities('Der Link zur Nachricht'));
    $itm->appendChild($dat);
 
    $dat = $xml->createElement('pubDate',
        utf8_encode('Datum der Nachricht'));
    $itm->appendChild($dat);
 
    $dat = $xml->createElement('guid',
        htmlentities('Einzigartige ID'));
    $itm->appendChild($dat);

$dat ist wieder ein freiwählbarer Variablennamen, hier abgeleitet von 'data' (Daten). Diese Variable taucht nun der einfachhalber öfters auf, da diese bei jedem Erstellen eines neuen Elementes immer wieder überschrieben wird. Worauf hierbei noch zu achten ist, ist das wir diese Elemente alle dem 'item'-Element ($itm) hinzufügen.

Es tauchen wieder "die üblichen Verdächtigen" auf, wie z.B. 'title', 'description', etc... bei dem Codeblock 'link' muss natürlich anstatt 'Der Link zur Nachricht' die Adresse/ Url eingetragen werden, die zu der entsprechenden Nachricht führt. Das Datum der Nachricht muss ebenfalls wieder in dem bekannten Format erstellt werden:

    Sat, 1. Jan 2000 00:00:00 GMT

Der letzte Block definiert das GUID-Element. Das ist die Abkürzung für Globally Unique IDentifier und heisst übersetzt soviel wie 'Globales einmaliges (oder auch einzigartiges) Identifizierungsmerkmal'. Was beim Menschen ein unverkennbares Merkmal wäre (z.B. eine bestimmte Muttermal-Kombination), ist bei Computern und Software der GUID.
Jedoch ist diese Definition bezogen auf RSS Feeds etwas unglücklich gewählt, da gem. RSS Spezifikation das GUID nicht irgendein "einzigartiger" Zahlencode oder ähnliches sein darf, sondern der permanente Link zu der jeweiligen Nachricht. Jetzt fragen sich sicher einige wieso bei GUID ein Link, den wir ja eigentlich schon unter dem 'item' <link> definiert haben... Im Prinzip und in den häufigsten Fällen ist <link> und <guid> tatsächlich identisch, doch es gibt ebenfalls Ausnahmen und zwar, wenn z.B. ein Artikel über mehrere Seiten verteilt ist. Dann ist der Anfang des Artikel (die erste Seite) im <link> zu vermerken und im <guid> z.B. die entsprechende Unterseite, auf die sich der aktuelle Feed-Eintrag bezieht.

Das wars! Wir haben zwar jetzt nur eine Nachricht zu unserem RSS Feed hinzugefügt, doch ab nun wiederholt sich alles einfach nur. Wer eine weitere Nachricht hinzufügen möchte, fängt wieder mit der Erstellung eines 'item'-Elementes an, denn JEDE einzelne Nachricht benötigt gem. der RSS-Spezifikation ein eigenes 'item'-Element.

Nachdem wir unsere Nachrichten eingefügt haben müssen wir den ganzen Feed nur noch abschliessen und speichern, dass geht diesmal ziemlich flott mit dem Befehl:
      $xml->save('dateiname.xml');

$xml sollte klar sein, das ist unser gesamtes DOM Dokument inkl. seiner vielen kleinen 'Kinder' (childs) und der Befehl save(); schreibt das Ganze nun in die Datei: 'dateiname.xml', dieser kann natürlich frei gewählt haben, die Endung '.xml', sollte natürlich beibehalten werden.
Unser fertiger RSS Feed sieht nun so aus ...
Darstellung eines kompletten RSS Feeds im FirefoxHier (Darstellung im Firefox Browser) sieht man nun unsere eingefügte Nachricht, der Titel der Nachricht ist 'anklickbar' und würde zu der Seite führen, die wir als 'link' Adresse vorgegeben haben.
Hier noch die Ansicht im Internet Explorer:
Beispiel eines RSS Feeds im Internet Explorer

Der Quellcode unseres RSS-Feeds sieht dabei so aus:

<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
        <channel>
            <title>Name des RSS Feed</title>
            <description>Feed Beschreibung</description>
            <language>de</language>
            <link>http://xml-rss.de</link>
            <lastBuildDate>Sat, 1 Jan 2000 00:00:00 GMT</lastBuildDate>
            <item>
                <title>Titel der Nachricht</title>
                <description>Die Nachricht an sich</description>
                <guid>http://xml-rss.de/link-zur-nachricht.htm</guid>                                         
                <link>http://xml-rss.de/link-zur-nachricht.htm</link>
                <pubDate>Sat, 1. Jan 2000 00:00:00 GMT</pubDate>
            </item>
        </channel>
    </rss>


..."und valide isser auch noch." Na dann noch viel Spass beim erstellen eigener XML RSS Feeds.
 
Bild einer Zeitung, Zeitschrift als Symbol für Newsletter

Newsletter

Jetzt unseren kostenlosen Newsletter abonnieren und immer aktuell informiert sein.


Ein Bookmark Buch

Bookmark

Diese Seite als Lesezeichen (Bookmark) hinzufügen, bei...

Furl YahooMyWeb Google Bookmark del.icio.us Tausendreporter Webnews yigg it Mister Wong co.mments TailRank Spurl Digg blinkbits BlinkList Reddit connotea
Symbol der RSS Feeds

RSS Feeds

Bleiben Sie auf dem Laufendem mit unseren Informationsfeeds:

[Website-Feeds]: Logo RSS-Feed Version 1.0 Logo RSS-Feed Version 2.0 Logo RSS-Feed Version ATOM


©copyright 2008 by xml-rss.de - all rights reserved
Websolution & Development powered by dmp|cda

    H   A   U   P   T   M   E   N   Ü

KW 51 - Montag, 18. Dezember 2017