PHP simplexml_load_file - 捕获文件错误

时间:2009-12-16 21:30:03

标签: php xml simplexml

是否可以捕获simplexml文件错误?我正在连接到有时会失败的web服务,如果它返回一些http错误或类似内容,我需要让系统跳过一个文件。

7 个答案:

答案 0 :(得分:9)

使用@只是简单的。

如果查看手册,则有一个选项参数:

SimpleXMLElement simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] )

此处提供所有选项列表:http://www.php.net/manual/en/libxml.constants.php

这是禁止警告的正确方法:

$xml = simplexml_load_file('file.xml', 'SimpleXMLElement', LIBXML_NOWARNING);

答案 1 :(得分:6)

你在谈论两件不同的事情。 HTTP错误与XML文件是否有效无关,因此您正在查看两个独立的错误处理区域。

您可以利用libxml_use_internal_errors()来抑制任何XML解析错误,然后在每次解析操作后手动检查它们(使用libxml_get_errors())。我建议这样做,因为你的脚本不会产生大量的E_WARNING消息,但你仍然会找到无效的XML文件。

对于HTTP错误,处理这些错误取决于您如何连接到Web服务并检索数据。

答案 2 :(得分:6)

如果您对网络服务失败时的错误报告或日志记录不感兴趣,可以使用错误抑制运算符:

$xml= @simplexml_load_file('http://tri.ad/test.xml');
if ($xml) {
 // Do some stuff . . .
}

但这是一个简单的黑客攻击。更强大的解决方案是使用cURL加载XML文件,记录任何失败的请求,解析随simplexml_load_string返回的任何XML文档,记录任何XML解析错误,然后使用有效的XML执行一些操作。

答案 3 :(得分:5)

出错时,你的simplexml_load_file应该返回false。所以做一些简单的事情:

   $xml = @simplexml_load_file('myfile');
   if (!$xml) {
      echo "Uh oh's, we have an error!";
   }

是一种检测错误的方法。

答案 4 :(得分:2)

您可以在PHP中设置错误处理程序,以便在出现任何PHP错误时抛出异常:(示例和其他文档在此处:PHP.net

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

答案 5 :(得分:1)

另一种选择是使用libxml_use_internal_errors()函数来捕获错误。然后可以使用libxml_get_errors()函数检索错误。如果要检查特定错误是什么,这将允许您循环遍历它们。如果你确实使用这种方法,你需要确保在完成它们时清除内存中的错误,这样它们就不会浪费你的内存空间。

以下是一个例子:

<?php
    //Store errors in memory rather than outputting them
    libxml_use_internal_errors(true);

    $xml = simplexml_load_file('myfile.xml');

    if (!$xml){
        //Exit because we can't process a broken file
        exit;
    }

    //Important to clear the error buffer
    libxml_clear_errors();

    //Display your xml code
    print_r($xml);

另一个实际利用我们捕获的错误的例子:

<?php
    //Store errors in memory rather than outputting them
    libxml_use_internal_errors(true);

    $xml = simplexml_load_file('myfile.xml');

    if (!$xml){

        echo "Your script is not valid due to the following errors:\n";

        //Process error messages
        foreach(libxml_get_errors() as $error){
           echo "$error";
        }

        //Exit because we can't process a broken file
        exit;
    }

    //Important to clear the error buffer
    libxml_clear_errors();

    //Display your xml code
    print_r($xml);

答案 6 :(得分:0)

if (!$xml=simplexml_load_file('./samplexml.xml')) {  
    trigger_error('Error reading XML file',E_USER_ERROR);
}

foreach ($xml as $syn) {
    $candelete = $syn->candelete;
    $forpayroll = $syn->forpayroll;
    $name = $syn->name;
    $sql = "INSERT INTO vtiger (candelete, forpayroll, name) VALUES('$candelete','$forpayroll','$name')";
    $query = mysql_query($sql);
}