Start · Sprachen · PHP · Referenz · Dom\NamedNodeMap

Dom\NamedNodeMap

Klasse

Repräsentiert eine geordnete Sammlung von Knoten (z. B. Attribute), die über Namen oder Index zugreifbar sind.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\NamedNodeMap implements IteratorAggregate, Countable

Beschreibung

Dom\NamedNodeMap ist Teil der modernen, PHP-8.4-nativen DOM-Erweiterung (Namespace Dom\) und löst die veraltete Klasse DOMNamedNodeMap ab. Sie speichert eine Menge von benannten Knoten – in der Praxis fast immer die Attribut-Liste eines Elements – und erlaubt sowohl den Zugriff über den Attributnamen als auch über einen numerischen Index.

Die Klasse implementiert IteratorAggregate, sodass die enthaltenen Knoten bequem mit foreach durchlaufen werden können. Über Countable lässt sich die Anzahl der Einträge mit count() ermitteln. Die Eigenschaft length liefert denselben Wert.

Zugriff auf einzelne Knoten ist über zwei Methoden möglich: getNamedItem(string $qualifiedName) sucht nach lokalem Namen, getNamedItemNS(?string $namespace, string $localName) berücksichtigt zusätzlich den Namespace. Für den Index-Zugriff steht item(int $index) zur Verfügung. Alle Methoden geben null zurück, wenn der gesuchte Knoten nicht existiert.

Hinweis: Dom\NamedNodeMap ist live – Änderungen am zugehörigen Element spiegeln sich sofort in der Map wider. Die Klasse ist read-only; Einfüge- und Löschoperationen werden über das jeweilige Element selbst (z. B. Dom\Element::setAttribute()) vorgenommen.

Beispiele

Alle Attribute eines Elements auslesen

<?php
$dom = Dom\HTMLDocument::createFromString('<a href="https://example.com" class="link" target="_blank">Klick</a>');

$anchor = $dom->querySelector('a');
$attributes = $anchor->attributes; // Dom\NamedNodeMap

echo 'Anzahl Attribute: ' . count($attributes) . PHP_EOL;

foreach ($attributes as $attr) {
    echo $attr->name . ' = ' . $attr->value . PHP_EOL;
}
Anzahl Attribute: 3 href = https://example.com class = link target = _blank

Einzelnes Attribut über getNamedItem() abfragen

<?php
$dom = Dom\HTMLDocument::createFromString('<img src="bild.jpg" alt="Ein Bild" width="300">');

$img = $dom->querySelector('img');
$map = $img->attributes;

$altAttr = $map->getNamedItem('alt');
if ($altAttr !== null) {
    echo 'Alt-Text: ' . $altAttr->value . PHP_EOL;
}

// Index-basierter Zugriff
$first = $map->item(0);
echo 'Erstes Attribut: ' . $first->name . ' = ' . $first->value . PHP_EOL;

// Nicht vorhandenes Attribut
$missing = $map->getNamedItem('data-foo');
var_dump($missing); // NULL
Alt-Text: Ein Bild Erstes Attribut: src = bild.jpg NULL

Namespace-bewusstes Attribut mit getNamedItemNS() auslesen

<?php
$xml = <<<XML
<?xml version="1.0"?>
<root xmlns:xlink="http://www.w3.org/1999/xlink">
    <link xlink:href="https://example.com" xlink:title="Beispiel"/>
</root>
XML;

$dom = Dom\XMLDocument::createFromString($xml);
$link = $dom->querySelector('link');
$map  = $link->attributes;

$hrefAttr = $map->getNamedItemNS('http://www.w3.org/1999/xlink', 'href');
if ($hrefAttr !== null) {
    echo 'xlink:href = ' . $hrefAttr->value . PHP_EOL;
}
xlink:href = https://example.com

// Wichtig · Fallstricke

Live-Sammlung: Da Dom\NamedNodeMap live ist, kann das Iterieren über die Map während gleichzeitiger Änderungen am Element zu unerwarteten Ergebnissen führen. Kopieren Sie die Attributwerte zuerst in ein Array, wenn Sie während der Iteration Attribute entfernen möchten.

Abgrenzung zur alten API: Dom\NamedNodeMap gehört zur neuen, standardkonformen DOM-Implementierung in PHP 8.4 und ist nicht mit DOMNamedNodeMap austauschbar. Dokumente aus Dom\HTMLDocument oder Dom\XMLDocument liefern ausschließlich Objekte der neuen Namespace-Klassen.