W3docs

simplexml_import_dom()

SimpleXML ist eine PHP-Erweiterung mit einer einfachen API für XML. Die Funktion simplexml_import_dom() wandelt einen DOM-Knoten in ein SimpleXMLElement um.

Einführung

PHP bietet zwei verschiedene Möglichkeiten zur Verarbeitung von XML: die DOM-Erweiterung, die leistungsstark und standardkonform, aber ausführlich ist, und SimpleXML, das etwas von dieser Leistungsfähigkeit gegen eine wesentlich benutzerfreundlichere, objektorientierte API eintauscht. simplexml_import_dom() ist die Brücke zwischen beiden — sie nimmt einen Knoten aus einem DOM-Baum und gibt ein SimpleXMLElement zurück, das dieselben Daten kapselt.

Dies ist nützlich, wenn Sie mit DOM schwere Arbeit geleistet haben (Validierung gegen ein Schema, XPath-Nutzung, Namespace-Manipulation), das Ergebnis aber mit der prägnanten Syntax von SimpleXML lesen möchten. Diese Seite erklärt, wie die Funktion funktioniert, wann man sie einsetzen sollte und welche Fallstricke es gibt.

Syntax

simplexml_import_dom(
    object $node,
    ?string $class_name = SimpleXMLElement::class
): SimpleXMLElement|null
  • $node — der zu importierende DOM-Knoten. In der Praxis ist dies eine Instanz von DOMNode, DOMElement oder DOMDocument. Wenn Sie ein DOMDocument übergeben, wird dessen Dokumentelement (die Wurzel) importiert.
  • $class_name — eine optionale Klasse, die SimpleXMLElement erweitert. Das zurückgegebene Objekt ist eine Instanz dieser Klasse, was es erlaubt, eigene Hilfsmethoden hinzuzufügen.

Bei Erfolg gibt die Funktion ein SimpleXMLElement zurück, oder null, wenn der Knoten nicht importiert werden konnte. Die Funktion ist seit PHP 5.1.3 verfügbar.

Ein ganzes Dokument importieren

Der häufigste Fall ist das Parsen oder Erstellen eines Dokuments mit DOM und die anschließende Übergabe der Wurzel an SimpleXML zum einfachen Lesen:

<?php
$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?>
<book>
  <title>PHP Basics</title>
  <author>Jane Doe</author>
</book>');

$book = simplexml_import_dom($dom);

// Read with SimpleXML's property syntax instead of DOM method calls:
echo $book->title;   // PHP Basics
echo "\n";
echo $book->author;  // Jane Doe
?>

Die Übergabe des $dom-Objekts (ein DOMDocument) importiert dessen Wurzelelement, sodass $book dem <book> entspricht. Im Vergleich dazu — $dom->getElementsByTagName('title')->item(0)->nodeValue — wird der Vorteil von SimpleXML deutlich.

Einen einzelnen selbst erstellten Knoten importieren

Sie können auch einen Knoten programmgesteuert mit DOM erstellen und nur diesen Knoten importieren:

php— editable, runs on the server

Hier erstellen wir ein <title>-Element, hängen es an das Dokument an und übergeben das Wurzelelement des Dokuments ($dom->documentElement) an simplexml_import_dom(). asXML() serialisiert das SimpleXMLElement anschließend wieder in einen String.

Zusammenhang mit der restlichen SimpleXML-API

simplexml_import_dom() ist das Gegenstück zu dom_import_simplexml(), das ein SimpleXMLElement zurück in ein DOMElement umwandelt. Gemeinsam ermöglichen sie es, frei zwischen beiden Erweiterungen zu wechseln:

Sie habenSie möchtenVerwenden Sie
Einen DOM-KnotenEin SimpleXMLElementsimplexml_import_dom()
Ein SimpleXMLElementEin DOMElementdom_import_simplexml()

Wenn Sie von einem String oder einer Datei statt von einem DOM-Baum ausgehen, benötigen Sie DOM in der Regel gar nicht — greifen Sie direkt auf simplexml_load_string() oder simplexml_load_file() zurück.

Fallstricke

  • Gemeinsam genutzte Daten. Das zurückgegebene SimpleXMLElement ist eine Ansicht der Daten, auf die der DOM-Knoten verweist, keine unabhängige Kopie. Halten Sie das originale DOM-Objekt im Gültigkeitsbereich — wenn es vom Garbage Collector entfernt wird, kann der SimpleXML-Wrapper unbrauchbar werden.
  • Ungültige Eingabe gibt null zurück. Eine null-Rückgabe (oder in PHP 8+ ein TypeError, wenn das Argument überhaupt kein DOM-Objekt ist) signalisiert einen Fehler — prüfen Sie immer, bevor Sie Methodenaufrufe verketten.
  • Die benutzerdefinierte Klasse muss SimpleXMLElement erweitern. Die Übergabe eines unzugehörigen Klassennamens für $class_name ist ein Fehler; die Klasse muss eine Unterklasse sein.

Fazit

simplexml_import_dom() ermöglicht es Ihnen, präzise Arbeit mit der DOM-Erweiterung zu erledigen und das Ergebnis anschließend mit der leichtgewichtigen Syntax von SimpleXML zu lesen oder zu serialisieren. Die Funktion ergänzt sich natürlich mit dom_import_simplexml() für den Rückweg zu DOM. Wenn Ihre Daten bereits in einem DOM-Baum vorliegen, ist diese Funktion der sauberste Weg, um mit objektorientiertem Zugriff statt mit ausführlichen DOM-Aufrufen weiterzuarbeiten.

Übungen

Übung
Welche der folgenden Aussagen über SimpleXML in PHP sind richtig?
Welche der folgenden Aussagen über SimpleXML in PHP sind richtig?
Was this page helpful?