HH maczarr.de

XML mit PHP nutzen

Bitte beachten Sie, dass diese Seite mindestens älter als zwei Jahre ist und ihre Inhalte technisch vermutlich bereits veraltet sind!

Daten als XML-Datei zu speichern wird immer beliebter. Im Web trägt es dazu bei, dass durch die Trennung von Daten/Inhalt und Design die Daten auf verschiedenste Weise genutzt werden können. Seit PHP 5 ist die Nutzung von XML-Daten nun auch sehr einfach möglich – nämlich mit Hilfe von SimpleXML.

Zum Anfang erstmal, XML ist eine Auszeichnungssprache, ähnlich der HTML. Bei XML kann man hingegen die "Tags" benennen wie man möchte, was einem selbst natürlich eine ungeheuere Freiheit lässt und somit die Möglichkeit gibt, die Bezeichnungen so zu wählen, dass sie genau auf ihren Inhalt passen.

So könnte man zum Beispiel einen Artikel für eine Website komplett mit Meta-Tags, Seitentitel und allem in einer XML-Datei ablegen. Das könnte dann so aussehn:


<?xml version="1.0" encoding="UTF-8" ?>
<daten>
 <bericht>
   <Jahr>2007</Jahr>
   <Monat>05</Monat>
   <Tag>09</Tag>
   <Zeit>12:07</Zeit>
   <Seitentitel>XML mit PHP nutzen</Seitentitel>
   <Keywords>XML,PHP,SimpleXML</Keywords>
   <Autor>Hilko Holweg</Autor>
   <Anrisstext>Daten als XML-Datei zu speichern</Anrisstext>
   <Titel>XML mit PHP nutzen</Titel>
   <Content>Zum Anfang erstmal, XML ist eine</Content>
 </bericht>
</daten>

Für gewöhnlich gehört zu einer XML-Datei noch eine DTD-Datei, in ihr schreibt man die "Regeln" auf, nach der die XML-Datei aufgebaut ist. Ein wichtiges Werkzeug um die Semantik zu wahren. Doch da die meisten XML-interpretierenden Programme (z.B. Browser) die DTDs gar nicht beachten und überprüfen, lässt man sie häufig einfach weg.

Nun kommen wir zum wesentlichen Teil dieses Kapitels: wie lese ich mit PHP 5 Daten aus einer XML-Datei ein? Ganz einfach, der folgende PHP-Schnipsel zeigt es:


  $xml = simplexml_load_file("bericht.xml");

Nehmen wir jetzt einmal an, die obigen XML-Daten sind in der XML-Datei bericht.xml gespeichert, so wird mit diesem PHP-Schnipsel der Inhalt der XML-Datei geparst und in ein Objekt in PHP überführt, ähnlich einem Array ist es nun nutzbar.
Nun können wir auf einfachste Weise auf die Daten aus der XML-Datei zurückgreifen, nämlich so:


  $xml->bericht[0]->Seitentitel[0];

Dieser Schnipsel greift nun auf das Element bericht zu und unterhalb von <bericht> auf den Inhalt von <Seitentitel>, in diesem Fall wäre die Ausgabe also "XML mit PHP nutzen". Die [0] bedeutet, dass auf das erste Element zurückgegriffen wird, wie bei Arrays beginnt hier die Zählung ebenfalls bei 0. Hätten wir z.B. zweimal <Seitentitel> in der XML-Datei unterhalb vom ersten <bericht>-Element, würden wir das Zweite einfach mittels $xml->bericht[0]->Seitentitel[1]; ansteuern können.

Die Nutzung von XML-Dateien ist mit Hilfe von PHP 5 also gar nicht so schwierig. Dazu hilft es noch ungemein eine gewisse Ordnung auf dem Server zu halten, man kann nun schließlich allen Inhalt zu einer Seite - der zusammengehört - in einer Datei abspeichern. Außerdem kommt man so dem Ziel, Inhalt (in XML-Dateien) und Design (in CSS-Dateien) zu trennen, einen Schritt näher.

Bevor XML-Daten gelesen werden können, müssen sie natürlich erst einmal geschrieben werden. Für das erstmalige Schreiben, kann man sich einfach ein Template nehmen und diese Daten in eine leere Datei schreiben. Ist nun die Grundstruktur vorhanden kann man Kindelemente hinzufügen. Für die anfangs gezeigte XML-Struktur wäre folgender PHP-Schnipsel die Lösung, wenn wir davon ausgehen, dass die einzufügenden Daten per Post-Methode angeliefert werden:


$xml = simplexml_load_file("bericht.xml");

$bericht = $xml->addChild("bericht");
$bericht->addChild("Jahr", "$_POST[jahr]");
$bericht->addChild("Monat", "$_POST[monat]");
$bericht->addChild("Tag", "$_POST[tag]");
$bericht->addChild("Zeit", "$_POST[zeit]");
$bericht->addChild("Seitentitel", "$_POST[seitentitel]");
$bericht->addChild("Keywords", "$_POST[keywords]");
$bericht->addChild("Autor", "$_POST[autor]");
$bericht->addChild("Anrisstext", "$_POST[anriss]");
$bericht->addChild("Titel", "$_POST[titel]");
$bericht->addChild("Content", "$_POST[content]");

Die Zeile $bericht = $xml->addChild("bericht"); fügt der XML-Struktur das Kindelement <bericht> hinzu. Da diese Anweisung der Variable $bericht zugewiesen wurde, stellt sie nun eine Referenz auf das neu eingefügte Element dar, weshalb die nachfolgenden Zeilen alle mit $bericht beginnen.

Bestehende Daten zu verändern ist ebenfalls nicht schwierig. Würde man zum Beispiel den Titel des zweiten <bericht>-Elements verändern wollen, wäre dazu folgende Zeile von nöten:


$xml->bericht[1]->Titel = $_POST[neuer_titel];

Nun sind zwar Daten in der XML-Struktur verändert bzw. hinzugefügt worden, allerdings muss die XML-Struktur nun natürlich auch noch wieder gespeichert werden und dies macht man mittels asXML();.


$handle = fopen("bericht.xml", "wb"); 
fwrite($handle, $xml->asXML());
fclose($handle);

Jetzt steht der Arbeit mit XML und PHP nichts mehr im Weg, wir können neue Daten schreiben, bestehende Daten editieren und die gespeicherten Daten wieder auslesen, einzig ein Element aus der XML-Struktur zu löschen ist mit SimpleXML nicht möglich.