Anzeige
Tutorialbeschreibung

PHP - Teil 37 - XML (Teil 2): SimpleXML

PHP - Teil 37 - XML (Teil 2): SimpleXML

Die wohl einfachste Art, XML-Dokumente in PHP zu verarbeiten, ist SimpleXML. Mit dieser Erweiterung lässt sich XML-Syntax in ein PHP-Objekt überführen, mit dem anschließend gearbeitet werden kann. Dabei ist SimpleXML übrigens keine Neuerfindung, vielmehr orientiert sich die Erweiterung am Perl-Paket XML::Simple.

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!


In PHP 5 ist SimpleXML standardmäßig enthalten. Ob das bei euch der Fall ist, könnt ihr wie gewohnt über die Funktion phpinfo() kontrollieren.

Bilder



Ist SimpleXML verfügbar, gibt es dort einen Bereich SimpleXML.

Wie einfach sich SimpleXML einsetzen lässt, zeigt folgendes Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<Nachricht>
  <Von>medienwerke.de</Von>
  <An>psd-tutorials.de</An>
  <Datum>11.12.2011</Datum>
  <Betreff>PHP-tutorials</Betreff>
  <Text>Anbei ein weiteres PHP-Tutorial</Text>
</Nachricht>


 
Hier wurde ein einfaches XML-Dokument definiert.

Bilder



Der Inhalt dieses XML-Dokuments soll ausgegeben werden.

<?php
$xml = simplexml_load_file("email.xml");
echo $xml->getName() . "<br />";
foreach($xml->children() as $child){
  echo $child->getName() . ": " . $child . "<br />";
}
?>


 
Das Ergebnis sieht folgendermaßen aus:

Bilder



Zunächst wird über simplexml_load_file() das XML-Dokument geladen. Dabei wird die XML-Datei direkt in ein Objekt überführt. Der Zugriff auf die einzelnen Elemente des Objekts kann nun wie bei jedem anderen Objekt erfolgen. Für den Zugriff auf die einzelnen Elemente gibt es verschiedene Möglichkeiten. Im aktuellen Beispiel wird der Name des ersten Elements ermittelt und ausgegeben. Der Zugriff auf dieses Element geschieht dabei über $xml->getName(). Anschließend wird auf die Kindknoten des ersten Elements zugegriffen. Dafür gibt es die Funktion children(). Mittels einer Schleife werden jeweils die Elementnamen und deren Inhalte untereinander ausgegeben.

Dieses erste Beispiel hat gezeigt, wie einfach sich mittels SimpleXML XML-Dokumente in PHP verarbeiten lassen.

 
Es empfiehlt sich übrigens, immer zu überprüfen, ob die angegebene XML-Datei überhaupt vorhanden ist. So lassen sich mögliche Fehler bei der Ausgabe der Elemente verhindern. Wie sich so etwas umsetzen lässt, zeigt das folgende Beispiel:

<?php
if (file_exists('email.xml')){
   $xml = simplexml_load_file('email.xml');
echo $xml->Text[0];
} else {
   exit("Die angegebene Datei konnte nicht geladen werden. ");
}
?>


Hier wird überprüft, ob es die zu ladende Datei tatsächlich gibt. Ist das der Fall, wird auf ein Element zugegriffen und dessen Inhalt ausgegeben.

Bilder



 
Wenn der Zugriff auf die Datei nicht gelingt, gibt es eine Fehlermeldung.

Bilder



Dieses if-else-Konstrukt sollte immer die Basis eurer SimpleXML-Anwendungen bilden. Das Beispiel zeigt aber auch noch etwas anderes. Denn bislang wurde auf die Elemente über Funktionen (z. B. children()) zugegriffen. Ebenso könnt ihr aber auch Arrays verwenden.

$xml->betreff[0];


 
Will man auf das erste Element zugreifen, wird der Index 0 angegeben. Soll auf das zweite Element zugegriffen werden, verwendet man den Index 1.

Um zu verstehen, wie SimpleXML arbeitet, lohnt ein Blick auf die Ausgabe der Funktion var_dump(). Mit var_dump() kann man sich nämlich den gesamten Inhalt eines Objekts anzeigen lassen.

<?php
if (file_exists("email.xml")) {
   $xml = simplexml_load_file("email.xml");
var_dump($xml);
}
else {
   ("Die angegebene Datei konnte nicht geladen werden.");
}
?>


Die Ausgabe sieht folgendermaßen aus:

Bilder



 
Hier ist deutlich die Struktur des XML-Dokuments zu erkennen. So bedeutet der erste Teil der ersten Zeile, dass das Dokument genau aus einem Element besteht.

object(SimpleXMLElement)#1


Dieses Element besitzt nun wiederum fünf Unterelemente.

object(SimpleXMLElement)#1 (5)


Das ist wiederum der in Klammern stehenden Ziffer zu entnehmen.

Um welche Elemente es sich dabei handelt, welche Datentypen diese besitzen und welchen Inhalt sie haben, ist dann innerhalb der Klammern aufgeführt.

["Von"]=> string(14) "medienwerke.de" 

["An"]=> string(16) "psd-tutorials.de" 

["Datum"]=> string(10) "11.12.2011" 

["Betreff"]=> string(13) "PHP-tutorials" 

["Text"]=> string(31) "Anbei ein weiteres PHP-Tutorial"



 

Komplexere Dokumente verarbeiten

