Lorsque l'analyse des données XML utilisant la fonction XML_PARSE () de PHP, l'analyse échoue souvent en raison de balises XML non valides ou mal formées. Cette situation est particulièrement courante dans les chaînes XML entrées par les utilisateurs, ou les données provenant de sources non fiables (telles que les API externes, téléchargées par des tiers). Cet article expliquera comment gérer ces erreurs gracieusement et essayer de résoudre automatiquement les problèmes courants pour éviter les erreurs d'analyse.
XML_PARSE () fait partie de l'analyseur XML de PHP (basé sur la bibliothèque Expat) qui analyse les données XML via une manière motivée par des événements:
$parser = xml_parser_create();
xml_parse($parser, $xmlString, true);
xml_parser_free($parser);
Si le XML dans $ XMLString n'est pas valide, la fonction renvoie False et vous pouvez obtenir des informations d'erreur détaillées via xml_get_error_code () et xml_error_string () .
L'étiquette n'est pas fermée:
<note><to>Tove</to><from>Jani</note>
Les caractères spéciaux ne sont pas échappés:
<message>5 < 10 & 7 > 3</message>
Personnages non autorisés ou encodages illégaux
Mauvaise structure imbriquée
Lorsque vous devez faire face à XML non standard ou corrompu, vous pouvez utiliser certaines stratégies pour le prétraiter ou le réparer:
La classe DomDocument de PHP permet la désactivation des rapports d'erreur lors du chargement de XML, essayant ainsi d'être tolérant aux pannes:
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$success = $doc->loadXML($xmlString);
if (!$success) {
foreach (libxml_get_errors() as $error) {
echo "Réparer les suggestions:" . $error->message . "\n";
}
libxml_clear_errors();
}
Bien que cette méthode ne soit pas corrigée, elle peut vous dire ce qui ne va pas.
Si vous connaissez la structure de XML, vous pouvez le réparer par remplacement régulier ou de chaîne:
function sanitizeXml($xml) {
// Remplacer illégal & personnage
$xml = preg_replace('/&(?!amp;|lt;|gt;|quot;|apos;)/', '&', $xml);
// D'autres règles peuvent être terminées au besoin
return $xml;
}
Vous pouvez envelopper l'analyse XML dans une fonction et un traitement de rétrogradation une fois qu'il échoue, tels que le stockage des journaux, le marquage de l'état de données, etc.:
function safeXmlParse($xmlString) {
$parser = xml_parser_create();
if (!xml_parse($parser, $xmlString, true)) {
$error = xml_error_string(xml_get_error_code($parser));
$line = xml_get_current_line_number($parser);
error_log("XMLL'analyse a échoué: $error at line $line");
// Facultatif:Informer l'administrateur ou sauter l'enregistrement
return false;
}
xml_parser_free($parser);
return true;
}
Supposons que vous obteniez des données XML à partir d'une URL https://api.m66.net/feed :
$url = "https://api.m66.net/feed";
$xmlData = file_get_contents($url);
$xmlData = sanitizeXml($xmlData);
if (!safeXmlParse($xmlData)) {
echo "Impossible d'analyser cela XML données,Erreur enregistrée。\n";
} else {
echo "XML Analyse réussie!\n";
}
Pour des XML particulièrement déroutants, vous pouvez utiliser des outils externes tels que Tridy , XMllint ou BeautifulSoup de Python pour nettoyer puis l'importer dans PHP pour le traitement.
La clé pour gérer les erreurs d'analyse XML réside dans le prétraitement + tolérance d'erreur + mécanisme de récupération de tolérance aux défauts. Bien que XML_Parse () soit une méthode d'analyse XML basique mais stricte, elle peut considérablement améliorer la compatibilité du XML irrégulier avec DOM, libxml, stratégies de réparation manuelle et autres méthodes.
La prochaine fois que vous ferez face à une "défaillance de l'analyse XML mystérieuse", vous pourriez aussi bien essayer ces méthodes!