Anzeige
Tutorialbeschreibung

PHP - Teil 39 - XML (Teil 4): Eigene RSS-Feeds anbieten

PHP - Teil 39 - XML (Teil 4): Eigene RSS-Feeds anbieten

RSS-Feeds stellen das ideale Mittel dar, um Inhalte unkompliziert zu verbreiten. Denn RSS-Feeds können von Newsreadern gelesen werden. Abonniert einer eurer Seitenbesucher euren RSS-Feed, kann er anschließend immer die von euch bereitgestellten Informationen nutzen. Interessant ist das natürlich in erster Linie für Webseiten, auf denen sich Inhalte häufig ändern. In diesem Video-Training geht es nun allerdings nicht darum, was RSS-Feeds sind und wie man sie nutzt. Vielmehr wird hier gezeigt, wie ihr mittels PHP euren eigenen RSS-Feed anbieten könnt.

Icon-Ersteller: Oxygen-Team

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Ziel dieses Tutorials ist es, via PHP einen eigenen RSS-Feed zu erstellen. Als Basis dient dabei die DOM-Erweiterung, die standardmäßig bei PHP aktiviert ist. Auch das lässt sich wieder über phpinfo() ermitteln.

Bilder



Zunächst muss der Kopfbereich des RSS-Feeds definiert werden. Die Syntax sieht folgendermaßen aus.

$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);


Hier lohnt in jedem Fall ein Blick auf die einzelnen Elemente.

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


Dadurch werden in die XML-Deklaration, die verwendete XML-Version und die gewünschte Zeichenkodierung eingefügt. Im Ergebnisquellcode führt das zu folgender Ausgabe:

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


Damit die Ausgabe "geordnet" erfolgt, sollte formatOutput auf true gesetzt werden. Dadurch wird die XML-Syntax sortiert und eingerückt im Ergebnisdokument angezeigt. Verzichtet man darauf, wird der Quellcode unsortiert und in einer Zeile ausgegeben. Lesbar ist der dann nur schwer.

$xml->formatOutput = true;


Weiter geht es mit der Definition des ersten Elements des XML-Dokuments. Bei diesem ersten Element handelt es sich um rss. Diesem Element wird das Attribut version mit dem Wert 2.0 zugewiesen. Letztendlich müsst ihr hier die RSS-Version angeben, die ihr im Feed verwenden wollt. (Normalerweise liegt man derzeit mit 2.0 richtig).

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


Das neu erstellte rss-Element wird über appendChild() in das Dokument eingefügt.

$xml->appendChild($roo); 


Laut RSS-Spezifikation muss als Kindelement von rss das Element channel eingefügt werden.

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


Damit steht das Grundgerüst des Feeds. Im nächsten Schritt werden einige allgemeine Metadaten über den Feed angegeben. Dazu gehören der Feed-Titel, die Beschreibung, die verwendete Sprache, der Feed-URL und das Feed-Erstelldatum.

