Position actuelle: Accueil> Derniers articles> XML_PARSE_INTO_STRUCT Erreurs communes: les raisons de l'analyse de l'échec et des solutions

XML_PARSE_INTO_STRUCT Erreurs communes: les raisons de l'analyse de l'échec et des solutions

gitbox 2025-06-05

1. Fonction Introduction

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.


2. Erreurs et raisons d'analyse courantes

1. Erreur de format XML

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

2. Déliachance de codage

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');

3. Les caractères spéciaux ne sont pas échappés

< , > , & , " 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 &amp; Jerry</note>';

4. Espace de noms illégal ou nom de balise

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&#39;attribut ne sont pas cités -->

3. Idées de planification et compétences de débogage

1. Utilisez xml_get_error_code () et xml_get_current_line_number ()

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);
}

2. Utilisez l'outil de vérification XML en ligne

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.

3. Imprimer les paragraphes XML originaux

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);
}

4. Gestion des suggestions

1. Allumez le rapport d'erreur libxml

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);

2. Alternative: Utilisez Simplexml ou DOM

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.