如何在读取一定数量的项目后停止解析XML?

时间:2012-05-10 11:19:47

标签: php xml-parsing

我正在解析非常大的XML并将其用作指南:http://www.php.net/manual/en/example.xml-structure.php。我实现了一个计数器,每次读取一个元素时都会增加,并且在读取前10个元素后想要停止解析。

这是我尝试过的代码:

function startElement($parser, $name, $attrs) {
    if ($count == 10) {
        print_r($items);
        break; //this is not working, is exiting the script.
    }
}

1 个答案:

答案 0 :(得分:0)

原因

由于startElement被指定为start_element_handler的{​​{1}},$xml_parser处理程序会在startElement循环中间接调用:

while

解决方案

如果XML非常大并且您不想花费周期来解析整个事物,因为您只对开头的元素感兴趣,那么您可以使用xml_set_element_handler($xml_parser, "startElement", "endElement"); // code excluded for brevity while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { // code excluded for brevity } } $count break循环:

while

其他信息

因为您一次只读取4096个字节,所以最终可能会在while ($data = fread($fp, 4096)) { if($count > 10) break; if(!xml_parse($xml_parser, $data, feof($fp))) { // code excluded for brevity } } 数组中输入10个以上的项目。您可以将该数字减少到2048或1024字节,具体取决于您的输入。

可变范围

如果您正在使用定义的变量并在函数之外使用未传递给它的作用域,则必须在使用这些变量之前使用$items关键字。例如,如果您在程序开头附近定义global并希望在$count = 0处理程序中将其递增,则它应如下所示:

endElement

function endElement($parser, $name) { global $count; $count++; }

除了array_slice数组的前10个元素之外,您可以删除除此之外的所有元素:

$items