Start · Sprachen · PHP · Referenz · Dom\DtdNamedNodeMap

Dom\DtdNamedNodeMap

Klasse

Repräsentiert eine geordnete Sammlung von in der DTD deklarierten Knoten (z. B. Notationen oder Entities), auf die per Name oder Index zugegriffen werden kann.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\DtdNamedNodeMap implements Countable, IteratorAggregate

Beschreibung

Dom\DtdNamedNodeMap ist eine schreibgeschützte Kollektion, die in einer Document Type Definition (DTD) deklarierte Knoten – typischerweise Notationen (Dom\Notation) oder Entities (Dom\Entity) – zusammenfasst. Sie wird über Eigenschaften wie Dom\DocumentType::$notations oder Dom\DocumentType::$entities bereitgestellt.

Im Gegensatz zur allgemeinen Dom\NamedNodeMap bezieht sich DtdNamedNodeMap ausschließlich auf DTD-spezifische Deklarationen und implementiert Countable sowie IteratorAggregate, sodass Einträge sowohl mit count() gezählt als auch mit foreach iteriert werden können.

Der Zugriff auf einzelne Einträge erfolgt über die Methode getNamedItem() (nach Name) oder item() (nach numerischem Index). Die Kollektion ist live, d. h. sie spiegelt stets den aktuellen Zustand des zugehörigen Dom\Document wider.

Diese Klasse ist Teil der modernen, namespaced DOM-API, die in PHP 8.4 eingeführt wurde und die ältere DOMNamedNodeMap-Klasse im globalen Namespace ersetzt. Sie eignet sich besonders für das Auslesen und Verarbeiten von DTD-Metainformationen in XML-Dokumenten.

Beispiele

Entities einer DTD auslesen

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!ENTITY autor "Max Mustermann">
  <!ENTITY firma "Beispiel GmbH">
]>
<root>&autor; arbeitet bei &firma;.</root>
XML;

$dom = Dom\XMLDocument::createFromString($xml);
$doctype = $dom->doctype;

$entities = $doctype->entities;

echo "Anzahl Entities: " . count($entities) . PHP_EOL;

foreach ($entities as $entity) {
    echo $entity->nodeName . ' => ' . $entity->nodeValue . PHP_EOL;
}

// Direkter Zugriff per Name
$autorEntity = $entities->getNamedItem('autor');
if ($autorEntity !== null) {
    echo "Autor-Entity: " . $autorEntity->nodeName . PHP_EOL;
}
Anzahl Entities: 2 autor => Max Mustermann firma => Beispiel GmbH Autor-Entity: autor

Notationen einer DTD iterieren

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!NOTATION png SYSTEM "image/png">
  <!NOTATION jpg SYSTEM "image/jpeg">
]>
<root/>
XML;

$dom = Dom\XMLDocument::createFromString($xml);
$doctype = $dom->doctype;

$notations = $doctype->notations;

echo "Gefundene Notationen: " . count($notations) . PHP_EOL;

for ($i = 0; $i < count($notations); $i++) {
    $notation = $notations->item($i);
    echo $notation->nodeName . PHP_EOL;
}

// Gezielter Zugriff
$png = $notations->getNamedItem('png');
if ($png !== null) {
    echo "PNG-Notation gefunden: " . $png->nodeName . PHP_EOL;
}
Gefundene Notationen: 2 png jpg PNG-Notation gefunden: png

// Wichtig · Fallstricke

Schreibschutz: Dom\DtdNamedNodeMap ist eine read-only-Kollektion. Versuche, Einträge zu verändern oder hinzuzufügen, führen zu Ausnahmen.

Namespaced API: Diese Klasse gehört zur modernen Dom\-Erweiterung (PHP 8.4+). Sie ist nicht mit der älteren DOMNamedNodeMap aus dem globalen Namespace kompatibel. Projekte, die PHP < 8.4 unterstützen müssen, sollten weiterhin die klassische DOM-API verwenden.

Live-Kollektion: Da die Map live ist, sollte beim Iterieren darauf geachtet werden, dass das zugrundeliegende Dokument während der Iteration nicht modifiziert wird, um unerwartetes Verhalten zu vermeiden.