Start · Sprachen · PHP · Referenz · Dom\Node

Dom\Node

Klasse

Die Basisklasse für die meisten Objekte im DOM – repräsentiert einen einzelnen Knoten im Dokumentenbaum.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\Node

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;
}
Knotenname: P Knotentyp: 1 Elternknoten: BODY 3: #text => Hallo 1: STRONG 3: #text => !

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);
<root><c/><b/></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);
<list><item>Eins</item><item>Zwei</item></list>

// 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.