2009-12-16 91 views

回答

7

使用@只是普通的脏。

如果你看一下说明书,有一个选项参数:

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

感谢您的更新,我相信列出的一些选项在2009年不活跃,但不知道。无论如何,我将其标记为正确的答案,因为这是目前最好的答案。 – yoda 2013-04-17 13:33:35

+0

试过。不会捕捉或禁止所有警告...同意@也很简单肮脏 – PALEN 2016-03-02 17:41:57

6

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

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

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

+0

辉煌感谢 – 2013-09-09 03:14:30

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"); 
+0

我不想中断系统在错误的情况下,只需跳过该功能并继续正常进程 – yoda 2009-12-16 21:42:08

+0

好了,按照定义,异常不会中止执行。如果你将你的simplexml_load_file()包装在try-catch块中,你可以拦截任何错误。 – 2009-12-16 21:44:27

5

上的错误,你使用simplexml_load_file应该返回false。

所以做somethign像这样简单:

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

是检测错误的一种方式。

+1

差不多,但是你忘了在simplexml上压制错误,就像@ pygorex1的例子。仍然,+1 – yoda 2009-12-17 11:56:34

+0

谢谢,良好的电话 - 我编辑了这个 – 2009-12-19 02:06:41

6

如果当WebService失败,您可以使用错误supression运营商不感兴趣,错误报告或记录:

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

但是,这是一个简单的黑客。一个更强大的解决方案是加载XML文件cURL,记录任何失败的请求,解析返回的simplexml_load_string任何XML文档,记录任何XML分析错误,然后用有效的XML做一些东西。

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); 
} 
+0

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); – 2014-07-29 09:55:59

+0

XML文件:samplexml.xml <?XML版本= “1.0”?> 没有 你好 YES2 NO3 hello3 2014-07-29 10:23:06

1

另一个选择是使用libxml_use_internal_errors()函数来捕获er RORS。然后可以使用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);