2

次のコードを使用して、複数の大きな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"?>

&lt;CONFIRMOWNX&gt;
&lt;Confirm&gt;
&lt;LglVeh id=&quot;GLE&quot;&gt;
&lt;AddrLine1&gt;GLEACHER &amp;amp; COMPANY&lt;/AddrLine1&gt;
&lt;AddrLine2&gt;DESCAP DIVISION&lt;/AddrLine2&gt;

XMLファイルからコンテンツを取得して新しいファイルに適切に書き込む方法を誰かが説明できますか?

私はこれに夢中になっていて、それが私が見逃している単純なものになることを知っています。

ありがとう。ロバート

4

2 に答える 2

4

問題は、XMLWriter::writeElementが完全なXML要素を書き込むことを目的としていることです。そのため、2番目のパラメーターとして渡された内容を自動的にサニタイズします(たとえば、に&置き換えます)。&amp;

考えられる解決策の1つは、代わりにXMLWriter :: writeRawメソッドを使用することです。これは、サニタイズせずにコンテンツをそのまま書き込むためです。明らかに、入力を検証しませんが、あなたの場合は問題ではないようです(すでにチェックされたソースで作業しているため)。

于 2012-11-10T12:58:27.183 に答える
-2

うーん、なぜそれがHTML文字に変換されるのかわかりませんが、そのようにデコードすることができます

htmlspecialchars_decode($ data);

特別なHTMLエンティティを文字に変換し直します。

于 2012-11-10T12:24:19.953 に答える