1

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

1 回答 1

0

原因

由于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);
于 2012-09-11T21:50:24.233 回答