次のコードを使用して、複数の大きなXMLファイルを新しい(より大きな)XMLファイルにマージすることに成功しました。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ファイルを新しい(より大きな)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ファイルは、要素がエスケープされているため、正しくありません。つまり、<?xml version = "1.0" encoding = "UTF-8"?>
<CONFIRMOWNX>
<Confirm>
<LglVeh id="GLE">
<AddrLine1>GLEACHER &amp; COMPANY</AddrLine1>
<AddrLine2>DESCAP DIVISION</AddrLine2>
XMLファイルからコンテンツを取得して新しいファイルに適切に書き込む方法を誰かが説明できますか?
私はこれに夢中になっていて、それが私が見逃している単純なものになることを知っています。
ありがとう。ロバート