Pregunta

La forma en que está estructurada mi aplicación, cada componente genera resultados como XML y devuelve un objeto XmlWriter. Antes de representar el resultado final en la página, combino todo XML y realizo una transformación XSL en ese objeto. A continuación, se muestra una muestra de código simplificado de la estructura de la aplicación.

¿Tiene sentido combinar objetos XmlWriter como este? ¿Hay una mejor manera de estructurar mi aplicación? La solución óptima sería aquella en la que no tuviera que pasar una sola instancia de XmlWriter como parámetro a cada componente.

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);

Actualización:
Puedo abandonar XmlWriter por completo y usar DomDocument en su lugar. Es más flexible y también parecía funcionar mejor (al menos en las crudas pruebas que creé).

¿Fue útil?

Solución 2

Nunca he visto a nadie combinar objetos XmlWriter de esta manera y no creo que sea muy eficiente para lo que estoy tratando de hacer. Decidí que el mejor enfoque sería usar DOMDocument en su lugar. La diferencia es: DOMDocument no genera ningún XML hasta la salida, mientras que XmlWriter es básicamente un StringBuilder y no es tan flexible.

Otros consejos

en esta arquitectura prefiero pasar una colección de Escritores a la salida, en la línea de

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

 output(array(page1(), siteMap(), whateverElse()))

Tendría page1Xml y generateSiteMap para obtener un escritor como entrada y devolverlo como salida

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top