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

在这种架构中,我宁愿将一组 Writers 传递给输出,沿着

 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 回答