Start · Sprachen · PHP · Referenz · xmlwriter_write_dtd

xmlwriter_write_dtd

Funktion

Schreibt ein vollständiges DTD-Tag (<code>&lt;!DOCTYPE ...&gt;</code>) in den XML-Ausgabestrom des <code>XMLWriter</code>-Objekts.

seit PHP 5.1.2 Kategorie: xml

Signatur

xmlwriter_write_dtd(XMLWriter $writer, string $name, ?string $publicId = null, ?string $systemId = null, ?string $content = null): bool

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

Typ
bool
Beschreibung
Gibt 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);
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root> <root> <item>Hallo Welt</item> </root>

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();
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Beispiel</title> </head> <body> <p>Hallo XHTML!</p> </body> </html>

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();
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE katalog [ <!ELEMENT katalog (produkt+)> <!ELEMENT produkt (#PCDATA)>]> <katalog> <produkt>PHP-Buch</produkt> </katalog>

// 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.