原因
由于startElement被分配为 的start_element_handler,$xml_parser处理startElement程序不断在while循环中被间接调用:
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
}
}
解决方案
如果 XML 非常大,并且您不想花费循环解析整个内容,因为您只对开始时的元素感兴趣,您可以使用$countto 来break退出while循环:
while ($data = fread($fp, 4096)) {
if($count > 10) break;
if(!xml_parse($xml_parser, $data, feof($fp))) {
// code excluded for brevity
}
}
附加信息
因为您一次读取 4096 个字节,所以您的$items数组中可能最终会包含 10 多个项目。您可以根据您的输入将该数字减少到 2048 或 1024 个字节。
变量范围
如果您使用定义的变量并使用未传递给它的函数之外的范围,则必须global在使用这些变量之前使用关键字。例如,如果您$count = 0在程序开头附近定义并希望在endElement处理程序中增加它,它应该看起来像这样:
function endElement($parser, $name) {
global $count;
$count++;
}
array_slice
您可以像这样摆脱$items数组的前 10 个元素以外的所有元素:
$output = array_slice($items, 0, 10);