如何使用chunkCompleted()来处理XML中的大型元素

时间:2014-02-05 11:53:14

标签: php xml xmlstreamer

我正在评估XmlStreamer类来处理潜在的大型XML文件。它适用于小文件,但是只要我用大型XML文件提供它就会占用所有系统内存并点击我设置的任何memory_limit(即使我还没有编写代码来使用< / em>数据)。

据我所知,它遍历顶级节点(不包括根元素),并在完成阅读每个节点时调用processNode()。回调函数接收带有节点的完整XML字符串的字符串,这似乎是访问数据的唯一方法。 (提供的示例建议使用SimpleXML解析它。)一旦顶级节点包含几MB的数据,这种方法就会明显失败,就像我的情况一样。

因此,该类允许覆盖chunkCompleted()«以提高性能»。这似乎正是我所需要的 - 但我无法弄清楚如何将它用于有用的东西。

该类定期调用chunkCompleted(),但我无法弄清楚如何访问部分读取的数据。回调不接收参数,所有类属性都是私有的,没有我可以调用的方法。 example givenprocessNode()填充自定义属性并从chunkCompleted()读取它们但这是毫无意义的:在完成顶级节点处理并加载到内存之前,您将无法获得数据。拨打chunkCompleted()的所有电话都不会执行任何操作,除了最后一次,在这种情况下,我可以直接在processNode()完成我的工作。

此外,如果我减少块大小,类会开始丢失节点,这表明它不能处理不适合单个块的元素。

我错过了一些明显的东西,或者图书馆还没有准备就绪?

class FirstExample extends XmlStreamer{
    public function processNode($xmlString, $elementName, $nodeIndex){
        echo __METHOD__ . PHP_EOL;
        var_dump($xmlString, $elementName, $nodeIndex);
    }

    public function chunkCompleted(){
        echo __METHOD__ . PHP_EOL;
    }
}

$xml = new FirstExample('/path/to/my.xml', 80);
if( $xml->parse() ){
    echo 'OK' . PHP_EOL;
}else{
    echo 'Error' . PHP_EOL;
}

0 个答案:

没有答案