PHP/SimpleXML

Aus Mikiwiki
< PHP
Wechseln zu: Navigation, Suche

Simplexml (auch: SimpleXML) ist eine Ergänzung der DOM-Bibliothek und existiert weitgehend unabhängig von dieser. Es ist eine sehr einfache, kompakte Bibliothek für den schnellen Zugriff auf XML. Durch eine Kompatibilitätsschnittstelle zu DOM kann sehr schnell vom einen System auf das andere übergegangen werden.

Einfacher Zugriff auf XML-Elemente

Das folgende Beispiel zeigt, wie mit SimpleXML Daten ausgelesen werden.

<html>
<head>
  <title>News-Artikel erfassen</title>
</head>
<body>
<?php
## Die Funktion "simplexml_load_file" liest die XML-Datei ein.
$xml = simplexml_load_file("data/articles.xml");
echo $xml->item[1]->title[0];
foreach($xml->item as $item)
{
  ## Objektorientierter Zugriff auf die Elemente.
  echo "{$item->title} <br />\n";
}
?>
</body>
</html>

Tutorial: Develop rock-solid code in PHP: Part threePHP Weekly: Issue # 172
Tutorial: Develop rock-solid code in PHP: Part three

Jedes Element wird als Eigenschaft des darüber liegenden abgebildet. Ein Blick in die entsprechende Struktur der hier benutzten XML-Datei "articles.xml" zeigt, wie das gemeint ist.

<?xml version="1.0" encoding="iso-8859-1" ?>
<articles>
  <item>
    <title id="123">PHP Weekly: Issue # 172</title>
    <link>http://www.zend.com/zend/week/week172.php</link>
  </item>
  <item>
    <title id="456">Tutorial: Develop rock-solid code in PHP: Part three</title>
    <link>http://www.zend.com/zend/tut/tut-hatwar3.php</link>
  </item>
</articles>

Besonderheiten des Zugriffs auf Elemente und Attribute

Falls Attribute verwendet werden, stehen diese über die Array-Syntax zur Verfügung. Angenommen, die XML-Datei enthält das folgende Element.

<title id="3543">

In diesem Fall würde der Zugriff auf das Attribut "id" wie folgt gelingen.

$item->title['id']

Dieselbe Syntax wird auch verwendet, um gezielt auf bestimmte Elemente der Hierarchie zuzugreifen. So erhält man den ersten Titel des zweiten "<item>"-Elements mit folgendem Code.

echo $xml->item[1]->title[0];

Zu beachten ist, dass die Indizes nullbasiert sind. Folgendes wäre übrigens falsch. Es ergibt nicht (wie es bei einer vergleichbaren XPath-Anweisung der Fall wäre) den zweiten Titel im Dokument, wiel "$xml->item" die Auswahl bereits auf das erste Element beschränkt hat.

echo $xml->item->title[1];

Auf Xpath muss unter SimpleXML dennoch nicht verzichtet werden. "xpath" ist eine Methode, die Xpath-Anweisungen analysiert, ausführt und eine Knotenliste zurückgibt, bei der es sich um ein einfaches Array handelt, dessen Elemente Objekte vom Typ "SimpleXMLElement" sind.

<html>
<head>
  <title>News-Artikel erfassen</title>
</head>
<body>
<pre>
<?php
$xml = simplexml_load_file("data/articles.xml");
$nodes = $xml->xpath("/articles/item/title");
foreach($nodes as $title)
{
  echo "{$title}<br />\n";
}
?>
</pre>
</body>
</html>

PHP Weekly: Issue # 172
Tutorial: Develop rock-solid code in PHP: Part three

SimpleXMLElement näher betrachtet

Die Klasse "SimpleXMLElement" bietet einen objektorientierten Zugriff auf Elemente. Ausserdem werden die folgenden Methoden bereitgestellt. Die Eigenschaften der Klasse werden durch die Elemente gebildet, hängen also vom XML-Dokument ab. Dabei werden jeweils die Namen der Elemente benutzt.

Methode Beschreibung
asXML Gibt den Inhalt als XML-Zeichenkette zurück.
xpath Führt eine Xpath-Anweisung aus und gibt ein Array mit "SimpleXMLElement"-Objekten zurück.
attributes Gibt eine Auflistung der Attribute zurück.
children Auflistung der Kindelemente.

Daten mit SimpleXML schreiben

Das folgende Beispiel zeigt, dass sich in XML-Dokumenten auch Daten ändern lassen. Das Skript wählt den ersten "<item>"-Knoten über eine Xpath-Anweisung aus und verändert dann dessen Titel. Dann wird der Inhalt des so veränderten Dokuments ausgegeben. Für das Speichern können die bekannten Dateifunktionen verwendetet werden. Die Daten erhält man mit der Methode "asXML".

<html>
<head>
  <title>News-Artikel erfassen</title>
</head>
<body>
<pre>
<?php
$xml  = simplexml_load_file("data/articles.xml"); 
$node = $xml->xpath("/articles/item[position()=1]");
## Auswahl des ersten "item"-Knotens und Änderung des Titels
$node[0]->title = "PHP 5 - New Release";
echo htmlspecialchars($xml->asXML());
?>
</pre>
</body>
</html>
<?xml version="1.0" encoding="iso-8859-1"?>
<articles> 
    <item>   
        <title id="123">PHP 5 - New Release</title>   
        <link>http://www.zend.com/zend/week/week172.php</link>   
    </item> 
    <item>   
        <title id="456">Tutorial: Develop rock-solid code in PHP: Part three</title>
        <link>http://www.zend.com/zend/tut/tut-hatwar3.php</link>   
    </item> 
</articles>

Interoperabilität mit DomXML

Simplexml reicht oft aus, doch manchmal benötigt man die ganze Leistungsfähigkeit der DOM-Bibliothek. Mit den folgenden zwei Funktionen gelangt man in die andere Welt und kann so gleichzeitig mit beiden Bibliotheken arbeiten.

Funktion Beschreibung
simplexml_import_dom($dom) Importiert ein Dokument "$dom" vom Typ "DomDocument" in die SimpleXML-Welt.
dom_import_simplexml($xml) Übergibt ein SimpleXML-Objekt nach DOM. Der Rückgabewert der Funktion hat den Typ "DomDocument", "$xml" ist vom Typ "SimpleXMLElement"