simplexmlelement - manejo de errores simplexml php
simplexmlelement php ejemplo (7)
Estoy usando el siguiente código:
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:[email protected]/account/rate_limit_status.xml");
$left = $xml->{"remaining-hits"};
$total = $xml->{"hourly-limit"};
return $left."/".$total;
}
y obteniendo estos errores cuando la secuencia no se puede conectar:
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://[email protected]/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"
¿Cómo puedo manejar estos errores para poder mostrar un mensaje fácil de usar en lugar de lo que se muestra arriba?
if (simplexml_load_file ($ file)! == false) {// continue} else {echo ''Error!''; }
¿Y Twitter está caído , tal vez?
Esta es una vieja pregunta, pero sigue siendo relevante hoy.
La forma correcta de manejar las excepciones al usar el oop SimpleXMLElment es así.
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.
}
He encontrado un buen ejemplo en la documentación de php .
Entonces el código es:
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;
}
}
Y la salida, como esperábamos yo:
Error al cargar 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
La documentación dice que en el caso de un error, simplexml_load_file devuelve FALSE. Por lo tanto, puede usar el operador "shut-up" (@) en combinación con una declaración condicional:
if (@simplexml_load_file($file))
{
// continue
}
else
{
echo ''Error!'';
}
Mi pequeño código:
try {
libxml_use_internal_errors(TRUE);
$xml = new SimpleXMLElement($xmlString);
echo ''<pre>''.htmlspecialchars($xml->asXML()).''</pre>'';
} catch (Exception $e) {
echo ''Caught exception: '' . $e->getMessage() . chr(10);
echo ''Failed loading XML: '' . chr(10);
foreach(libxml_get_errors() as $error) {
echo ''- '' . $error->message;
}
}
Ejemplo de resultado:
Caught exception: String could not be parsed as XML
Failed loading XML:
- Opening and ending tag mismatch: Body line 3 and Bod-y
Pienso que esta es una mejor manera.
$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);
más información: http://php.net/manual/en/function.libxml-use-internal-errors.php
Si miras el manual, hay un parámetro de opciones:
SimpleXMLElement simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] )
La lista de opciones está disponible: http://www.php.net/manual/en/libxml.constants.php
Esta es la forma correcta de suprimir las advertencias analizando las advertencias:
$xml = simplexml_load_file(''file.xml'', ''SimpleXMLElement'', LIBXML_NOWARNING);