我使用以下代码成功地将多个大型文件合并到一个新的(更大的)文件中,这是成功的。至少在StackOverflow上找到了其中的一部分
$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);
随着文件数量的增加,以及文件大小的增加,我开始遇到内存不足的问题。
我找到了一篇这里文章,它解释了这个问题,并推荐使用XMLWriter
因此,现在尝试使用PHP将多个大型XMLWriter文件合并到一个新的(更大的) XML文件中。稍后,我将对新文件执行xpath。
代码:
$xmlWriter =新的XMLWriter();$xmlWriter->openMemory();$xmlWriter->openUri('mynewFile.xml');$xmlWriter->setIndent(真);$xmlWriter->startDocument('1.0','UTF-8');$xmlWriter->startElement('documents');$doc =新DOMDocument();foreach($xmlfilenames as $xmlfilename) { $fileContents = file_get_contents($xmlfilename);$xmlWriter->写endElement(‘document’,$fileContents);} $xmlWriter->endElement();$xmlWriter->endElement();$xmlWriter->file_get_contents($xmlfilename);
好的,结果(新的) xml文件不再是正确的,因为元素是转义的。
<CONFIRMOWNX>
<Confirm>
<LglVeh id="GLE">
<AddrLine1>GLEACHER &amp; COMPANY</AddrLine1>
<AddrLine2>DESCAP DIVISION</AddrLine2>有人能解释如何从XML文件中获取内容并正确地将它们写入新文件吗?
我对这件事很感兴趣,我知道我会错过一些简单的东西。
谢谢。罗伯特
发布于 2012-11-10 12:58:27
问题是,XMLWriter::writeElement的目的是编写一个完整的XML元素。这就是为什么它会自动清除(例如,用&替换为& )传递给它的内容作为第二个param。
一种可能的解决方案是使用XMLWriter::writeRaw方法代替,因为它按原样写入内容,而不进行任何消毒。显然,它没有验证其输入,但在您的示例中,它似乎不是一个问题(因为您正在使用已经检查过的源)。
发布于 2012-11-10 12:24:19
嗯,不知道为什么要把它转换成HTML字符,但是您可以这样对它进行解码
htmlspecialchars_decode($data);
它将特殊的HTML实体转换回字符。
https://stackoverflow.com/questions/13321892
复制相似问题