XmlWriter nesneleri birleştirme?

3 Cevap php

Benim uygulama yapılandırılmıştır yolu, her bir bileşen XML olarak çıktı üretir ve bir XmlWriter nesne döndürür. Sayfa son çıkış render önce, tüm XML birleştirmek ve bu nesne üzerinde bir XSL dönüşümü gerçekleştirmek. Aşağıda, uygulama yapısının basitleştirilmiş bir kod örneği.

Böyle XmlWriter nesneleri birleştirmek için mantıklı mı? Benim uygulama yapısı için daha iyi bir yolu var mı? Optimal çözüm ben her bir bileşen için parametre olarak tek bir XmlWriter örneği geçmek yoktu biri olacaktır.

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


Update:
I may abandon XmlWriter altogether and use DomDocument instead. It is more flexible and it also seemed to perform better (at least on the crude tests I created).

3 Cevap

Ben aslında herkesin XmlWriter nesneleri bu şekilde birleştirmek hiç görmedim ve bunu ben yapmak ne çalışıyorum için çok etkili olduğunu düşünmüyorum. Ben iyi yaklaşım yerine DOMDocument kullanmak olacaktır karar verdi. Fark: XmlWriter temelde bir StringBuilder ve esnek değildir oysa DOMDocument, sizin kadar çıkış herhangi bir XML oluşturmaz.

Bu mimaride ben oldukça çizgisinde, çıkış Yazarlar koleksiyonu geçerdi

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

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

Ben page1Xml ve generateSiteMap girdi olarak bir yazar almak var, ve çıkış olarak dönecekti