Start · Sprachen · PHP · Referenz · Dom\Notation

Dom\Notation

Klasse

Repräsentiert eine in der DTD (Document Type Definition) deklarierte Notation gemäß dem W3C-DOM-Standard.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\Notation extends Dom\Node

Beschreibung

Dom\Notation ist Teil der modernen, namensraumbasierten DOM-Erweiterung (ext-dom) und entspricht dem Notation-Interface aus der W3C-DOM-Spezifikation. Eine Notation beschreibt das Format einer unparsed Entity oder die Zielanwendung eines Processing Instructions und wird innerhalb der DTD eines XML-Dokuments deklariert.

Notationen können über die Dom\DocumentType-Klasse und deren notations-Eigenschaft aus einem geparsten XML-Dokument ausgelesen werden. Die Klasse stellt die beiden Eigenschaften publicId und systemId bereit, die den öffentlichen bzw. den System-Bezeichner der Notation enthalten.

In der Praxis sind Notationen ein eher selten genutztes XML-Feature. Sie treten vor allem in älteren SGML-nahen Dokumentstrukturen auf, beispielsweise um externe Binärdaten wie Bilder oder spezielle Dateiformate zu referenzieren. Der Einsatz von Dom\Notation ist sinnvoll, wenn ein XML-Dokument analysiert oder validiert werden soll, das DTD-Notationen enthält.

Objekte dieser Klasse werden nicht direkt instanziiert; sie entstehen ausschließlich durch das Parsen eines XML-Dokuments über Dom\XMLDocument::createFromString() oder Dom\XMLDocument::createFromFile(), sofern das Dokument eine DTD mit Notation-Deklarationen besitzt.

Beispiele

Notationen aus einer DTD auslesen

<?php
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc [
  <!NOTATION gif SYSTEM "image/gif">
  <!NOTATION png PUBLIC "-//W3C//NOTATION PNG 1.0//EN" "image/png">
]>
<doc></doc>
XML;

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

if ($doctype !== null) {
    foreach ($doctype->notations as $notation) {
        echo 'Name:      ' . $notation->nodeName . PHP_EOL;
        echo 'PublicId:  ' . ($notation->publicId  ?? '(leer)') . PHP_EOL;
        echo 'SystemId:  ' . ($notation->systemId  ?? '(leer)') . PHP_EOL;
        echo str_repeat('-', 40) . PHP_EOL;
    }
}
Name: gif PublicId: (leer) SystemId: image/gif ---------------------------------------- Name: png PublicId: -//W3C//NOTATION PNG 1.0//EN SystemId: image/png ----------------------------------------

Prüfen ob ein bestimmte Notation vorhanden ist

<?php
$xml = <<<'XML'
<?xml version="1.0"?>
<!DOCTYPE root [
  <!NOTATION svg SYSTEM "image/svg+xml">
]>
<root/>
XML;

$document = Dom\XMLDocument::createFromString($xml);
$notations = $document->doctype?->notations;

$gesucht = 'svg';
$gefunden = false;

if ($notations !== null) {
    foreach ($notations as $notation) {
        if ($notation->nodeName === $gesucht) {
            $gefunden = true;
            echo "Notation '{$gesucht}' gefunden (SystemId: {$notation->systemId})" . PHP_EOL;
            break;
        }
    }
}

if (!$gefunden) {
    echo "Notation '{$gesucht}' nicht gefunden." . PHP_EOL;
}
Notation 'svg' gefunden (SystemId: image/svg+xml)

// Wichtig · Fallstricke

Keine direkte Instanziierung: Dom\Notation-Objekte können nicht mit new erstellt werden. Sie entstehen ausschließlich beim Parsen eines XML-Dokuments mit DTD-Deklarationen.

Nur lesend: Gemäß DOM-Standard sind die Eigenschaften publicId und systemId schreibgeschützt. Eine programmatische Erstellung oder Veränderung von Notationen über die DOM-API wird nicht unterstützt.

Unterschied zur alten DOM-Erweiterung: Die Klasse Dom\Notation gehört zur neuen, PHP-8.4-nativen DOM-Implementierung. Die ältere Klasse DOMNotation (ohne Namensraum) existiert weiterhin für Abwärtskompatibilität, entspricht aber nicht vollständig dem aktuellen W3C-Standard.