Signatur
Beschreibung
Dom\Node ist die zentrale Basisklasse der modernen PHP-DOM-Erweiterung (Namespace Dom\, eingeführt in PHP 8.4) und entspricht der gleichnamigen Schnittstelle der W3C-DOM-Spezifikation. Nahezu alle DOM-Objekte – Elemente, Attribute, Textknoten, Kommentare, CDATA-Abschnitte, Dokumentfragmente usw. – erben von dieser Klasse.
Über Dom\Node stehen grundlegende Eigenschaften wie nodeName, nodeValue, nodeType, parentNode, childNodes, firstChild, lastChild, previousSibling und nextSibling zur Verfügung. Damit lässt sich der Dokumentenbaum in alle Richtungen traversieren.
Die Klasse stellt außerdem Methoden zur Manipulation des Baums bereit: appendChild(), insertBefore(), replaceChild(), removeChild() sowie cloneNode(). Darüber hinaus ermöglichen isEqualNode() und isSameNode() den Vergleich von Knoten, und getRootNode() liefert den Wurzelknoten.
Hinweis: Die neue Dom\-Erweiterung (PHP 8.4+) ist die modernisierte, spec-konforme Nachfolgerin der alten DOMNode-Klasse. Sie unterstützt HTML5-Parsing über Dom\HTMLDocument und strikte Typprüfungen. Für neuen Code sollte ausschließlich die neue Erweiterung verwendet werden.
Beispiele
Knoten traversieren und Eigenschaften lesen
<?php
$doc = Dom\HTMLDocument::createFromString('<html><body><p id="intro">Hallo <strong>Welt</strong>!</p></body></html>');
$p = $doc->getElementById('intro');
echo 'Knotenname: ' . $p->nodeName . PHP_EOL; // P
echo 'Knotentyp: ' . $p->nodeType . PHP_EOL; // 1 (ELEMENT_NODE)
echo 'Elternknoten: ' . $p->parentNode->nodeName . PHP_EOL; // BODY
foreach ($p->childNodes as $child) {
echo $child->nodeType . ': ' . $child->nodeName;
if ($child->nodeValue !== null) {
echo ' => ' . $child->nodeValue;
}
echo PHP_EOL;
}
Knoten einfügen und entfernen
<?php
$doc = Dom\XMLDocument::createFromString('<root><a/><b/></root>');
$root = $doc->documentElement;
$b = $root->lastChild;
// Neuen Knoten vor <b> einfügen
$newNode = $doc->createElement('c');
$root->insertBefore($newNode, $b);
// <a> entfernen
$root->removeChild($root->firstChild);
echo $doc->saveXML($root);
Knoten tief klonen und anhängen
<?php
$doc = Dom\XMLDocument::createFromString('<list><item>Eins</item></list>');
$item = $doc->documentElement->firstChild;
$clone = $item->cloneNode(deep: true);
// Textinhalt des Klons ändern
$clone->firstChild->nodeValue = 'Zwei';
$doc->documentElement->appendChild($clone);
echo $doc->saveXML($doc->documentElement);
// Wichtig · Fallstricke
Kompatibilität: Dom\Node ist nicht kompatibel mit der alten DOMNode-Klasse aus ext/dom. Funktionen, die DOMNode erwarten, akzeptieren keine Objekte aus dem Dom\-Namespace und umgekehrt.
Unveränderliche Dokumente: Einige Methoden (z. B. insertBefore(), removeChild()) werfen eine Dom\DOMException, wenn der Knoten schreibgeschützt ist oder einem anderen Dokument angehört. Knoten müssen ggf. zuerst per importNode() in das Zieldokument importiert werden.
Lebendige vs. statische NodeLists: childNodes gibt eine lebendige Dom\NodeList zurück. Änderungen am Baum während der Iteration können zu unerwartetem Verhalten führen – im Zweifelsfall vor der Iteration in ein Array konvertieren.