Я хочу сгенерировать объявление 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();