PHP XMLWriter: Какие параметры мне нужно передать XMLWriter :: writeDtdEntity для генерации декларации DTD для вложенных объектов, как описано? - PullRequest
3 голосов
/ 23 августа 2011

Я хочу сгенерировать объявление 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 имеет следующие проблемы:

  1. ссылка на вложенный объект как PUBLIC, а не SYSTEM
  2. содержит пустую строку перед желаемым идентификатором SYSTEM
  3. не вставляет строку раскрытия сущности "% 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();

1 Ответ

2 голосов
/ 18 ноября 2013

Ну, я не эксперт в DTD, но я замечаю пару ошибок:

  • вы предоставляете значение для $publicId и $systemId в XMLWriter::startDTD.Вы должны предоставить NULL для $publicId, чтобы увидеть SYSTEM вместо PUBLIC.

  • вы путаете XMLWriter::writeDTD с XMLWriter::writeDTDEntity.Последний принимает только два параметра: имя сущности и значение сущности

Просто короткий пример с:

$oWriter = new XMLWriter();
$oWriter->openMemory();
$oWriter->setIndent(true);
$oWriter->setIndentString("\t");
$oWriter->startDocument("1.0", "UTF-8");
    // use null for $publicID to force SYSTEM
    $oWriter->startDtd('Example', null, 'http://www.example.org/example.dtd');
    $oWriter->writeDTDEntity('foo', 'bar');
    $oWriter->endDtd();
$oWriter->endDocument();
$sXML = $oWriter->outputMemory();

И результат такойожидается (обратите внимание на SYSTEM вместо PUBLIC):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Example
SYSTEM "http://www.example.org/example.dtd" [
    <!ENTITY foo "bar">
]>
...