2010-11-09 5 views
6

J'ai un script qui analyse certains éléments XML (adf). Parfois, nous recevons des données XML brisées (par exemple: syntaxe, pas de balise de fin, etc.).PHP Attraper une erreur d'analyse SimpleXMLElement

SimpleXMLElement déclenche une erreur et tue mon script, comment pourrait affecter quelque chose comme $xml_body = new SimpleXMLElement ($adf_xml); et attraper l'exception d'analyse?


Uncaught exception 'Exception' message 'chaîne ne peut pas être analysé comme XML' dans /home//Work//script/email_leads.php:46
Trace de la pile:
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, êtes-vous sûr que l'utilisation de SimpleXML est ce que vous voulez? Si vous vous attendez à des données non bien formées, n'utilisez certainement pas draconian xml, mais utilisez plutôt un parseur DOM. – NikiC

+0

ceci est un script chron'd qui reçoit une entrée d'un INBOX (imap) ... –

+0

duplication possible de [php: attraper l'exception et continuer l'exécution, est-ce possible?] (Http://stackoverflow.com/questions/2132759/php-catch-exception-et-continue-execution-is-it-possible) – hakre

Répondre

4
libxml_use_internal_errors(true); 
+0

libxml_use_internal_errors efface un peu les logs d'erreur, mon script va quand même mourir quand il lance l'erreur Parse ... Merci pour l'aide/tip tho :) –

+0

Je vote une fois pour la meilleure réponse, cependant, je pense qu'il est préférable de supprimer l'erreur par la fonction mentionnée ici. Et vous utilisez libxml_get_errors ou libxml_get_last_error pour savoir ce qui se passe. – cwhsu

11

Ok, donc apparemment attraper XML des erreurs d'analyse est quelque peu d'un Saint-Graal ... J'ai fini juste

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

try/catch ne semble pas fonctionner avec SimpleXMLElement. Ou du moins pas pour charger un fichier non-xml pour moi. – Jake

+3

J'ai trouvé que cela ne marchait pas pour moi aussi. J'ai dû utiliser: $ x = new \ SimpleXMLElement ($ xmlString, LIBXML_NOERROR); Cela semble me donner une exception attrayante. Pour référence, voir le manuel de PHP pour [LIBXML_NOERROR] (http://php.net/manual/en/libxml.constants.php) – PanPipes

0

xml_parse retourne une valeur booléenne indiquant si le XML a été correctement analysé. Par conséquent, cela devrait fonctionner:

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

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