Signatur
Beschreibung
xmlwriter_write_dtd() erzeugt und schreibt ein vollständiges DTD-Tag (Document Type Declaration) in einem einzigen Schritt. Das Tag wird direkt in den internen Puffer des übergebenen XMLWriter-Objekts geschrieben. Es kombiniert intern den Start und das Ende der DTD, sodass keine separaten Aufrufe für Beginn und Ende notwendig sind.
Die Funktion ist nützlich, wenn eine XML-Datei mit einer einfachen DOCTYPE-Deklaration ohne interne Untermengen (Internal Subset) erzeugt werden soll. Soll der DOCTYPE auch interne DTD-Deklarationen (z. B. ELEMENT- oder ATTLIST-Deklarationen) enthalten, sollten stattdessen xmlwriter_start_dtd() und xmlwriter_end_dtd() in Kombination mit weiteren DTD-Schreibfunktionen verwendet werden.
Der Parameter $publicId erlaubt die Angabe eines Public Identifiers (z. B. für XHTML-Dokumente), während $systemId auf eine externe DTD-Datei verweist. Der Parameter $content ermöglicht das Einfügen eines internen Subsets direkt in die DTD-Deklaration.
Die prozedurale Variante erwartet als erstes Argument eine XMLWriter-Ressource bzw. ab PHP 8.0 ein XMLWriter-Objekt. Die objektorientierte Alternative lautet $writer->writeDtd().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $writer Pflicht | XMLWriter | Das XMLWriter-Objekt, in das geschrieben wird. In PHP 8.0+ immer ein Objekt; davor eine Ressource. |
|
| $name Pflicht | string | Der Name des Dokumenttyps, also das Root-Element des XML-Dokuments (z. B. 'html' oder 'root'). |
|
| $publicId | ?string | null | Optionaler Public Identifier der DTD (z. B. '-//W3C//DTD XHTML 1.0 Strict//EN'). Wird null übergeben, wird kein Public Identifier ausgegeben. |
| $systemId | ?string | null | Optionaler System Identifier, meist eine URL zur externen DTD-Datei (z. B. 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'). |
| $content | ?string | null | Optionaler Inhalt des internen Subsets. Wird als Inhalt zwischen [ und ] in die DTD-Deklaration eingebettet. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der XMLWriter nicht korrekt initialisiert wurde).Beispiele
Einfaches DTD-Tag ohne Public- und System-ID
<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);
// XML-Deklaration
xmlwriter_start_document($writer, '1.0', 'UTF-8');
// DTD nur mit Root-Element-Name
xmlwriter_write_dtd($writer, 'root');
// Root-Element
xmlwriter_start_element($writer, 'root');
xmlwriter_write_element($writer, 'item', 'Hallo Welt');
xmlwriter_end_element($writer);
xmlwriter_end_document($writer);
echo xmlwriter_output_memory($writer);
DTD mit Public- und System-ID für XHTML 1.0 Strict
<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
// Vollständige DOCTYPE-Deklaration für XHTML 1.0 Strict
$writer->writeDtd(
'html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
);
$writer->startElement('html');
$writer->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
$writer->startElement('head');
$writer->writeElement('title', 'Beispiel');
$writer->endElement(); // head
$writer->startElement('body');
$writer->writeElement('p', 'Hallo XHTML!');
$writer->endElement(); // body
$writer->endElement(); // html
$writer->endDocument();
echo $writer->outputMemory();
DTD mit internem Subset (content)
<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
// DTD mit internem Subset
$writer->writeDtd(
'katalog',
null,
null,
'<!ELEMENT katalog (produkt+)> <!ELEMENT produkt (#PCDATA)>'
);
$writer->startElement('katalog');
$writer->writeElement('produkt', 'PHP-Buch');
$writer->endElement();
$writer->endDocument();
echo $writer->outputMemory();
// Wichtig · Fallstricke
Reihenfolge beachten: Das DTD-Tag muss nach der XML-Deklaration (xmlwriter_start_document()) und vor dem Root-Element eingefügt werden, da es sonst ein ungültiges XML-Dokument erzeugt.
Komplexe DTDs: Werden viele interne DTD-Deklarationen (ELEMENT, ATTLIST, ENTITY usw.) benötigt, empfiehlt sich die Kombination aus xmlwriter_start_dtd(), den spezifischen DTD-Element-Funktionen und xmlwriter_end_dtd(), da xmlwriter_write_dtd() für diese Fälle schnell unübersichtlich wird.
PHP 8.0: Ab PHP 8.0 wird der erste Parameter immer als XMLWriter-Objekt übergeben. Die frühere Ressource-basierte API ist veraltet und wurde entfernt.