2010-11-09 20 views
6

Tengo un script que analiza algunas cosas XML (adf). A veces recibimos datos XML rotos (es decir, sintaxis, sin etiqueta de finalización, etc.).PHP Captura de un error de análisis SimpleXMLElement

SimpleXMLElement arroja un error y mata mi secuencia de comandos, ¿cómo podría asignar algo como $xml_body = new SimpleXMLElement ($adf_xml); y capturar la excepción de análisis?


no detectada excepción 'excepción' con el mensaje 'Cadena no se pudo analizar como XML' en /home//Work//script/email_leads.php:46
traza Pila:
0/home //Work//script/email_leads.php(46): SimpleXMLElement -> __ construct ('<? Xml version = "...')
1 /home//Work//script/email_leads.php(97): generateFeed()
2 {main}

+0

Uhm, ¿estás seguro de que usar SimpleXML aquí es lo que quieres? Si espera datos que no están bien formados, no debe usar draconian xml, pero use un analizador DOM. – NikiC

+0

este es un script cronograma que obtiene entrada de un INBOX (imap) ... –

+0

posible duplicado de [php: catch exception y continue execution, is it possible?] (Http://stackoverflow.com/questions/2132759/php-catch-exception-and-continue-execution-is-it-possible) – hakre

Respuesta

4
libxml_use_internal_errors(true); 
+0

libxml_use_internal_errors borra un poco los registros de error, mi script aún va a morir cuando lanza el error Parse ... Gracias por la ayuda/tip tho :) –

+0

Una vez voté por la respuesta más votado, sin embargo, creo que es mejor suprimir el error por la función que se menciona aquí. Y utiliza libxml_get_errors o libxml_get_last_error para descubrir qué está pasando. – cwhsu

11

Ok, por lo que aparentemente la captura de XML analizan los errores es algo así como un Santo Grial ... Acabé

try { $x = new SimpleXMLElement($y); } catch (Exception $e) { echo $e; } 
+4

try/catch no parece funcionar con SimpleXMLElement. O al menos no lo hizo para cargar un archivo que no sea XML. – Jake

+3

Encontré que esto no funcionó para mí también. Tuve que usar: $ x = new \ SimpleXMLElement ($ xmlString, LIBXML_NOERROR); Esto parece darme una excepción atrapable. Para referencia, consulte el manual de PHP para [LIBXML_NOERROR] (http://php.net/manual/en/libxml.constants.php) – PanPipes

0

xml_parse devuelve un valor booleano que indica si el XML se ha analizado correctamente. Por lo tanto, esto debería funcionar:

$fp = fopen($xml_file, "r"); 
$xml_data = fread($fp, 80000); 

if(!(xml_parse($xml_parser, $xml_data, feof($fp)))){ 
    # do something 
} 
Cuestiones relacionadas