Start · Sprachen · PHP · Referenz · xmlwriter_write_dtd_element

xmlwriter_write_dtd_element

Funktion

Schreibt ein vollständiges DTD-Elementdeklaration in einen XML-Stream.

seit PHP 5.1.2 Kategorie: xml

Signatur

xmlwriter_write_dtd_element(XMLWriter $writer, string $name, string $content): bool

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

Typ
bool
Beschreibung
Gibt 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);
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE library [ <!ELEMENT library (book+)> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> ]> <library> <book> <title>PHP Handbuch</title> <author>Max Mustermann</author> </book> </library>

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();
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note (to, from, message)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT message (#PCDATA)> ]> <note> <to>Anna</to> <from>Bob</from> <message>Hallo Welt!</message> </note>

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