Signatur
Beschreibung
xmlwriter_write_dtd_element() erzeugt eine vollständige DTD-Elementdeklaration (<!ELEMENT ... >) im aktuellen XML-Stream. Dies entspricht dem kombinierten Aufruf von xmlwriter_start_dtd_element() und xmlwriter_end_dtd_element() in einem einzigen Schritt.
DTD-Elementdeklarationen definieren, welche Kindelemente und Textinhalte ein XML-Element enthalten darf. Der Parameter $content enthält dabei den Inhaltstyp oder das Inhaltsmodell, z. B. EMPTY, ANY, (#PCDATA) oder ein gemischtes Modell wie (title, body+).
Die Funktion ist nützlich, wenn man XML-Dokumente erzeugt, die eine eingebettete DTD-Deklaration enthalten sollen, etwa für die Weitergabe von XML-Daten an Systeme, die auf DTD-Validierung angewiesen sind.
In objektorientierten Code wird stattdessen die Methode XMLWriter::writeDtdElement() verwendet, die identisch funktioniert.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $writer Pflicht | XMLWriter | Die XMLWriter-Instanz, in die geschrieben wird. Wird mit xmlwriter_open_memory() oder xmlwriter_open_uri() erzeugt. |
|
| $name Pflicht | string | Der Name des DTD-Elements, das deklariert werden soll, z. B. 'book' oder 'chapter'. |
|
| $content Pflicht | string | Das Inhaltsmodell der Elementdeklaration, z. B. 'EMPTY', 'ANY', '(#PCDATA)' oder ein komplexes Modell wie '(title, para+)'. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler, etwa wenn kein aktiver DTD-Block geöffnet wurde.Beispiele
Einfaches XML-Dokument mit eingebetteter DTD
<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);
xmlwriter_set_indent_string($writer, ' ');
xmlwriter_start_document($writer, '1.0', 'UTF-8');
// DTD öffnen
xmlwriter_start_dtd($writer, 'library', null, null);
xmlwriter_write_dtd_element($writer, 'library', '(book+)');
xmlwriter_write_dtd_element($writer, 'book', '(title, author)');
xmlwriter_write_dtd_element($writer, 'title', '(#PCDATA)');
xmlwriter_write_dtd_element($writer, 'author', '(#PCDATA)');
xmlwriter_end_dtd($writer);
// Dokument-Inhalt
xmlwriter_start_element($writer, 'library');
xmlwriter_start_element($writer, 'book');
xmlwriter_write_element($writer, 'title', 'PHP Handbuch');
xmlwriter_write_element($writer, 'author', 'Max Mustermann');
xmlwriter_end_element($writer);
xmlwriter_end_element($writer);
xmlwriter_end_document($writer);
echo xmlwriter_output_memory($writer);
Objektorientierte Verwendung mit XMLWriter-Klasse
<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->setIndentString(' ');
$writer->startDocument('1.0', 'UTF-8');
$writer->startDtd('note');
$writer->writeDtdElement('note', '(to, from, message)');
$writer->writeDtdElement('to', '(#PCDATA)');
$writer->writeDtdElement('from', '(#PCDATA)');
$writer->writeDtdElement('message', '(#PCDATA)');
$writer->endDtd();
$writer->startElement('note');
$writer->writeElement('to', 'Anna');
$writer->writeElement('from', 'Bob');
$writer->writeElement('message', 'Hallo Welt!');
$writer->endElement();
$writer->endDocument();
echo $writer->outputMemory();
// Wichtig · Fallstricke
Reihenfolge beachten: xmlwriter_write_dtd_element() muss innerhalb eines geöffneten DTD-Blocks aufgerufen werden, also zwischen xmlwriter_start_dtd() und xmlwriter_end_dtd(). Andernfalls schlägt der Aufruf fehl und gibt false zurück.
Inhaltsmodell: Der $content-Parameter wird nicht validiert — es liegt in der Verantwortung des Entwicklers, ein syntaktisch korrektes DTD-Inhaltsmodell zu übergeben. Fehlerhafte Modelle können zu nicht wohlgeformten oder nicht validen DTDs führen.
Veraltete prozedurale API: Ab PHP 8.0 wird die objektorientierte Variante (XMLWriter::writeDtdElement()) bevorzugt. Die prozedurale Form ist weiterhin verfügbar, gilt aber als weniger modern.