Anzeige
Smartes Cloud Hosting für anspruchsvolle Projekte.
↬ Loslegen und Spaces testen ↬ Jetzt testen!
Thiemo Fetzer 2. Juli 2004

PHP und XML: Einfach einfach!

Kein Beitragsbild

Die neue PHP-Version 5 enthält neben zahlreichen anderen Neuerungen auch die Erweiterung SimpleXML. Mit ihr kann XML auf erstaunlich einfache Art in ein PHP Objekt überführt und verarbeitet werden.

Wix Webseiten — echt superpraktisch. ↬ Mehr erfahren

Release Candidate 3 von PHP5

Anzeige

artikel.xml:

 <?xml version="1.0" encoding="ISO-8859-1" ?>
  <artikel>
     <titel>Der Titel</titel>
     <teaser>Der Teaser, eine kurze Beschreibung</teaser>
     <inhalt>Der Artikelinhalt an sich</inhalt>
  </artikel>

simplexml_1.php:

      <?php

if (file_exists('artikel.xml')) {
   $xml = simplexml_load_file('artikel.xml');

echo $xml->teaser[0];

} else {
   exit('Konnte Datei nicht laden.');
}
?>

direkt in ein Objekt überführt

Dabei erfolgt der Zugriff auf die Elemente jeweils über Arrays. Da in unserem Fall nur ein Element innerhalb des Wurzelelementes <artikel> als <teaser> Element verwendet wird, geschieht der Zugriff auf den Inhalt dieses Elementes mit dem Arrayindex 0. Wären zwei <teaser> Elemente verwendet, würde man über den Index 1 auf das zweite Element zugreifen.

Um zu verstehen, wie bei SimpleXML die Daten in Objekten gespeichert werden, kann man sich mit der var_dump() Funktion von PHP schlicht den gesamten Inhalt des Objektes ausgeben lassen. Man ändert den Code einfach wie folgt ab:

simplexml_1.php:

      <?php

if (file_exists("artikel.xml")) {
   $xml = simplexml_load_file("artikel.xml"');

var_dump($xml);
} 
else {
   exit("Konnte Datei nicht laden. ");
}
?>

Die Ausgabe nach Aufruf des Skriptes sieht wie folgt aus:

      object(SimpleXMLElement)#1 (3) 
{ 
["titel"]=> string(9) "Der Titel" 
["teaser"]=> string(35) "Der Teaser, eine kurze Beschreibung" 
["inhalt"]=> string(25) "Der Artikelinhalt an sich" 
}

Wenn man bedenkt, dass zum Parsen eines XML Dokumentes mit dem ereignisorientierten Parser Expat mindestens drei Funktionen definiert werden mussten, ist der hierzu notwendige Aufwand mit SimpleXML nicht vergleichbar.

Komplexere XML Dokumente und SimpleXML?
Auch komplexe XML Dokumente lassen sich mit SimpleXML rasch bearbeiten. Folgendes XML Dokument ist fast identisch mit dem Beispiel oben, es wurde jedoch mit Attributen und weiteren Elementen versehen.

artikel_2.xml:

      <?xml version="1.0" encoding="ISO-8859-1" ?> 
 <content>
 <artikel id="1">
 <meta>
  <keywords>ein,netter,artikel</keywords> 
  <description>ein,lustiger,artikel</description> 
  </meta>
  <titel>Der Titel</titel> 
  <teaser>Der Teaser, eine kurze Beschreibung</teaser> 
  <inhalt>Der Artikelinhalt</inhalt> 
  </artikel>
 <artikel id="2">
 <meta>
  <keywords>ein,zweiter,netter,artikel</keywords> 
  <description>ein,zweiter,lustiger,artikel</description> 
  </meta>
  <titel>Der zweite Titel</titel> 
  <teaser>Der zweite Teaser, eine kurze Beschreibung</teaser> 
  <inhalt>Der zweite Artikelinhalt</inhalt> 
  </artikel>
  </content>

XPath Prozessor

Dies soll im folgenden Beispiel geschehen – es soll lediglich der vom Besucher angefragte Artikel angezeigt werden. Der gewünschte Artikel wird durch die ID identifiziert, die im <artikel> Element als Attribut definiert ist. Diese ID wird über den URL an das PHP Programm übergeben.

simplexml2.php

      <?php
      $id = $_GET['id'];
      if (file_exists("test.xml")) {
         $xml = simplexml_load_file("test.xml");
         $path ="/content/artikel[@id=".$id."]";
         if (!$res = $xml->xpath($path)) {
   echo "Artikel nicht vorhanden!";
   }
   else {
   echo "<h1>".$res[0]->titel."</h1>";
   echo "<p><b>".$res[0]->teaser."</b></p>";
   echo "<p>".$res[0]->inhalt."</p>";
   }
}
 else {
   exit("Konnte Datei nicht laden.");
}
?>

Artikel-Objektes

Screenshot
Das Ergebnis beim Aufruf mit id=1

Natürlich kann man ein solches Problem auch ohne XPath lösen, SimpleXML stellt die dazu notwendigen Funktionen zur Verfügung – doch bietet SimpleXML gerade durch die Schnittstelle zu XPath viele weitere Möglichkeiten für die dynamische Programmierung. SimpleXML sollte also nicht unterschätzt werden.

Weitere Informationen zu SimpleXML und PHP5.

Thiemo Fetzer

Thiemo Fetzer lebt seit 2008 in London und promoviert dort im Fachbereich "Entwicklungsökonomie" an der London School of Economics. Zuvor hat er Wirtschaftswissenschaften, Mathematik und Informatik in Magdeburg und Ulm studiert.

8 Kommentare

  1. Ich arbeite gerade an etwas und möchte auch vorhandene XML Daten von einem Spiel einbinden um nicht alles per Hand in die Datenbank zu schreiben nur gibt’s da ein kleines Problem: Wie les ich hier zb das Lv aus?

  2. Wie kann ich ein GPX File (Wegpunkte) Parsen?

  3. Danke für die Erklärungen. Denke, dass nun einige Verständnis Probleme bei mir gelöst wurden und ich das neu erlernte bei meinem Portal gleich umsetzen werden.

  4. @hannes: Du kannst einfach dir einen XML String zusammensetzen lassen aus den DB Daten und dann per simplexml_load_string drauf zugreifen.

  5. „Wieso speicherst du die Daten nicht einfach in eine temporäre Datei, die du anschließend löschst? ;)“
    Ja nicht!
    Stell dir mal vor 100 Benutzer greifen gleichzeitig darauf zu?
    Wie du php generierteHTML Seiten als normale HTML Seiten verwenden kannst (ohne das sie physisch existieren) kannst du auch php generierteXML Code wie normale XML Datei verwenden (ohne das sie physisch existieren).

  6. @Hannes: Wieso speicherst du die Daten nicht einfach in eine temporäre Datei, die du anschließend löschst? ;)

  7. Hi,

    vielen Dank – hat mir im Verständnis sehr geholfen. Dennoch eine Frage: Hier wird ja auf eine real existierende XML-Datei zugegriffen. Gibt es auch eine Lösung, dass man eine mySQL-Datenbank ausliest, daraus eine „virtuelle“ (also nicht auf der Festplatte befindliche) XML erstellt und mit dieser dann weiterarbeitet?

  8. Ein kleiner Fehler

    $xml = simplexml_load_file(„artikel.xml“‚);

    RICHTIG:

    $xml = simplexml_load_file(„artikel.xml“);

Schreibe einen Kommentar

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