C'est un moyen courant d'analyser XML en utilisant la fonction XML_PARSE dans PHP, mais lorsqu'un fichier XML contient des caractères spéciaux (tels que & , < , > ou des caractères UTF-8 illégaux), il est facile de provoquer des erreurs d'échec ou même de script. Cet article explorera plusieurs problèmes courants rencontrés dans le développement réel et fournira des solutions correspondantes pour éviter les pièges courants lors de l'analyse du XML avec des caractères spéciaux.
XML exige que les caractères soient des caractères UTF-8 légaux. Si l'entrée contient des caractères illégaux (tels que des caractères de contrôle ou un codage illégal), XML_PARSE renverra directement une erreur.
Utilisez iconv ou mb_convert_encoding pour prétraiter le contenu:
$rawXml = file_get_contents('https://m66.net/data.xml');
$cleanXml = mb_convert_encoding($rawXml, 'UTF-8', 'UTF-8');
Ou utilisez régulièrement pour effacer les caractères de contrôle illégaux:
$cleanXml = preg_replace('/[^\x09\x0A\x0D\x20-\x7E\xA0-\xFF]/', '', $rawXml);
En xml, & doit être écrit comme & amp; . Si le document XML d'origine contient un & , XML_PARSE non recommandé, signalera une erreur.
Vous pouvez utiliser HTMLSpecialCars ou STR_REPLACE pour le prétraitement, mais veillez à éviter une échauffement excessive:
$cleanXml = str_replace('&', '&', $rawXml);
// Avis:Ceci est juste un exemple,Lorsque vous l'utilisez, vous devez déterminer s'il a été échappé.,Évitez les évasions répétées
Un moyen plus sûr consiste à vérifier que XML est légal:
libxml_use_internal_errors(true);
$xml = simplexml_load_string($rawXml);
if (!$xml) {
foreach (libxml_get_errors() as $error) {
echo "XML Error: " . $error->message;
}
}
Si l'en-tête de fichier XML ne spécifie pas le codage ou ne correspond pas au codage réel, une erreur XML_PARSE peut se produire.
Forcer l'en-tête standard vers XML pour assurer un codage cohérent:
if (strpos($rawXml, '<?xml') === false) {
$rawXml = '<?xml version="1.0" encoding="UTF-8"?>' . $rawXml;
}
Les développeurs oublient parfois d'appeler XML_PARSER_FREE , entraînant une fuite de ressources ou un comportement anormal.
$parser = xml_parser_create('UTF-8');
xml_set_element_handler($parser, 'startElement', 'endElement');
xml_set_character_data_handler($parser, 'characterData');
if (!xml_parse($parser, $cleanXml, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
Par défaut, aucune exception ne sera lancée après une erreur dans XML_PARSE , et les informations d'erreur doivent être vérifiées manuellement.
Utilisez des fonctions de détection d'erreur telles que xml_get_error_code () et xml_error_string () pour améliorer l'efficacité du débogage.
Bien que XML_PARSE soit une bonne méthode d'analyse sous-jacente et effectuée, vous devez faire très attention à la légitimité et aux problèmes de codage des personnages de XML lorsque vous l'utilisez. Nous recommandons que la détection d'erreurs de somme de contrôle pré-nettoyage et de codage soit effectuée en premier lorsqu'il s'agit de fichiers XML non fiables ou fournis par tiers pour minimiser le risque d'analyse.
S'il existe des structures et des exigences XML plus complexes, vous pouvez également envisager d'utiliser des outils d'analyse plus modernes tels que DomDocument ou simplexml , qui sont plus tolérants aux pannes pour les caractères spéciaux et sont plus concises à utiliser.