Обработка ошибок Simplexml PHP - PullRequest
       10

Обработка ошибок Simplexml PHP

23 голосов
/ 20 августа 2009

Я использую следующий код:

function GetTwitterAvatar($username){
$xml = simplexml_load_file("http://twitter.com/users/".$username.".xml");
$imgurl = $xml->profile_image_url;
return $imgurl;
}

function GetTwitterAPILimit($username, $password){
$xml = simplexml_load_file("http://$username:$password@twitter.com/account/rate_limit_status.xml");
$left = $xml->{"remaining-hits"};
$total = $xml->{"hourly-limit"};
return $left."/".$total;
}

и получение этих ошибок, когда поток не может соединиться:

Warning: simplexml_load_file(http://twitter.com/users/****.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://twitter.com/users/****.xml" 

Warning: simplexml_load_file(http://...@twitter.com/account/rate_limit_status.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://***:***@twitter.com/account/rate_limit_status.xml"

Как я могу обработать эти ошибки, чтобы я мог отобразить сообщение, удобное для пользователя, вместо того, что показано выше?

Ответы [ 7 ]

45 голосов
/ 03 января 2011

Я думаю, что это лучший способ

$use_errors = libxml_use_internal_errors(true);
$xml = simplexml_load_file($url);
if (false === $xml) {
  // throw new Exception("Cannot load xml source.\n");
}
libxml_clear_errors();
libxml_use_internal_errors($use_errors);

подробнее: http://php.net/manual/en/function.libxml-use-internal-errors.php

19 голосов
/ 14 декабря 2011

Я нашел хороший пример в документации php .

Итак, код:

libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if (false === $sxe) {
    echo "Failed loading XML\n";
    foreach(libxml_get_errors() as $error) {
        echo "\t", $error->message;
    }
}

И вывод, как мы и ожидали:

Не удалось загрузить XML

Blank needed here
parsing XML declaration: '?>' expected
Opening and ending tag mismatch: xml line 1 and broken
Premature end of data in tag broken line 1
7 голосов
/ 17 апреля 2013

Если вы посмотрите руководство, есть параметр options:

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);
4 голосов
/ 23 ноября 2015

Это старый вопрос, но все еще актуален сегодня.

Правильный способ обработки исключений при использовании oop SimpleXMLElment такой же.

libxml_use_internal_errors(TRUE); // this turns off spitting errors on your screen
try {
  $xml = new SimpleXMLElement($xmlStringOfData);
} catch (Exception $e) {
  // Do something with the exception, or ignore it.
}
2 голосов
/ 28 февраля 2017

Мой маленький код:

<code>try {
    libxml_use_internal_errors(TRUE);
    $xml = new SimpleXMLElement($xmlString);
    echo '<pre>'.htmlspecialchars($xml->asXML()).'
'; } catch (исключение $ e) { echo 'Поймано исключение:'. $ e-> getMessage (). CHR (10); echo 'Не удалось загрузить XML:'. CHR (10); foreach (libxml_get_errors () как $ error) { эхо '-'. $ Error-> сообщение; } }

Пример результата:

Caught exception: String could not be parsed as XML
Failed loading XML: 
- Opening and ending tag mismatch: Body line 3 and Bod-y
0 голосов
/ 20 августа 2009

if (simplexml_load_file ($ file)! == ложный) { // продолжить} else { echo 'Error!'; }

И Твиттер отключен , может быть?

0 голосов
/ 20 августа 2009

В документации сказано, что в случае ошибки simplexml_load_file возвращает FALSE. Таким образом, вы можете использовать оператор «shut-up» (@) в сочетании с условным оператором:

if (@simplexml_load_file($file))
{
    // continue
}
else 
{
    echo 'Error!';
}
...