SimpleXML PHP 5 und XML: Einfach einfach!!

SimpleXML PHP 5 und XML: Einfach einfach!!Die neue PHP-Version 5 (PHP5) 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.

Bisher ist SimpleXML auf experimenteller Basis veröffentlicht worden, so dass sich bis zur Erscheinung der finalen Version von PHP 5 noch einiges verändern kann. Insbesondere Funktionsnamen und ähnliches könnten betroffen sein. SimpleXML muss nicht mehr mitinstalliert werden. In den neuen PHP5 Distributionen wird SimpleXML standardmäßig mitkonfiguriert.
 
Und simpel ist SimpleXML in der Tat. Ein einfaches XML Dokument, wie z.B. artikel.xml kann in wenigen Schritten mit SimpleXML verarbeitet werden.

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>

 
Um beispielsweise an den Inhalt des <teaser> Elementes zu gelangen, bedarf es nur weniger Zeilen Code:

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.');
}
?>

 
Durch die simplexml_load_file() Funktion wird die XML Datei eingelesen und direkt in ein Objekt überführt. Auf die Elemente des Objektes kann jetzt wie auf normale Objekte zugegriffen werden. Die Ausgabe erfolgt über das $xml Objekt, welches nichts anderes als das Wurzelelement <artikel> darstellt.

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"
}

 
Darin erkennt man die gesamte Struktur des XML Dokumentes wieder. SimpleXML erkennt, dass das Dokument genau aus einem Element object(SimpleXMLElement)#1 besteht, welches drei object(SimpleXMLElement)#1 (3) untergeordnete Elemente beherbergt. Diese Elemente, ihr Datentyp und deren Inhalte werden dann in geschweiften Klammern angegeben.

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>

 
Da SimpleXML ausgesprochen modular aufgebaut ist und viele Schnittstellen zu weiteren PHP- beziehungsweise XML Technologien aufweist, können komplexe Untersuchungen von XML Dokumenten zum Beispiel über den in SimpleXML integrierten XPath Prozessor durchgeführt werden. Das heißt, man kann über die Pfadangaben in XPath auf die gesuchten Elemente zugreifen.

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.");
}
?>

 
Auf den gewünschten Artikel wird über den XPath Pfad /content/artikel[@id=".$id."] zugegriffen. Die Anfrage wird über die xpath() Methode verarbeitet und das Ergebnis der Variable $res zurückgegeben. In diesem Array sind nun alle Elemente des gesuchten Artikel-Objektes gespeichert. Auf diese kann wie auf ein Objekt zugegriffen werden.

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.

(tf)

This entry was posted in PHP, XML. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *