RSS-Feed auslesen und ausgeben mit SimpleXML

Alle Blogs sowie viele Webseite bieten einen RSS-Feed an. Diese sind praktisch, da Sie Informationen einfach und schnell als xml-Datei darstellen, die jeder auslesen kann- mit ein wenig php.

Da Feeds immer mehr Beliebtheit erfahren haben ist auch seit php5 SimpleXml integriert mit dem man relativ simpel RSS-Feeds und xml auslesen kann.

Auf meiner Home-Seite ReiffiX.de verwende ich selber Simplexml indem ich meinen eigenen RSS-Feed auslese, die neuen Nachrichten in einer Datenbank speichere und so die neuesten zwei Einträge ausgeben kann.
Sieht so aus:

In diesem Artikel / Tutorial möchte ich zeigen wie einfach auch DU Feeds auslesen, speichern und ausgeben kannst!

So liest man Feeds mit SimpleXMl aus:

Zunächst erstellst du eine php-Datei mit folgendem Inhalt:

1
2
3
4
<!--?php  //XML Feed URL eingabe, hier deinen Feed oder was auch immer du auslesen willst!  
$xmlfile='http://reiffix.de/blog/feed'; /
/erstes SimpleXML- deine URL wird geladen  
$xml = simplexml_load_file(rawurlencode($xmlfile));  ?-->

So einfach wird der Feed eingelesen, nichts weiter, kein open kein abspeichern in einer zusätzlichen Datei, das reicht um den Feed einzulesen.
Jetzt möchte ich den Feed nach dem einlesen natürlich die für mich brauchbaren Teile auslesen. Hierzu nutze ich die Struktur des Feeds. Diese sieht folgendermaßen aus, zunächst nur der Header der Feeds:

1
2
3
4
5
6
//Zunächst der Header, für uns unwichtig (außer die Codierung)
<!--?xml version="1.0" encoding="UTF-8"?--> ReiffiX Blog - Tutorials, Freebies &amp; Wissenswertes aus dem Netz
http://reiffix.de/blog
Sun, 10 Aug 2008 10:25:55 +0000 http://wordpress.org/?v=2.6
// Hier alle  drin (s.unten)
//Item 1, 2 3 usw.

Der Header gibt gewisse Basisdaten durch, die für uns eher unwichtig sind. Die Struktur eines Xml-Dokumentes wird allerdings deutlich. Jeder Tag hat einen Namen und muss mit einem Endtag wieder geschlossen werde. Ausnahmen bilden “leere” Tags wie oben <description/> diese können sofort in einem wieder geschlossen werden. Klingt kompliziert ist aber ganz einfach. Aber soll uns nicht weiter kümmern, wir wollen keine XML-Datei schreiben, nur auslesen.


Bei Feedburner kannst du durch einen Klick auf den Link View Feed XML meinen Feed sehen.

Dazu schauen wir uns jetzt an was zwischen dem Header und dem </channel> Schluss steht und wie die einzelnen Sachen bezeichnet sind.

