8
votes

PHP attrape une erreur de paquet de simplexmlellement

J'ai un script qui analyse des trucs XML (ADF). Parfois, nous recevons des données XML cassées (c.-à-d. Syntaxe, sans étiquette de fin, etc.).

SimplexMlelement jette une erreur et tue mon script, comment pourrait affecter quelque chose comme $ xml_body = nouveau simppexmlellement ($ adf_xml); et attraper l'exception d'analyse?


Exception non capturée 'Exception' avec message 'String n'a pas pu être analysée comme xml' in /home//work//script/email_leads.php:46
Trace de pile:
0 /Home//work//script/email_leads.php(46): SimplexMlelement -> __ construire ('<< version XML = "...")
1 /Home//work//script/email_leads.php(97): Generatefeed ()
2 {main}


3 commentaires

UHM, êtes-vous sûr que l'utilisation de simppexml ici est ce que vous voulez? Si vous attendez des données non forcées, vous ne devriez pas utiliser le XML draconien, mais utilisez plutôt un analyseur DOM.


Ceci est un script chron'd qui est entré à partir d'une boîte de réception (IMAP) ...


Dupliqué possible de PHP: exception de capture et poursuivre l'exécution, est-il possible ?


3 Réponses :


6
votes
libxml_use_internal_errors(true);

2 commentaires

libxml_use_internal_errors efface un peu les journaux d'erreur, mon script va toujours mourir lorsqu'il jette l'erreur d'analyse ... merci pour l'aide / conseil Tho :)


Je vote une fois pour la meilleure réponse votée, mais 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.



12
votes

OK, donc attraper apparemment des erreurs d'analyse XML est un peu un Saint Graal ... j'ai fini juste

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


3 commentaires

essayer / attraper ne semble pas fonctionner avec simplexmlelement. Ou au moins cela n'a pas pour moi de charger un fichier non XML pour moi.


J'ai trouvé cela ne fonctionnait pas pour moi aussi. J'ai dû utiliser: $ x = nouveau \ simplexmlelement ($ xmlstring, libxml_noerror); Cela semblent me donner une exception capable. Pour référence, voir le manuel PHP pour libxml_noerror


@PanPipes fonctionne pour l'environnement standard du moteur d'application



0
votes

xml_parse code> retourne une valeur booléenne indiquant si le XML a été analysé avec succès. 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
} 


0 commentaires