tutorial simplexmlelement simplexml_load_string simplexml_load_file error ejemplo array php xml simplexml

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