在PHP中处理大型XML的最佳方法

Pet*_*uza 27 php xml parsing simplexml large-files

我必须解析php中的大型XML文件,其中一个是6.5 MB,它们甚至可能更大.正如我所读到的SimpleXML扩展,将整个文件加载到一个对象中,这可能效率不高.根据您的经验,最好的方法是什么?

Eri*_*lje 22

对于大文件,您将需要使用SAX解析器而不是DOM解析器.

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

使用SAX解析器,您需要自己维护状态(例如,您当前使用的是什么标记),这使得它更复杂,但对于大文件,它将更加高效地记忆.


osk*_*rth 11

我接受它:

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();
Run Code Online (Sandbox Code Playgroud)

  • 哇!在10分钟内,我得到了4GB XML文件.和煦. (4认同)

COi*_*Oil 7

使用DOMDocument带有大型XML文件时,请不要忘记LIBXML_PARSEHUGEload()方法的选项中传递标志.(同样适用于对象的其他load方法DOMDocument)

    $checkDom = new \DOMDocument('1.0', 'UTF-8');
    $checkDom->load($filePath, LIBXML_PARSEHUGE);
Run Code Online (Sandbox Code Playgroud)

(适用于120mo XML文件)


小智 6

正如Eric Petroelje建议的那样,SAX Parser对于大型XML文件会更好.DOM解析器加载整个XML文件并允许您运行xpath查询 - SAX(XML的简单API)解析器将一次只读取一行并为您提供钩点以进行处理.