PHP 和 XMLWriter
Posted
技术标签:
【中文标题】PHP 和 XMLWriter【英文标题】:PHP and XMLWriter 【发布时间】:2012-11-10 12:07:08 【问题描述】:我成功使用以下代码将多个大型 XML 文件合并到一个新的(更大的)XML 文件中。在 *** 上至少找到了部分内容
$docList = new DOMDocument(); $root = $docList->createElement('documents'); $docList->appendChild($root); $doc = new DOMDocument(); foreach(xmlFilenames as $xmlfilename) $doc->load($xmlfilename); $xmlString = $doc->saveXML($doc->documentElement); $xpath = new DOMXPath($doc); $query = self::getQuery(); // this is the name of the ROOT element $nodelist = $xpath->evaluate($query, $doc->documentElement); if( $nodelist->length > 0 ) $node = $docList->importNode($nodelist->item(0), true); $xmldownload = $docList->createElement('document'); if (self::getShowFileName()) $xmldownload->setAttribute("filename", $filename); $xmldownload->appendChild($node); $root->appendChild($xmldownload); $newXMLFile = self::getNewXMLFile(); $docList->save($newXMLFile);
当文件数量随着文件大小的增加而增加时,我开始遇到内存不足问题。
我发现一篇文章here 解释了这个问题并推荐使用 XMLWriter
所以,现在尝试使用 php XMLWriter 将多个大型 XML 文件合并到一个新的(更大的)XML 文件中。稍后,我将对新文件执行 xpath。
代码:
$xmlWriter = new XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->openUri('mynewFile.xml'); $xmlWriter->setIndent(true); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('documents'); $doc = new DOMDocument(); foreach($xmlfilenames as $xmlfilename) $fileContents = file_get_contents($xmlfilename); $xmlWriter->writeElement('document',$fileContents); $xmlWriter->endElement(); $xmlWriter->endDocument(); $xmlWriter->flush();
好吧,生成的(新)xml 文件不再正确,因为元素被转义了 - 即
<CONFIRMOWNX>
<Confirm>
<LglVeh id="GLE">
<AddrLine1>GLEACHER &amp; COMPANY</AddrLine1>
<AddrLine2>DESCAP DIVISION</AddrLine2>
谁能解释如何从 XML 文件中获取内容并将它们正确写入新文件?
我对此感到厌烦,我知道这将是我缺少的一些简单的东西。
谢谢。 罗伯特
【问题讨论】:
【参考方案1】:看,问题在于XMLWriter::writeElement 旨在编写一个完整的 XML 元素。这就是为什么它会自动清理(例如,将 &amp;
替换为 &amp;
)作为第二个参数传递给它的内容。
一种可能的解决方案是改用XMLWriter::writeRaw 方法,因为它按原样写入内容 - 没有任何清理。显然它不会验证其输入,但在您的情况下,它似乎不是问题(因为您正在使用已经检查过的源)。
【讨论】:
XMLWriter::writeRaw 为我解决了问题。尝试过一次但使用不正确,因为它只需要一个参数 - 即 XMLWriter::writeRaw (string $content)。谢谢!【参考方案2】:嗯,不知道为什么要把它转换成 html 字符,但你可以像这样解码它
htmlspecialchars_decode($data);
它将特殊的 HTML 实体转换回字符。
【讨论】:
试过 $xmlWriter->writeElement('document', htmlspecialchars_decode($fileContents)); -- 运气不好以上是关于PHP 和 XMLWriter的主要内容,如果未能解决你的问题,请参考以下文章
PHP:写入时复制和通过引用分配在 PHP5 和 PHP7 上执行不同