XmlWriterオブジェクトを結合しますか?
-
08-07-2019 - |
質問
アプリケーションの構成方法では、各コンポーネントは出力をXMLとして生成し、XmlWriterオブジェクトを返します。最終出力をページにレンダリングする前に、すべてのXMLを結合し、そのオブジェクトでXSL変換を実行します。以下は、アプリケーション構造の単純化されたコードサンプルです。
XmlWriterオブジェクトをこのように組み合わせるのは理にかなっていますか?アプリケーションを構成するより良い方法はありますか?最適なソリューションは、1つの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を使用できます。それはより柔軟であり、パフォーマンスも優れているように見えました(少なくとも私が作成した粗テストでは)。
解決 2
XmlWriterオブジェクトをこのように組み合わせた人は実際には見たことがありませんし、私がやろうとしていることに対してそれが非常に効率的だとは思いません。代わりにDOMDocumentを使用するのが最良のアプローチだと判断しました。違いは、出力するまでDOMDocumentはXMLを生成しませんが、XmlWriterは基本的にStringBuilderであり、それほど柔軟ではありません。
他のヒント
このアーキテクチャでは、次の行に沿ってライターのコレクションを出力に渡します
function output($ary) {
.....
foreach($ary as $w) $doc->writeRaw($w->outputMemory());
.....
}
output(array(page1(), siteMap(), whateverElse()))
page1XmlとgenerateSiteMapで入力としてライターを取得し、出力として返す
所属していません StackOverflow