CXLI. SimpleXML Funktionen

Einführung

Die SimpleXML Extension bietet ein besonders einfaches und leicht zu handhabendes Toolset, um XML in ein Objekt zu konvertieren, das mit normalen Eigenschafts-Selektoren und Array-Iteratoren bearbeitet werden kann.

Anforderungen

Die SimpleXML Extension setzt PHP 5 voraus.

Installation

Die SimpleXML Extension ist standardmäßig aktiviert. Um sie zu deaktivieren, verwenden Sie die Konfigurations-Option --disable-simplexml.

Beispiele

Viele Beispiele in dieser Referenz benötigen einen XML String. Anstatt diesen String in jedem Beispiel zu wiederholen, haben wir ihn als File abgelegt, das wir in den Beispielen inkludieren. Diese eingebundene Datei zeigen wir Ihnen im folgenden Beispiel. Alternativ dazu können Sie ein XML Dokument erstellen und es mit simplexml_load_file() einlesen.

Beispiel 1. Einzubindende Datei example.php mit XML String

<?php
$xmlstr
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
</movie>
</movies>
XML;
?>

Die Einfachheit von SimpleXML ist besonders deutlich erkennbar, wenn man einen String oder eine Zahl aus einem XML Dokument extrahieren will.

Beispiel 2. <plot> ermitteln

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo
$xml->movie[0]->plot; // "So this language. It's like..."
?>

Beispiel 3. Auf nicht-eindeutige Elemente per SimpleXML zugreifen

Existieren mehrere Instanzen eines Elements als Kinder eines einzigen Elternelements, lassen sich normale iterative Techniken einsetzen.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Für jeden <movie> Konten geben wir ein separates <plot> aus. */
foreach ($xml->movie as $movie) {
   echo
$movie->plot, '<br />';
}

?>

Beispiel 4. Attribute verwenden

Bis jetzt haben wir nur das Auslesen von Elementnamen und ihrer Werte betrachtet. SimpleXML kann aber auch auf die Attribute eines Elements zugreifen. Der Zugriff auf die Attribute eines Elements funktioniert genauso, als würden Sie die Elemente eines Array ansprechen.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Zugriff auf die <rating> Knoten des ersten Films
* Die Bewertungsskala wird zusätzlich ausgegeben. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string)
$rating['type']) { // Verwende Attribute als Element-Indizes
    
case 'thumbs':
        echo
$rating, ' thumbs up';
        break;
    case
'stars':
        echo
$rating, ' stars';
        break;
    }
}
?>

Beispiel 5. Vergleichen von Elementen und Attributen mit Text

Um ein Element oder ein Attribut mit einem String zu vergleichen oder an eine Funktion zu übergeben, die einen String als Parameter benötigt, müssen Sie das Element respektive das Attribut in einen String casten. Verwenden Sie dafür (string), ansonsten behandelt PHP das Element als Objekt.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

if ((string)
$xml->movie->title == 'PHP: Behind the Parser') {
    print
'Mein Lieblingsfilm.';
}

htmlentities((string) $xml->movie->title);
?>

Beispiel 6. Xpath verwenden

SimpleXML hat einen eingebauten Xpath-Support. So finden Sie alle <character> Elemente:

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo
$character->name, 'gespielt von ', $character->actor, '<br />';
}
?>

'//' wird hier als Wildcard verwendet. Um absolute Pfadangaben zu verwenden, lassen Sie einen der Slashe weg.

Beispiel 7. Werte setzen

Die Daten in SimpleXML müssen nicht konstant sein. Das Objekt erlaubt die Veränderung all seiner Elemente.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$xml->movie[0]->characters->character[0]->name = 'Miss Coder';

echo
$xml->asXML();
?>

Der vorstehende Code erzeugt ein neues XML-Dokument gleich dem Original, mit der Ausnahme, dass das neue XML von Ms. Coder auf Miss Coder verändert wurde.

Beispiel 8. Elemente und Attribute hinzufügen

Seit PHP 5.1.3 verfügt SimpleXML über eine vereinfachte Möglichkeit, Kindelemente und Attribute hinzuzufügen.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$character = $xml->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $xml->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');

echo
$xml->asXML();
?>

Die obige Code gibt ein XML-Dokument aus, das auf dem Original basiert, aber einen neuen Charakter und ein weiteres Rating enthält.

Beispiel 9. DOM Interoperabilität

PHP hat einen Mechanismus, um XML-Knoten zwischen dem SimpleXML und dem DOM Format zu konvertieren. Das Beispiel zeigt, wie man ein DOM Element in SimpleXML verwandelt.

<?php
$dom
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo
'Fehler beim Parsen des Dokuments';
     exit;
}

$s = simplexml_import_dom($dom);

echo
$s->book[0]->title;
?>

Inhaltsverzeichnis
SimpleXMLElement->addAttribute() --  Fügt einem SimpleXML-Element ein Attribut hinzu
SimpleXMLElement->addChild() --  Fügt dem XML-Knoten ein Kind-Element hinzu
SimpleXMLElement->asXML() --  Gibt einen wohlgeformten XML String zurück, der auf einem SimpleXML-Element basiert
SimpleXMLElement->attributes() --  Identifiziert die Attribute eines Elements
SimpleXMLElement->children() --  Findet Kindelemente des gegebenen Knotens
SimpleXMLElement->__construct() --  Erstellt ein neues SimpleXMLElement-Objekt
SimpleXMLElement->getDocNamespaces() --  Gibt die im Dokument vorhandenen Namespaces zurück
SimpleXMLElement->getName() -- Ermittelt den Namen eines XML-Elements
SimpleXMLElement->getNamespaces() --  Gibt die im Dokument verwendeten Namespaces zurück
SimpleXMLElement->registerXPathNamespace() --  Creates a prefix/ns context for the next XPath query
SimpleXMLElement->xpath() --  Führt ein XPath Query auf XML-Daten aus
simplexml_import_dom --  Erzeugt ein SimpleXMLElement Objekt aus einem DOM Knoten.
simplexml_load_file --  Übersetzt ein XML File in ein Objekt
simplexml_load_string --  Übersetzt einen XML-String in ein Objekt