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 vonDOMNode,DOMElementoderDOMDocument. Wenn Sie einDOMDocumentübergeben, wird dessen Dokumentelement (die Wurzel) importiert.$class_name— eine optionale Klasse, dieSimpleXMLElementerweitert. 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:
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 haben | Sie möchten | Verwenden Sie |
|---|---|---|
| Einen DOM-Knoten | Ein SimpleXMLElement | simplexml_import_dom() |
Ein SimpleXMLElement | Ein DOMElement | dom_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
SimpleXMLElementist 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
nullzurück. Einenull-Rückgabe (oder in PHP 8+ einTypeError, wenn das Argument überhaupt kein DOM-Objekt ist) signalisiert einen Fehler — prüfen Sie immer, bevor Sie Methodenaufrufe verketten. - Die benutzerdefinierte Klasse muss
SimpleXMLElementerweitern. Die Übergabe eines unzugehörigen Klassennamens für$class_nameist 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.