$hea = $xml->createElement('title',utf8_encode('medienwerke.de - Daniel Koch'));
$cha->appendChild($hea);
$hea = $xml->createElement('description',utf8_encode('CMS-Support, 
Bücher, Videotrainings ...')); 
$cha->appendChild($hea);

$hea = $xml->createElement('language',utf8_encode('de')); 
$cha->appendChild($hea);
$hea = $xml->createElement('link',htmlentities('http://www.medienwerke.de/feed/')); 
$cha->appendChild($hea);

$hea = $xml->createElement('lastBuildDate',utf8_encode
(date("Thu, 13 Oct 2011 11:29:07 +0000").'GMT'));
$cha->appendChild($hea);


Dabei dürften die einzelnen Elemente selbsterklärend sein. Eine genauere Betrachtung verdient aber sicherlich folgende Zeile:

$hea = $xml->createElement('link',htmlentities('http://www.medienwerke.de/feed/')); 


Hierüber gibt man die Feed-Adresse an. Interessant ist dort htmlentities(). Darüber werden mögliche Probleme mit Sonderzeichen verhindert, die im URL des Feeds auftauchen könnten.

Der Feed muss nun natürlich noch als XML-Datei abgespeichert werden.

$xml->save('rss.xml');


 
Ruft man diese Datei im Browser auf, ergibt sich folgendes Bild:

Bilder



Auch wenn diese Ansicht noch nicht sonderlich spektakulär erscheint, handelt es sich doch um einen echten RSS-Feed.

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>medienwerke.de - Daniel Koch</title>
<description>CMS-Support, Bücher, Videotrainings ...</description>
<language>de</language>
<link>http://www.medienwerke.de/feed/</link>
<lastBuildDate>CEST02000000, 13 +02002011-10-20T14:50:23+02:0031 2011 11:29:07 +0000GMT</lastBuildDate>
</channel>
</rss>


 
Damit steht das Grundgerüst des Feeds. Nun müssen die eigentlichen Inhalte angelegt werden. Werft dafür zunächst einen Blick auf den folgenden Code:

<item>
<title>XML Schema: Die Nachteile von DTDs</title>
<description>XML Schema ist ein neuer Ansatz, um XML-Dokumenttypen ohne Einsatz 
einer DTD zu beschreiben. 
Dabei stellt sich zunächst die Frage, warum es eigentlich eines solch neuen 
Ansatzes bedarf. Denn schließlich 
wurde im vorherigen Kapitel gezeigt, dass sich Dokumenttypen durchaus mit DTDs 
definieren lassen. Es gibt 
also offensichtlich Defizite, die beim Einsatz von DTDs zu Tage [...]</description>
<link>http://www.medienwerke.de/2011/10/10/xml-schema-die-nachteile-von-dtds/</link>
<pubDate>Mon, 10 Oct 2011 18:27:12 +0000</pubDate>
<guid>http://www.medienwerke.de/?p=831</guid>
</item>
<item>
...
</item>
<item>
...
</item>


Die eigentlichen Inhalte des Feeds werden jeweils in einzelnen item-Elementen hinterlegt. Diese Elemente sind wiederum Unterelemente von channel. Erstellt werden sie über die bekannte createElement()-Funktion.

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


Innerhalb der einzelnen item-Elemente werden dann die eigentlichen Feed-Inhalte definiert. Dabei setzt sich ein Inhalt immer mindestens aus folgenden Elementen zusammen:

title – Der Titel des Beitrags.
description – Das ist der eigentliche Beitrag, also der Inhalt.
link – Der Link auf den Beitrag. Auch hier sollte wieder das bereits vorgestellte htmlentities() verwendet werden. Dabei zeigt dieser Link auf die Stelle der Webseite, auf der der vollständige Beitrag steht.
guid – Das ist die eindeutige Identifikationsnummer des Beitrags. Üblicherweise verwendet man hier einen Permalink auf den Beitrag. So können die Aggregatoren den Beitrag eindeutig identifizieren. (Handelt es sich tatsächlich um einen Permalink, sollte dem Element noch permalink="true" als Attribut/Wert zugewiesen werden).
pubDate – Damit die Leser wissen, wann die jeweiligen Beiträge geschrieben wurden, gibt man hierüber das Erstelldatum an. Dabei sollte die Datumsangabe in der Form Mon, 24. Okt. 2011 13:15:34 EST geschrieben werden.

Weitere Angaben sind zunächst einmal nicht nötig. Insgesamt sieht die Definition eines Beitrags innerhalb eines RSS-Feeds also folgendermaßen aus:

  $itm = $xml->createElement('item');
  $cha->appendChild($itm);
  $dat = $xml->createElement('title',utf8_encode('XML Schema: Die 
Nachteile von DTDs')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('description',utf8_encode('XML Schema 
ist ein neuer Ansatz, um XML-Dokumenttypen ohne Einsatz
einer DTD zu beschreiben. Dabei stellt sich zunächst die Frage, 
warum es eigentlich eines solch neuen Ansatzes bedarf. 
Denn schließlich wurde im vorherigen Kapitel gezeigt, dass sich 
Dokumenttypen durchaus mit DTDs definieren lassen. Es gibt 
also offensichtlich Defizite, die beim Einsatz von DTDs zu Tage [...]')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('link',htmlentities('http://www.medienwerke.de/2011/10/10/
xml-schema-die-nachteile-von-dtds/'));
  $itm->appendChild($dat);
  $dat = $xml->createElement('pubDate',utf8_encode('Mon, 10 Oct 2011 18:27:12 +0000')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('guid',htmlentities('http://www.medienwerke.de/?p=831'));
  $itm->appendChild($dat);


Ihr könnt beliebig viele item-Elemente einfügen. Insgesamt könnte die Syntax folgendermaßen aussehen:

<?php
  $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);
  $hea = $xml->createElement('title',utf8_encode('medienwerkede Daniel Koch')); 
  $cha->appendChild($hea);
  $hea = $xml->createElement('description',utf8_encode('CMS-Support, 
  B&uuml;cher, Videotrainings ...'));
  $cha->appendChild($hea);
  $hea = $xml->createElement('language',utf8_encode('de')); 
  $cha->appendChild($hea);
  $hea = $xml->createElement('link',htmlentities
  ('http://www.medienwerke.de/feed/'));
  $cha->appendChild($hea);
  $hea = $xml->createElement('lastBuildDate',utf8_encode(date
  ("Thu, 13 Oct 2011 11:29:07 +0000").'GMT'));
  $cha->appendChild($hea);
  $itm = $xml->createElement('item');
  $cha->appendChild($itm);
  $dat = $xml->createElement('title',utf8_encode('XML Schema: Die Nachteile von DTDs')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('description',utf8_encode('XML Schema ist ein 
  neuer Ansatz, um XML-Dokumenttypen ohne Einsatz einer DTD zu beschreiben. 
  Dabei stellt sich zunächst die Frage, warum es eigentlich eines solch 
  neuen Ansatzes bedarf. Denn schließlich wurde im vorherigen Kapitel gezeigt, 
  dass sich Dokumenttypen durchaus mit DTDs definieren lassen. Es gibt also 
  offensichtlich Defizite, die beim Einsatz von DTDs zu Tage [...]')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('link',htmlentities('http://www.medienwerke.de/2011/
  10/10/xml-schema-die-nachteile-von-dtds/'));
  $itm->appendChild($dat);
  $dat = $xml->createElement('pubDate',utf8_encode('Mon, 10 Oct 2011 18:27:12 +0000')); 
  $itm->appendChild($dat);
  $dat = $xml->createElement('guid',htmlentities('http://www.medienwerke.de/?p=831')); 
  $itm->appendChild($dat);
  $xml->save('feed.xml');
?>


 
Das Ergebnisdokument sähe in diesem Fall folgendermaßen aus:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>medienwerke.de - Daniel Koch</title>
<description>CMS-Support, Bücher, Videotrainings ...</description>
<language>de</language>
<link>http://www.medienwerke.de/feed/</link>
<lastBuildDate>CEST02000000, 13 +02002011-10-20T14:50:23+02:0031 
2011 11:29:07 +0000GMT</lastBuildDate>
<item>
<title>XML Schema: Die Nachteile von DTDs</title>
<description>XML Schema ist ein neuer Ansatz, um XML-Dokumenttypen ohne Einsatz 
einer DTD zu beschreiben. 
Dabei stellt sich zunächst die Frage, warum es eigentlich eines solch 
neuen Ansatzes bedarf. Denn schließlich 
wurde im vorherigen Kapitel gezeigt, dass sich Dokumenttypen durchaus mit 
DTDs definieren lassen. Es gibt also offensichtlich Defizite, die beim 
Einsatz von DTDs zu Tage [...]</description>
<link>http://www.medienwerke.de/2011/10/10/xml-schema-die-nachteile-von-dtds/</link>
<pubDate>Mon, 10 Oct 2011 18:27:12 +0000</pubDate>
<guid>http://www.medienwerke.de/?p=831</guid>
</item>
</channel>
</rss>


 
Ruft man diese XML-Datei im Browser auf, sollte dieser erkennen, dass es sich dabei um ein RSS-Feed handelt.

Bilder



 
Leider machen das nicht alle Browser so vorbildlich wie beispielsweise der Firefox oder der Internet Explorer.

Bilder



 
Google Chrome zeigt beispielsweise ausschließlich die XML-Syntax an:

Bilder



 
Umgehen lässt sich das Problem hier durch Nachrüsten der Erweiterung RSS-Abonnoment, die ihr hier herunterladen könnt: https://chrome.google.com/webstore/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd. Nach erfolgreicher Installation könnt ihr auch im Chrome RSS-Feeds komfortabel lesen und verwalten.

Wenn ihr innerhalb eurer Webseite auf den RSS-Feed verweisen wollt, gibt es zwei Möglichkeiten. Zunächst einmal kann man natürlich einen Hyperlink auf die XML-Datei setzen.

<a href="feed.xml" title="medienwerke.de - RSS-Feed" rel="alternate" 
type="application/rss+xml">RSS-Feed abonnieren</a>


Alternativ dazu kann man auch innerhalb des head-Bereichs der Seite ein link-Element einfügen.

<link rel="alternate" type="application/rss+xml" title="News-Feed" 
href="http://www.medienwerke.de/feed">


Moderne Browser erkennen automatisch, dass es sich um ein Feed handelt und zeigen ein entsprechendes Symbol an, über das man den Feed abonnieren kann.

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 14.05.2017 - 02:55

Vielen Dank!

Portrait von mario_P
  • 07.10.2016 - 13:06

Danke tolles Video !

Portrait von dmtw2107
  • 16.11.2013 - 09:50

verständlich und toll erklärt danke für das tutorial

x
×
×