Я хочу сгенерировать объявление DTD для вложенных объектов поверх XML-документа с помощью XMLWriter. Я начал с простого строкового кода без XMLWriter, который также иллюстрирует желаемый результат:
<?php
$sXML = "<!DOCTYPE Example PUBLIC \"urn:example:example.org:20110823:Example\"\n";
$sXML .= "\"http://www.example.org/example.dtd\" [\n";
$sXML .= "<!ENTITY % nestedentity SYSTEM ";
$sXML .= "\"http://www.example.org/nestedentity.dtd\">\n";
$sXML .= "%nestedentity;\n";
$sXML .= "]>\n";
Текущий (Требуемый) $ sXML Выход:
<!DOCTYPE Example PUBLIC "urn:example:example.org:20110823:Example"
"http://www.example.org/example.dtd" [
<!ENTITY % anentity SYSTEM "http://www.example.org/nestedentity.dtd">
%anentity;
]>
Текущий вывод XMLWriter $ sXML (код ниже):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Example
PUBLIC "urn:example:example.org:20110823:Example"
"http://www.example.org/example.dtd" [
<!ENTITY % anentity PUBLIC "" "http://www.example.org/nestedentity.dtd">
]>
Как видите, текущий вывод XML кода XMLWriter имеет следующие проблемы:
- ссылка на вложенный объект как PUBLIC, а не SYSTEM
- содержит пустую строку перед желаемым идентификатором SYSTEM
- не вставляет строку раскрытия сущности "% anentity;" до закрытия объявления DOCTYPE.
Итак, вопрос в том, как мне вызвать $oXMLWriter->writeDtdEntity
, чтобы отображалась строка XML, отображаемая в разделе «Текущий (требуемый) $sXML
Вывод» (игнорируя различия только в пробелах)
Текущий код XMLWriter:
<?php
$oWriter = new XMLWriter();
$oWriter->openMemory();
$oWriter->setIndent(true);
$oWriter->setIndentString("\t");
$oWriter->startDocument("1.0", "UTF-8");
$oWriter->startDtd('Example','urn:example:example.org:20110823:Example', 'http://www.example.org/example.dtd');
$oWriter->writeDtdEntity(
'nestedentity',
'%nestedentity;\n',
true,
null,
'http://www.example.org/nestedentity.dtd'
);
$oWriter->endDtd();
$oWriter->endDocument();
$sXML = $oWriter->outputMemory();