1
2
3
4
5
6
7
8
9
10
11
12
13
Titel des Blogeintrags, News whatever
http://www.LINK.de/ZUM/BEITRAG
http://www.LINK.de/ZUM/BEITRAG/#comments
Fri, 08 Aug 2008 19:16:26 +0000 admin
<![CDATA[Wordpress]]></category>
<guid isPermaLink="false">http://reiffix.de/blog/?p=103</guid>
<description>
<![CDATA[Hier eine kurze Beschreibung, meist nicht merh als 120 Zeichen welche dann mit 3 Punkten abgekürzt wird [...]]]>
</description>
<content:encoded>
<![CDATA[Hier steht dann der komplette Blogartikel/Newsartikel mit
allen HTML-Tags usw. diese Tags werden voll übernommen, da vorher
<![CDATA[ steht, welches alles hier innen drinnen jeden Tag nicht umwandelt! ]]>

http://DEINLINK./COMMENT/Rss

//hier der zweite Artikel mit gleichen Tags wie oben, nur anderem Inhalt ;-)

Für mich interessant sind also der Titel in <title></title> die Beschreibung innerhalb von <description></description> und der Link zum eigentlichen Haupttitel in <link></link>.
Diese will ich auslesen, der Code dafür sieht so aus:

1
2
3
4
5
6
7
8
<!--?php //XML Feed URL eingabe, hier deinen Feed oder was auch immer du auslesen willst!
$xmlfile='http://reiffix.de/blog/feed';
//erstes SimpleXML- deine URL wird geladen
$xml = simplexml_load_file(rawurlencode($xmlfile));
$link = $xml->channel->item->link;
$title = $xml->channel->item->title;
$description = $xml->channel->item->description;
?>

Diese Vorgehensweise ist also bei allen Items gleich.
In der Variable $link ist also der Link gespeichert, in $title der Titel usw. So einfach lässt es sich auslesen. Die Verschachtlung hierbei beachten! Es hilt nicht einfach nur "$link = $xml->link" einzugeben.

Verknüpft man dieses Script noch mit einer Schleife und überprüft ob der Eintrag schon in der Datenbank vorhanden ist oder nicht, kann man es in eine Datenbank schreiben und daraus die jeweils letzten Einträge ausgeben. Hierbei bedient man sich der Tatsache, dass man die <item> Tags zählen kann.
Die Datei sieht wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--?php
$xmlfile='http://reiffix.de/blog/feed'; $xml = simplexml_load_file(rawurlencode($xmlfile));
if ($xml) { for ($i=2; $i&gt;=0; $i ) {
$link = $xml-&gt;channel-&gt;item[$i]-&gt;link;
 $title = utf8_decode($xml-&gt;channel-&gt;item[$i]-&gt;title);
$description = utf8_decode($xml-&gt;channel-&gt;item[$i]-&gt;description);

//Testen ob Eintrag bereits vorhanden
 $sql = "SELECT id FROM datenbank WHERE title='$title' AND link='$link'"; $query = mysql_query($sql);
$num_rows = mysql_num_rows($query);
 //Wenn nicht vorhanden neu reinschreiben
if ($num_rows == 0) {
$sql2 = "INSERT INTO datenbank (title,description,link)
VALUES ('$title','$description','$link')"
; $query2 = mysql_query($sql2);
}
}
 } ?-->

Das Script prüft also die letzten 3 Einträge und schaut ob diese bereits in der Datenbank vorhanden sind. Wenn nicht, schreibt das Script den neuen Eintrag hinein. Hierbei die Dekodierung beachten, da teilweise die Seite, Datenbank und xml-Datei auf verschiedenen Kodierungen laufen. (Ich verwende zum Beispiel utf8_decode, damit alles klappt, kann bei dir anders sein!)

Nun brauchen wir nur noch eine Datei die uns die Feeds ausliest. Diese sieht bei mir wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
<!--?php $sql = "SELECT * FROM datenbank ORDER BY id DESC LIMIT 2";  $query = mysql_query($sql);  while ($row = mysql_fetch_object($query)) {    $link = $row--->link;
$title = $row-&gt;title;
$description = $row-&gt;description;
$title = htmlentities($title);
$description = htmlentities($description);
echo "<strong>".$title."</strong>
"
;
echo "<a href="&quot;.$link.&quot;">".$description."</a>...
"
;
}
?&gt;

Meine "xml-read.php" liest also die letzten 2 Einträge aus der Datenbank aus und gibt diese dann aus. Das wars. Mehr als die 2 Codeblöcke braucht man nicht um Feeds einzulesen, auszulesen, in die Datenbank schreiben und aus dieser wieder auszugeben.

Die beiden Dateien kannst du hier herunterladen:
XML-Ein-und-auslesen.rar


5 Kommentare

  1. Pingback: » Blogfazit und Ausblick der ersten Woche

  2. John sagt:

    also muss sagen das sript ist super nun wolte ich es mit der datenbank verbinden lassen aber ihrgendwie funktioniert es nicht kann mir da jemand helfen

  3. Leander sagt:

    hallo, erst mal vielen dank für dieses wunderbare tutorial.
    Jetzt ist mir leider eine frage offen geblieben .. und zwar habe ich das problem, dass ich den feed in einem forum ausgeben möchte .. praktisch in einem board.

    Hast du nen tipp, wie ich das skript so baue dass es den Feed in eiem board mit einer bestimmten id wiedergibt. ?
    wäre echt super nett .. dank dir .. lieben gruß.

  4. Chris Danner sagt:

    Ich bekomme folgende Fehlermeldung. Kann mir jemand helfen?

    Warning: simplexml_load_file() [function.simplexml-load-file]: URL file-access is disabled in the server configuration in /homepages/14/d23929218/htdocs/testit/php/xml.php on line 6

    Warning: simplexml_load_file(http://www.appeal-advertising.de/wp/?feed=rss2) [function.simplexml-load-file]: failed to open stream: no suitable wrapper could be found in /homepages/14/d23929218/htdocs/testit/php/xml.php on line 6

    Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity “http%3A%2F%2Fwww.appeal-advertising.de%2Fwp%2F%3Ffeed%3Drss2″ in /homepages/14/d23929218/htdocs/testit/php/xml.php on line 6

  5. Bernd sagt:

    @Chris Danner. Dein Hoster hat den HTTP Zugriff auf dem Server geseperrt (URL file-access is disabled in the server configuration). Dewegen bekommst kann Deine XML.php Datei auch nichts auslesen da sie nichts zum auslesen hat.

Hinterlass einen Kommentar!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Wir freuen uns über jeden Kommentar bzw. jede Anregung in unserem Blog. Wir möchten Dich jedoch bitten, freundlich zu bleiben. Bitte beachten: Spamkeywordlinks werden von uns direkt gelöscht.