我正在解析非常大的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.
}
}
答案 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