1

私のアプリケーションの構造では、各コンポーネントが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を使用する場合があります。それはより柔軟性があり、パフォーマンスも優れているように見えました(少なくとも私が作成した大まかなテストでは)。

4

3 に答える 3

2

このアーキテクチャでは、ライターのコレクションを出力に渡したいと思います。

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

 output(array(page1(), siteMap(), whateverElse()))
于 2009-11-30T00:23:50.190 に答える
0

この方法で XmlWriter オブジェクトを組み合わせている人を実際に見たことはありません。代わりに DOMDocument を使用するのが最善の方法であると判断しました。違いは、DOMDocument は出力するまで XML を生成しないのに対し、XmlWriter は基本的に StringBuilder であり、それほど柔軟ではありません。

于 2009-12-03T05:09:00.420 に答える
0

page1Xml と generateSiteMap でライターを入力として取得し、それを出力として返します。

于 2010-06-16T12:46:18.057 に答える