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 元素。这就是为什么它会自动清理(例如替换&&amp;)作为第二个参数传递给它的内容的内容。

一种可能的解决方案是改用XMLWriter::writeRaw方法,因为它按原样写入内容 - 无需任何清理。显然它不会验证其输入,但在您的情况下,它似乎不是问题(因为您正在使用已经检查过的源)。

于 2012-11-10T12:58:27.183 回答
-2

嗯,不知道为什么将它转换为 HTML 字符,但你可以像这样解码它

htmlspecialchars_decode($data);

它将特殊的 HTML 实体转换回字符。

于 2012-11-10T12:24:19.953 回答