Zugegebenermaßen bildeten bei den bisherigen Beispielen einfache XML-Dokumente die Basis. Damit es in diesem Punkt nicht zu Missverständnissen kommt, folgt hier ein komplexeres Beispiel. In der Tat kann man mit SimpleXML auch umfangreichere Dokumente verarbeiten. Positiv kommt außerdem hinzu, dass in SimpleXML beispielsweise auch ein XPath-Prozessor integriert ist. Dieser Prozessor ermöglicht den Zugriff auf Elemente über XPath. Mit XPath (http://www.w3.org/TR/xpath20/) kann man mit einer speziellen Syntax beliebige Elemente bzw. Knoten innerhalb eines Dokuments adressieren. Dabei ist XPath sehr mächtig, erlaubt also auf vielfältige Arten den Elementzugriff.

Auch dieser Aspekt soll natürlich wieder anhand eines Beispiels gezeigt werden. Zunächst das eigentliche XML-Dokument:

<?xml version="1.0" encoding="utf-8"?>
 <katalog>
  <buch isbn="9783462025866">
    <titel>Fever Pitch</titel>
    <autor>Hornby, Nick</autor>
    <verlag>Kiepenheuer und Witsch</verlag>
    <preis>9,95 Euro</preis>
    <bibliografisches>
      <seiten>335</seiten>
      <einband>Paperback</einband>
      <auflage>12</auflage>
    </bibliografisches>
  </buch>
 <buch isbn="9782264039378">
    <titel>American Psycho</titel>
    <autor>Ellis, Bret Easton</autor>
    <verlag>Kiepenheuer und Witsch</verlag>
    <preis>9,95 Euro</preis>
    <bibliografisches>
      <seiten>548</seiten>
      <einband>Paperback</einband>
      <auflage>9</auflage>
    </bibliografisches>
  </buch>
</katalog>


 
Das Beispiel weist einige Elemente mehr auf. Außerdem gibt es innerhalb dieses Dokument das Attribut isbn. Es handelt sich hier um eine typische Katalogdatei, in der verschiedene Bücher hinterlegt sind. (Das Beispiel ist so übrigens nicht aus der Luft gegriffen, sondern kann tatsächlich die Basis für den Aufbau eines Buchkatalogs bilden).

Auch hier zunächst wieder die Ausgabe im Browser:

Bilder



Im aktuellen Beispiel sollen nicht alle Elemente ausgegeben werden. Stellt euch vielmehr einen Shop vor, in dem ein Kunde über eine Suchmaske nach einem Buch sucht.

 
Das dazugehörende Formular sieht folgendermaßen aus:

<form method="get" action="xpath.php">
  <label>
  <input type="text" name="isbn" id="isbn" />
  </label>
  <label>
  <input type="submit" name="button" id="button" />
  </label>
</form>


Diese Büchersuche wird über die ISBN-Nummer ausgelöst. Und genau diese ISBN-Nummer ist es, die jeweils dem Attribut isbn zugewiesen wird. Entscheidend ist hier also jeweils das Attribut sbn innerhalb der einzelnen buch-Elemente. (Da eine ISBN immer eindeutig ist, also nur einmal vergeben wird, lassen sich die einzelnen Bücher eben auch eindeutig anhand einer ISBN identifizieren).

<buch isbn="23-12-3333">


Die Suchmaske besteht lediglich aus einem Eingabefeld.

Bilder



Wird dort die ISBN eingetragen und auf Suchen geklickt, ruft das eine PHP-Datei auf. Dem URL dieser Datei wird beim Aufruf der Parameter isbn übergeben. Als Wert besitzt dieser Parameter die in das Suchfeld eingetragene ISBN.

Das Skript sieht folgendermaßen aus:

<?php
$isbn = $_GET['isbn'];
if (file_exists("katalog.xml")) {
    $xml = simplexml_load_file("katalog.xml");
    $path ="/katalog/buch[@isbn=".$isbn."]";
            $path2 ="/katalog/buch/bibliografisches";
            $result = $xml->xpath($path);
            $result2 = $xml->xpath($path2);
    if (!$result) {
    echo "Das Buch ist noch nicht in unserem Katalog.";
   }
else {
   echo "<h2>".$result[0]->titel."</h2>";
   echo "<p><b>".$result[0]->autor."</b></p>";
   echo "<p>".$result[0]->preis."</p>";
   echo "<p>".$result2[0]->seiten." Seiten</p>";
   }
}
 else {
   exit("Die angegebene Datei konnte nicht gefunden werden.");
}
?>


Die einzelnen Skriptbestandteile kennt ihr weitestgehend aus den vorherigen Beispielen. Neu ist zunächst einmal folgende Zeile:

$path ="/katalog/buch[@isbn=".$isbn."]";


Dabei handelt es sich um einen typischen XPath-Ausdruck. Dieser Ausdruck überprüft, ob es unterhalb von katalog ein Element buch gibt, welches das Attribut isbn besitzt, dessen Wert mit der übergebenen ISBN-Nummer übereinstimmt.

 
Ist das nicht der Fall, gibt es eine Fehlermeldung.

Bilder



Wird das Buch hingegen gefunden, geschieht der Zugriff auf die Inhalte der einzelnen Elemente über die bereits vorgestellte Array-Variante.

 
Wie die folgende Abbildung zeigt, wurde exakt der Datensatz ausgegeben, nach dem gesucht wurde.

Bilder



Auf diese Weise könnte man jetzt seinen eigenen Shop auf Basis von XML und SimpleXML aufbauen.


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

Vielen Dank!

Portrait von mario_P
  • 07.10.2016 - 13:05

Danke tolles Video !

Portrait von dmtw2107
  • 16.11.2013 - 09:50

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

Portrait von tampen
  • 30.10.2012 - 12:55

...leichtverständlich und nachvollziehbar erklärt.

x
×
×