这个问题已经在这里有一个答案:
- 解析大型XML文件中的PHP 7个回答
我要解析大型XML文件在PHP中,其中一个是6.5 MB,他们可能会更大。 SimpleXML扩展,因为我读过,加载整个文件到一个对象,这可能不是非常有效。 在你的经验,这将是最好的方法是什么?
这个问题已经在这里有一个答案:
我要解析大型XML文件在PHP中,其中一个是6.5 MB,他们可能会更大。 SimpleXML扩展,因为我读过,加载整个文件到一个对象,这可能不是非常有效。 在你的经验,这将是最好的方法是什么?
对于大文件,你要使用SAX解析器而非DOM解析器。
随着DOM解析器将在整个文件中读取并加载到一个对象树在内存中。 用SAX解析器,它会读取文件顺序,并调用用户定义的回调函数来处理数据(开始标记,结束标记,CDATA等)
用SAX解析器,你需要自己保持状态(例如你是什么标签目前),这使得它有点复杂,但对于一个大的文件时,它会更高效的内存明智的。
我对此采取:
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();
当使用DOMDocument
大的XML文件,不要忘记通过LIBXML_PARSEHUGE
国旗在选项load()
方法。 (同样适用于其他load
的方法DOMDocument
对象)
$checkDom = new \DOMDocument('1.0', 'UTF-8');
$checkDom->load($filePath, LIBXML_PARSEHUGE);
(用120mo XML文件的工作)
SAX解析器,埃里克Petroelje建议,将是大的XML文件更好。 整个XML文件中的DOM解析器加载并允许您运行的XPath queries--一个SAX(用于XML的简单API)解析器将只是一次读取一行,并给您挂钩点进行处理。
这真的取决于你想用数据做什么? 你需要它都在内存中,有效地使用它?
6.5 MB本来就不大,在今天的计算机术语。 你可以,例如, ini_set('memory_limit', '128M');
但是,如果你的数据的流,你可能想看看使用SAX解析器 。 这真的取决于您的使用需求。
SAX解析器是要走的路。 我发现SAX解析会导致混乱,如果你不保持组织。
我使用基于STX(流转换为XML)的方法来分析大的XML文件。 我用SAX方法构建SimpleXML对象来跟踪数据在当前的上下文(即不仅仅是根与当前节点之间的节点)。 其它功能随后用于处理所述的SimpleXML文档。
我需要解析碰巧有各行(StackOverflow的数据转储)元素的大型XML文件。 在该特定情况下,它足以一次读取文件的一行,并使用SimpleXML解析每一行。 对于我这个有没有学习任何新的优势。