【问题标题】:How to stop parsing XML after a certain number of items have been read?读取一定数量的项目后如何停止解析 XML?
【发布时间】:2012-05-10 11:19:46
【问题描述】:

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

【问题讨论】:

  • 你能做到吗?
  • 是的,我使用了return false;

标签: php xml-parsing


【解决方案1】:

原因

由于startElement 被分配为$xml_parserstart_element_handlerstartElement 处理程序不断在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 非常大,并且您不想花费循环解析整个内容,因为您只对开头的元素感兴趣,您可以使用 $countbreak 的 @987654329 @循环:

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);

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多