Объединение объектов XmlWriter? - PullRequest
1 голос
/ 30 ноября 2009

При структурировании моего приложения каждый компонент генерирует вывод в виде XML и возвращает объект XmlWriter. Перед рендерингом окончательного вывода на страницу я объединяю весь XML и выполняю XSL-преобразование для этого объекта. Ниже приведен упрощенный пример кода структуры приложения.

Имеет ли смысл объединять объекты XmlWriter следующим образом? Есть ли лучший способ структурировать мое приложение? Оптимальным решением было бы то, где мне не нужно было передавать один экземпляр XmlWriter в качестве параметра каждому компоненту.

function page1Xml() {
 $content = new XmlWriter();
 $content->openMemory();
 $content->startElement('content');
 $content->text('Sample content');
 $content->endElement();
 return $content;
}

function generateSiteMap() {
 $sitemap = new XmlWriter();
 $sitemap->openMemory();
 $sitemap->startElement('sitemap');
 $sitemap->startElement('page');
 $sitemap->writeAttribute('href', 'page1.php');
 $sitemap->text('Page 1');
 $sitemap->endElement();
 $sitemap->endElement();
 return $sitemap;
}

function output($content)
{
 $doc = new XmlWriter();
 $doc->openMemory();
 $doc->writePi('xml-stylesheet', 'type="text/xsl" href="template.xsl"'); 
 $doc->startElement('document');

 $doc->writeRaw( generateSiteMap()->outputMemory() );
 $doc->writeRaw( $content->outputMemory() );

 $doc->endElement();
 $doc->endDocument();

 $output = xslTransform($doc);
 return $output;
}

$content = page1Xml();
echo output($content);

Обновление:
Я могу вообще отказаться от XmlWriter и использовать DomDocument. Он более гибкий, и, похоже, он работает лучше (по крайней мере, на грубых тестах, которые я создал).

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

в этой архитектуре я предпочел бы передать коллекцию Writers для вывода, как

 function output($ary) {
     .....
     foreach($ary as $w) $doc->writeRaw($w->outputMemory());
     .....
 }

 output(array(page1(), siteMap(), whateverElse()))
0 голосов
/ 16 июня 2010

Я бы использовал page1Xml и generateSiteMap, чтобы получить писатель в качестве ввода и вернуть его в качестве вывода

0 голосов
/ 03 декабря 2009

Я никогда не видел, чтобы кто-нибудь комбинировал объекты XmlWriter таким образом, и я не думаю, что это очень эффективно для того, что я пытаюсь сделать. Я решил, что лучшим подходом будет использование DOMDocument. Разница в том, что DOMDocument не генерирует XML до тех пор, пока вы не выводите, тогда как XmlWriter в основном является StringBuilder и не так гибок.

...