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.
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 .
Les principales raisons sont les suivantes:
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.
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'actualités</title></header>
<body>Section de contenu</body>
</article>
La sortie sera:
[ARTICLE > HEADER > TITLE] Titre d'actualités
[ARTICLE > BODY] Section de contenu
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
Le moyen le plus recommandé est d'utiliser un analyseur XML de niveau supérieur, comme:
$xml = simplexml_load_string('<book><title>PHP Guide</title></book>');
echo $xml->title; // Sortir: PHP Guide
$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.
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.