最好的办法来处理大型XML在PHP [复制](Best way to process large X

2019-06-17 13:49发布

这个问题已经在这里有一个答案:

  • 解析大型XML文件中的PHP 7个回答

我要解析大型XML文件在PHP中,其中一个是6.5 MB,他们可能会更大。 SimpleXML扩展,因为我读过,加载整个文件到一个对象,这可能不是非常有效。 在你的经验,这将是最好的方法是什么?

Answer 1:

对于大文件,你要使用SAX解析器而非DOM解析器。

随着DOM解析器将在整个文件中读取并加载到一个对象树在内存中。 用SAX解析器,它会读取文件顺序,并调用用户定义的回调函数来处理数据(开始标记,结束标记,CDATA等)

用SAX解析器,你需要自己保持状态(例如你是什么标签目前),这使得它有点复杂,但对于一个大的文件时,它会更高效的内存明智的。



Answer 2:

我对此采取:

https://github.com/prewk/XmlStreamer

一个简单的类,将提取所有儿童的XML根元素,而流媒体文件。 经测试从pubmed.com 108 MB的XML文件。

class SimpleXmlStreamer extends XmlStreamer {
    public function processNode($xmlString, $elementName, $nodeIndex) {
        $xml = simplexml_load_string($xmlString);

        // Do something with your SimpleXML object

        return true;
    }
}

$streamer = new SimpleXmlStreamer("myLargeXmlFile.xml");
$streamer->parse();


Answer 3:

当使用DOMDocument大的XML文件,不要忘记通过LIBXML_PARSEHUGE国旗在选项load()方法。 (同样适用于其他load的方法DOMDocument对象)

    $checkDom = new \DOMDocument('1.0', 'UTF-8');
    $checkDom->load($filePath, LIBXML_PARSEHUGE);

(用120mo XML文件的工作)



Answer 4:

SAX解析器,埃里克Petroelje建议,将是大的XML文件更好。 整个XML文件中的DOM解析器加载并允许您运行的XPath queries--一个SAX(用于XML的简单API)解析器将只是一次读取一行,并给您挂钩点进行处理。

  • SAX示例: http://www.codemiles.com/php-tutorials/php-sax-parser-in-action-t1436.html


Answer 5:

这真的取决于你想用数据做什么? 你需要它都在内存中,有效地使用它?

6.5 MB本来就不大,在今天的计算机术语。 你可以,例如, ini_set('memory_limit', '128M');

但是,如果你的数据的流,你可能想看看使用SAX解析器 。 这真的取决于您的使用需求。



Answer 6:

SAX解析器是要走的路。 我发现SAX解析会导致混乱,如果你不保持组织。

我使用基于STX(流转换为XML)的方法来分析大的XML文件。 我用SAX方法构建SimpleXML对象来跟踪数据在当前的上下文(即不仅仅是根与当前节点之间的节点)。 其它功能随后用于处理所述的SimpleXML文档。



Answer 7:

我需要解析碰巧有各行(StackOverflow的数据转储)元素的大型XML文件。 在该特定情况下,它足以一次读取文件的一行,并使用SimpleXML解析每一行。 对于我这个有没有学习任何新的优势。



文章来源: Best way to process large XML in PHP [duplicate]