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

我必须parsingPHP中的大型XML文件,其中一个是6.5 MB,他们可能会更大。 我读过的SimpleXML扩展将整个文件加载到一个对象中,这可能不是很有效。 根据你的经验,最好的方法是什么?

对于一个大文件,您将需要使用SAXparsing器而不是DOMparsing器。

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

使用SAXparsing器,您需要自己维护状态(例如,您当前在使用什么标签),这使得它更加复杂一些,但是对于大型文件来说,它会更有效率的记忆。

我承担:

https://github.com/prewk/XmlStreamer

一个简单的类,将stream式传输文件时将所有的孩子提取到XML根元素。 testing来自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(); 

正如Eric Petroelje所build议的,SAX Parser对于大型XML文件来说更好。 DOMparsing器加载到整个XML文件中,并允许您运行xpath查询 – SAX(Simple API for XML)parsing器将一次只读取一行,并为您提供处理的钩点。

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

对大XML文件使用DOMDocument时,不要忘记在load()方法的选项中传递LIBXML_PARSEHUGE标志。 (同样适用于DOMDocument对象的其他load方法)

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

(与120mo XML文件一起使用)

这真的取决于你想要对数据做什么? 你是否需要所有的记忆来有效地使用它?

就今天的电脑而言,6.5 MB并不是那么大。 你可以,例如, ini_set('memory_limit', '128M');

但是,如果您的数据可以stream式传输,则可能需要使用SAXparsing器 。 这真的取决于您的使用需求。

SAXparsing器是要走的路。 我发现SAXparsing可能会变得混乱,如果你不保持组织。

我使用一种基于STX(Streaming Transformations for XML)的方法来parsing大型的XML文件。 我使用SAX方法来构build一个SimpleXML对象来跟踪当前上下文中的数据(即根和当前节点之间的节点)。 其他function则用于处理SimpleXML文档。

我需要parsing一个大的XML文件,每行都有一个元素(StackOverflow数据转储)。 在这种特定情况下,一次只读取一行文件就足够了,并使用SimpleXMLparsing每一行。 对我来说,这有好处,不必学习任何新东西。