Domanda

Nel modo in cui è strutturata la mia applicazione, ogni componente genera output come XML e restituisce un oggetto XmlWriter. Prima di eseguire il rendering dell'output finale sulla pagina, unisco tutto l'XML ed eseguo una trasformazione XSL su quell'oggetto. Di seguito è riportato un esempio di codice semplificato della struttura dell'applicazione.

Ha senso combinare oggetti XmlWriter in questo modo? Esiste un modo migliore per strutturare la mia domanda? La soluzione ottimale sarebbe quella in cui non dovevo passare una singola istanza XmlWriter come parametro a ciascun 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);

Aggiornamento:
Potrei abbandonare del tutto XmlWriter e usare invece DomDocument. È più flessibile e sembra anche funzionare meglio (almeno sui test grezzi che ho creato).

È stato utile?

Soluzione 2

Non ho mai visto nessuno combinare oggetti XmlWriter in questo modo e non credo sia molto efficace per quello che sto cercando di fare. Ho deciso che l'approccio migliore sarebbe usare DOMDocument invece. La differenza è: DOMDocument non genera alcun XML fino a quando non viene generato, mentre XmlWriter è fondamentalmente un StringBuilder e non è così flessibile.

Altri suggerimenti

in questa architettura preferirei passare una raccolta di Writers all'output, lungo le linee di

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

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

Avrei page1Xml e generateSiteMap ottenere uno scrittore come input e restituirlo come output

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top