Position actuelle: Accueil> Derniers articles> XML_PARSE ne peut pas gérer correctement les balises imbriquées: erreurs et solutions courantes

XML_PARSE ne peut pas gérer correctement les balises imbriquées: erreurs et solutions courantes

M66 2025-04-24

Lorsque vous utilisez PHP pour traiter les données XML, XML_PARSE () est une fonction relativement basique, appartenant à l'extension PHP Parser de PHP (basée sur Expat). Cependant, de nombreux développeurs rencontrent souvent des situations qui ne peuvent pas être gérées correctement lorsque vous l'utilisez pour analyser les balises imbriquées. Cet article vous emmènera dans la profonde compréhension des causes de ce problème et fournira des solutions pratiques.

1. Introduction au principe de travail de XML_PARSE

XML_PARSE () utilise un modèle piloté par des événements pour traiter les documents XML. Lorsque l'analyseur lit la balise de démarrage, la balise de fin ou les données de caractère, la fonction de rappel correspondante sera appelée.

L'exemple de code d'initialisation est le suivant:

 $parser = xml_parser_create();

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

$data = '<book><title>PHP Guide</title><author>John</author></book>';
xml_parse($parser, $data, true);
xml_parser_free($parser);

Dans cet exemple, l'analyseur déclenchera les fonctions de rappel StartElement , CaracterData et Endement .

2. Pourquoi XML_PARSE ne peut-il pas gérer correctement les balises imbriquées?

Les principales raisons sont les suivantes:

1. La logique du traitement de la fonction de rappel est incomplète

De nombreux développeurs ne parviennent pas à maintenir correctement l'état ou la structure analysée lorsqu'ils traitent des étiquettes imbriquées. Étant donné que xml_parse () ne vous aidera pas automatiquement à créer une structure d'arbre XML, les données imbriquées doivent être construites manuellement.

Par exemple, le code suivant ne gère pas correctement les nœuds imbriqués:

 function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = $name;
}

function characterData($parser, $data) {
    global $currentTag;
    echo "$currentTag: $data\n";
}

Dans les balises imbriquées, $ currenttag sera constamment écrasé, entraînant l'incapacité d'identifier à laquelle appartient les données.

2. La structure de la pile n'est pas utilisée pour enregistrer l'état imbriqué

Afin d'analyser le XML imbriqué, il est recommandé d'utiliser une pile pour maintenir le chemin de balise actuel:

 $tagStack = [];

function startElement($parser, $name, $attrs) {
    global $tagStack;
    array_push($tagStack, $name);
}

function endElement($parser, $name) {
    global $tagStack;
    array_pop($tagStack);
}

function characterData($parser, $data) {
    global $tagStack;
    $path = implode(' > ', $tagStack);
    echo "[$path] $data\n";
}

Ce code peut afficher plus clairement la hiérarchie des balises imbriquées, par exemple:

 <article>
    <header><title>Titre d&#39;actualités</title></header>
    <body>Section de contenu</body>
</article>

La sortie sera:

 [ARTICLE > HEADER > TITLE] Titre d&#39;actualités
[ARTICLE > BODY] Section de contenu

3. Les données sont tronquées à tort ou incomplètes

Si les données transmises dans xml_parse () sont incomplètes ou ne sont pas correctement marquées aussi vraies que le paramètre IS_FINAL (c'est-à-dire le dernier paramètre) est vrai , il fera également l'échec de l'analyse:

 xml_parse($parser, $data, true); // Le troisième paramètre doit être true Indique que les données sont terminées

3. Comment analyser correctement le XML imbriqué?

Le moyen le plus recommandé est d'utiliser un analyseur XML de niveau supérieur, comme:

1. Simplexml

 $xml = simplexml_load_string('<book><title>PHP Guide</title></book>');
echo $xml->title; // Sortir: PHP Guide

2. DomDocument

 $doc = new DOMDocument();
$doc->loadXML('<site><url>https://m66.net</url></site>');
$nodes = $doc->getElementsByTagName('url');
echo $nodes->item(0)->nodeValue; // Sortir: https://m66.net

Ces analyseurs ont géré la structure imbriquée des nœuds pour vous, le code est plus clair et la maintenance est plus simple.

4. Résumé et suggestions

  • xml_parse () utilise des modèles axés sur les événements et ne construit pas automatiquement des arbres structurés, donc les balises imbriquées doivent être traitées manuellement;

  • Il est recommandé d'utiliser une structure de pile pour suivre le chemin de balise actuel;

  • Dans les projets, si les méthodes motivées par des événements ne sont pas spécifiquement requises, SimplexML ou DomDocument est recommandé pour gérer le XML imbriqué;

  • Faites attention à l'intégrité des données entrantes pour éviter la troncature;

L'analyse XML n'est en fait pas compliquée. La clé est de choisir le bon outil et de comprendre ses principes sous-jacents. J'espère que cet article peut vous aider à mieux faire face aux problèmes de XML imbriqués dans le développement réel.