在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每一行。 对我来说,这有好处,不必学习任何新东西。