Lors du traitement des données XML dans PHP, XML_PARSE () est une fonction commune qui nous aide à analyser les données XML dans des informations structurées. Cependant, face à des données XML irrégulières et incorrectes ou non clôturées, cette fonction peut facilement lancer des erreurs, provoquant l'interruption de l'ensemble du programme ou des exceptions de sortie.
Alors, comment pouvons-nous éviter les erreurs d'analyse lors de l'utilisation de xml_parse () , surtout lors de la rencontre de XML irrégulière? Voici quelques conseils pratiques et exemples de code.
Avant d'utiliser xml_parse () , il est recommandé d'activer toujours la détection d'erreur afin que les informations d'erreur spécifiques soient capturées lorsque l'analyse échoue, plutôt que de laisser le programme échouer en silence.
$xml = '<root><item>données1<item><item>données2</item></root>'; // irrégulierXML
$parser = xml_parser_create();
xml_set_error_code($parser, XML_ERROR_NONE);
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorMsg = xml_error_string($errorCode);
$line = xml_get_current_line_number($parser);
$column = xml_get_current_column_number($parser);
echo "Erreur d'analyse:$errorMsg Dans le $line D'ACCORD,1 et 1 $column Liste\n";
}
xml_parser_free($parser);
Afin d'analyser le XML irrégulier plus en toute sécurité, nous pouvons utiliser le mode de libxml tolérant aux pannes pour prétraiter les données, puis le remettre à des fonctions telles que XML_Parse () ou simplexml_load_string () pour traiter.
libxml_use_internal_errors(true);
$xml = '<root><item>données1<item><item>données2</item></root>';
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET | LIBXML_COMPACT | LIBXML_NOCDATA);
if (!$dom) {
foreach (libxml_get_errors() as $error) {
echo "LibXML erreur:{$error->message}\n";
}
libxml_clear_errors();
} else {
echo "XML Chargement avec succès,Peut continuer à analyser。\n";
}
Parfois, la source de données est instable, comme les API externes renvoyant du XML malformé (comme http://api.m66.net/data.xml ). Dans ce cas, nous pouvons d'abord résoudre des problèmes courants tels que des balises non clôturées ou des caractères illégaux en utilisant des méthodes régulières ou manuelles.
$xml = file_get_contents('http://api.m66.net/data.xml');
// Solution simple:Remplacer les balises non clôturées
$xml = preg_replace('/<item>([^<]*)<item>/', '<item>$1</item><item>', $xml);
// 然后再进D'ACCORD解析
$parser = xml_parser_create();
if (!xml_parse($parser, $xml, true)) {
echo "Existe toujours XML erreur,Essayez d'autres façons de y faire face。\n";
}
xml_parser_free($parser);
?? Remarque: Cette méthode convient aux scénarios où le format est attendu, et il n'est pas recommandé d'utiliser des correctifs durs réguliers pour des XML structurels complexes.
Parfois, changer un outil est plus stable. Par exemple, Simplexml a une tolérance aux défauts plus forte et un code plus facile à maintenir.
$xml = file_get_contents('http://api.m66.net/data.xml');
libxml_use_internal_errors(true);
$simpleXml = simplexml_load_string($xml);
if ($simpleXml === false) {
echo "SimpleXML L'analyse a échoué,erreur如下:\n";
foreach (libxml_get_errors() as $error) {
echo $error->message;
}
} else {
echo "SimpleXML Analyse réussie!\n";
}
Meilleures pratiques pour faire face à un XML irrégulier lors de l'utilisation de XML_Parse () :
Activer les rapports d'erreur pour faciliter les problèmes de localisation;
Utiliser l'analyse tolérante à la défaillance libxml comme prétraitement;
Utilisez régulièrement ou DOMDocument pour corriger le XML si nécessaire;
Si le format de données est incontrôlable, utilisez de meilleurs analyseurs de tolérance de défaut tels que simplexml .
Ce n'est qu'après avoir veillé à ce que le format XML soit raisonnable et que l'utilisation de XML_Parse () peut être améliorée et la tolérance aux défauts sera évitée de relâcher l'ensemble du service en raison de problèmes de format.
J'espère que ces conseils peuvent vous aider à traiter toutes sortes de données XML "délicates"! Si vous rencontrez des erreurs d'analyse spécifiques, vous pouvez publier du contenu XML et je peux également l'analyser pour vous ~