2009-11-29 23 views
1

La façon dont mon application est structurée, chaque composant génère une sortie en XML et renvoie un objet XmlWriter. Avant de rendre la sortie finale à la page, je combine tout le XML et effectue une transformation XSL sur cet objet. Ci-dessous, un exemple de code simplifié de la structure de l'application.Combinaison d'objets XmlWriter?

Est-il logique de combiner des objets XmlWriter comme ça? Y a-t-il une meilleure façon de structurer ma demande? La solution optimale serait celle où je n'aurais pas à passer une seule instance XmlWriter en tant que paramètre à chaque composant.

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

Mise à jour:
j'abandonner tout à fait XmlWriter et utiliser DomDocument à la place. Il est plus flexible et il a également semblé fonctionner mieux (au moins sur les tests bruts que j'ai créés).

Répondre

0

Je n'ai jamais vu quelqu'un combiner des objets XmlWriter cette façon et je ne pense pas que ce soit très efficace pour ce que j'essaie de faire. J'ai décidé que la meilleure approche serait d'utiliser DOMDocument à la place. La différence est la suivante: DOMDocument ne génère aucun code XML avant la sortie, alors que XmlWriter est fondamentalement un StringBuilder et n'est pas aussi flexible.

2

dans cette architecture, je préfère passer une collection d'écrivains à la sortie, le long des lignes de

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

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

Je voudrais que page1Xml et generateSiteMap obtiennent un écrivain comme entrée, et le retournent comme sortie