xml_parse_into_struct () est une fonction basée sur la bibliothèque d'analyse XML expatriée, et son prototype est le suivant:
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
$ analyseur : un analyseur créé par xml_parser_create () .
$ data : chaîne XML à analyser.
$ VALEURS : Un tableau de structures de données XML organisées dans l'ordre.
$ index : facultatif, utilisé pour enregistrer le nom d'étiquette et l'index correspondant.
La fonction renvoie 1 pour indiquer que l'analyse est réussie et la fonction renvoie 0 pour indiquer l'échec.
XML est une langue de balisage avec des exigences de mise en forme très strictes, et les erreurs courantes comprennent:
Tags non clos
L'attribut n'est pas cité
Caractères illégaux (comme les caractères de contrôle)
Erreur de nidification des balises
Exemple de code:
$data = '<root><item>Test</root>'; // Manquant </item> Étiquette
$parser = xml_parser_create();
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);
Sortir:
XML Error: mismatched tag
L'encodage dans la déclaration XML (tel que <? Xml version = "1.0" Encoding = "UTF-8"?> ) Est incompatible avec le codage de contenu réel, ce qui entraînera l'échec de l'analyse.
Par exemple, le fichier est déclaré UTF-8, mais le contenu est en fait codé GBK, lançant une erreur de caractère illégale.
Solution :
Assurez-vous que l'encodage du fichier et la déclaration XML sont cohérents.
Utilisez MB_Convert_Encoding () pour se convertir en UTF-8.
$data = mb_convert_encoding($data, 'UTF-8', 'GBK');
< , > , & , " et ' in xml sont des caractères spéciaux qui doivent être échappés:
< → & lt;
> → & gt;
& → & amp;
Par exemple:
$data = '<note>Tom & Jerry</note>'; // erreur:Pas échappé &
Doit être changé en:
$data = '<note>Tom & Jerry</note>';
Les noms d'étiquette ne peuvent pas commencer par des chiffres ou des caractères spéciaux, et ils ne peuvent pas contenir d'espaces. Par exemple:
<123tag>value</123tag> <!-- illégal -->
<tag name="a b">value</tag> <!-- Les espaces dans les valeurs d'attribut ne sont pas cités -->
Ces deux fonctions peuvent vous aider à localiser rapidement le problème.
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser)) .
" at line " . xml_get_current_line_number($parser);
}
Pendant le processus de dépannage, vous pouvez coller XML dans un outil de vérification en ligne tel que https://gitbox.net/tools/xml-validator/ pour découvrir rapidement les erreurs de syntaxe.
Si le XML provient d'une interface distante ou d'un fichier externe, il est recommandé de nettoyer et d'enregistrer ce qui suit avant l'analyse:
file_put_contents('/tmp/raw_xml.log', $data);
Il est également recommandé d'utiliser la fonction de nettoyage suivante:
function clean_xml($data) {
$data = trim($data);
// Retirer BOM
$data = preg_replace('/^\xEF\xBB\xBF/', '', $data);
// Supprimer les caractères invisibles
return preg_replace('/[^\x09\x0A\x0D\x20-\x7F\xA0-\xFF]/', '', $data);
}
Bien que XML_PARSE_INTO_STRUCT () n'utilise pas DOM, l'utilisation de libxml_use_internal_errors () avant de lire XML est toujours utile pour le débogage global:
libxml_use_internal_errors(true);
Pour XML avec une structure claire et un bon format, le simplexml est plus recommandé:
$xml = simplexml_load_string($data);
Il fournit une interface d'objet plus conviviale et une tolérance aux défauts plus élevée.