在php中循环遍历多个xml文件?

时间:2014-07-29 13:34:46

标签: php xml

大家好我正试图在目前使用计数器进行多页xml文件循环测试,但是我不确定我做错了它是一个无穷无尽的页面加载:

$counter = 1;
while ($xml = simplexml_load_string(file_get_contents("http://www.gog.com/games/feed?format=xml&page=$counter")))
{
    $counter++;
    echo $counter;
}

他们遗憾地没有一个总页数计数器,所以我想我会测试它直到它无法到达它(如果它尝试不存在的页面则给出404)。

我以为我可以使用一个简单的while(这个工作)循环来做它,但它似乎没有。

3 个答案:

答案 0 :(得分:0)

你应该做这样的事情

$counter = 1;
$finished = false;
while (!$finished)
{
    $xml = simplexml_load_string(file_get_contents("http://www.gog.com/games/feed?format=xml&page=$counter"));
    $counter++;
    echo $counter;
    if (count($xml->products->product) < 1){ //check if we have products
        $finished = true; //We hit a blank page
    }
}

注意:我现在无法访问PHP,只能通过移动设备进行编写。

答案 1 :(得分:0)

由于你的循环退出条件永远不会破坏循环,因此你很可能会因为URL之后的无限请求URL而遇到禁令。

这是一个有点不同但又有效的例子:

$urlMask = 'http://www.gog.com/games/feed?format=xml&page=%d';

$page = 0;
do {
    $url = sprintf($urlMask, $page++);
    $xml = simplexml_load_file($url);
    if (!$xml) {
        printf("Error: Failed to open URL '%s'\n", $url);
        break; // problems loading url.
    }

    $path  = '/catalogue/products/product';
    $count = count($xml->xpath($path));
    printf("Page #%d: %d product(s)\n", $page, $count);

} while ($count > 0);

这里的重要部分是打开文档的错误处理旁边你应该做一个积极的检查,确实有产品。在这个例子中,如果没有更多产品,我会使用产品计数退出循环。

这里是示例性输出:

Page #1: 62 product(s)
Page #2: 62 product(s)
Page #3: 63 product(s)
Page #4: 65 product(s)
Page #5: 54 product(s)
Page #6: 61 product(s)
Page #7: 70 product(s)
Page #8: 66 product(s)
Page #9: 67 product(s)
Page #10: 82 product(s)
Page #11: 74 product(s)
Page #12: 75 product(s)
Page #13: 65 product(s)
Page #14: 0 product(s)

要学习的课程:如果你开始开发,也会引入一个健全性检查,在两个循环之后存在,只是为了检查是否有效。然后对20页进行限制,因为你已经发现通常不超过13页,所以这样的错误不会受到伤害。我的例子仍有这个问题,没有健全性检查。如果XML不符合预期,这仍然会导致问题。

答案 2 :(得分:-1)

这应该有效

$counter = 1;
while (true)
  $file = fopen ("http://www.gog.com/games/feed?format=xml&page=" . $counter, "r");
  if (!$file) break;
  $xml = simplexml_load_file($file);
  fclose($file);
  $counter++;
  // Do your xml stuff here
}