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 & COMPANY</AddrLine1>
<AddrLine2>DESCAP DIVISION</AddrLine2>

谁能解释如何从 XML 文件中获取内容并将它们正确写入新文件?

我对此感到厌烦,我知道这将是我缺少的一些简单的东西。

谢谢。 罗伯特

【问题讨论】:

【参考方案1】:

看,问题在于XMLWriter::writeElement 旨在编写一个完整的 XML 元素。这就是为什么它会自动清理(例如,将 & 替换为 &)作为第二个参数传递给它的内容。

一种可能的解决方案是改用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 上执行不同

php+mssql 和 php+mysql 优点缺点

php变量和数据类型

php [php:error / exception] php的错误和异常备忘录。 #PHP

PHP常见概念混淆之PHP类常量静态属性和属性的区别

并行运行 php5 和 php7