Start · Sprachen · PHP · Referenz · Dom\Entity

Dom\Entity

Klasse

Repräsentiert eine in der DTD deklarierte Entität (sowohl intern als auch extern) innerhalb eines XML-Dokuments.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\Entity extends Dom\Node

Beschreibung

Dom\Entity ist Teil der modernen, namespaced DOM-API (eingeführt in PHP 8.4) und repräsentiert eine Entitätsdeklaration aus der Document Type Definition (DTD) eines XML-Dokuments. Entitäten können entweder intern (mit einem direkten Ersetzungstext) oder extern (mit einem Verweis auf eine externe Ressource via System- oder Public-Identifier) sein.

Objekte dieses Typs befinden sich im Dom\DocumentType::$entities-NamedNodeMap und können über diese Sammlung abgerufen werden. Eine direkte Instanziierung ist nicht vorgesehen; Instanzen entstehen ausschließlich beim Parsen eines XML-Dokuments mit einer DTD, die Entitätsdeklarationen enthält.

Die Klasse stellt schreibgeschützte Eigenschaften bereit, mit denen man auf die Bestandteile der Entitätsdeklaration zugreifen kann: publicId, systemId, notationName (für nicht geparste Entitäten) sowie den internen Ersetzungstext. Im Gegensatz zur älteren DOMEntity-Klasse (aus der DOM-Erweiterung) verwendet diese Klasse den strengen PHP-8-Typansatz mit korrekten Nullability-Angaben.

Diese Klasse ist besonders relevant, wenn XML-Dokumente mit komplexen DTDs verarbeitet werden und man Metadaten über deklarierte Entitäten (z. B. für Validierung oder Dokumentinspektion) benötigt.

Beispiele

Entitätsdeklarationen aus einer DTD auslesen

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!ENTITY greet "Hallo Welt">
  <!ENTITY ext SYSTEM "http://example.com/extern.xml">
]>
<root>&greet;</root>
XML;

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

if ($doctype !== null) {
    $entities = $doctype->entities;
    foreach ($entities as $name => $entity) {
        /** @var Dom\Entity $entity */
        echo "Name: " . $entity->nodeName . "\n";
        echo "SystemId: " . ($entity->systemId ?? '(keine)') . "\n";
        echo "PublicId: " . ($entity->publicId ?? '(keine)') . "\n";
        echo "NotationName: " . ($entity->notationName ?? '(keine)') . "\n";
        echo "---\n";
    }
}
Name: greet SystemId: (keine) PublicId: (keine) NotationName: (keine) --- Name: ext SystemId: http://example.com/extern.xml PublicId: (keine) NotationName: (keine) ---

Prüfen ob eine bestimmte Entität in der DTD existiert

<?php
$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE doc [
  <!ENTITY copy "&#169;">
  <!ENTITY img SYSTEM "bild.gif" NDATA gif>
]>
<doc>&copy;</doc>
XML;

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

if ($entities !== null && $entities->getNamedItem('img') instanceof Dom\Entity) {
    $entity = $entities->getNamedItem('img');
    echo "Nicht geparste Entität gefunden.\n";
    echo "Notation: " . $entity->notationName . "\n";
    echo "System-ID: " . $entity->systemId . "\n";
}
Nicht geparste Entität gefunden. Notation: gif System-ID: bild.gif

// Wichtig · Fallstricke

Schreibschutz: Alle Eigenschaften von Dom\Entity sind read-only. Versuche, sie zu schreiben, führen zu einem Fehler. Entitätsdeklarationen können nur durch Manipulation der DTD selbst geändert werden, was die PHP-DOM-API nicht direkt unterstützt.

Sicherheitshinweis: Beim Verarbeiten von XML aus nicht vertrauenswürdigen Quellen sollte man auf XML External Entity (XXE)-Angriffe achten. Externe Entitäten (mit systemId) können dazu missbraucht werden, lokale Dateien auszulesen. Dom\XMLDocument::createFromString() deaktiviert in PHP 8.4 standardmäßig das Laden externer Entitäten.

Kompatibilität: Dom\Entity ist nicht identisch mit DOMEntity aus der älteren ext/dom-Erweiterung. Beide existieren parallel; Dom\Entity gehört zur neuen, spec-konformen DOM-Implementierung.