Lorsque vous travaillez avec des documents XML dans PHP, XML_Parse () est une fonction de bas niveau mais puissante. Il s'appuie sur des modèles d'analyse axés sur les événements, vous devez donc enregistrer la fonction de rappel correspondante pour répondre au début, à la fin du document et aux données de caractère.
Cependant, face à des documents XML imbriqués avec des structures complexes, l'utilisation de la récursivité peut rendre le traitement des données plus intuitif et clair. Cet article présentera comment analyser les données XML imbriquées en conjonction avec Recursion et XML_PARSE () .
<catalog>
<book id="1">
<title>PHP Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced PHP</title>
<author>Jane Smith</author>
</book>
</catalog>
Nous devons d'abord créer un analyseur et configurer trois fonctions de rappel:
startElement () : appelé lorsque l'analyseur rencontre une balise de démarrage;
Endement () : appelé lorsque l'analyseur rencontre une balise de fin;
caractèresdata () : appelé lorsque l'analyseur rencontre du texte dans la balise.
Voici un exemple de code complet:
<?php
$xml = <<<XML
<catalog>
<book id="1">
<title>PHP Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced PHP</title>
<author>Jane Smith</author>
</book>
</catalog>
XML;
$parser = xml_parser_create();
$dataStack = [];
$currentData = null;
// Tag de démarrage
function startElement($parser, $name, $attrs) {
global $dataStack, $currentData;
$element = [
'tag' => $name,
'attributes' => $attrs,
'children' => [],
'value' => ''
];
if ($currentData !== null) {
array_push($dataStack, $currentData);
}
$currentData = $element;
}
// Étiquette de fin
function endElement($parser, $name) {
global $dataStack, $currentData;
if (!empty($dataStack)) {
$parent = array_pop($dataStack);
$parent['children'][] = $currentData;
$currentData = $parent;
}
}
// Contenu texte
function characterData($parser, $data) {
global $currentData;
if (isset($currentData['value'])) {
$currentData['value'] .= trim($data);
}
}
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
if (!xml_parse($parser, $xml, true)) {
die(sprintf("XML erreur: %s Dans le %d D'ACCORD",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
// Imprimez la structure finale
print_r($currentData);
?>
Après l'analyse, vous obtiendrez une structure de réseau imbriquée similaire à ce qui suit:
Array
(
[tag] => CATALOG
[attributes] => Array()
[children] => Array
(
[0] => Array
(
[tag] => BOOK
[attributes] => Array ( [ID] => 1 )
[children] => Array
(
[0] => Array ( [tag] => TITLE [value] => PHP Basics )
[1] => Array ( [tag] => AUTHOR [value] => John Doe )
)
)
[1] => Array
(
[tag] => BOOK
[attributes] => Array ( [ID] => 2 )
[children] => Array
(
[0] => Array ( [tag] => TITLE [value] => Advanced PHP )
[1] => Array ( [tag] => AUTHOR [value] => Jane Smith )
)
)
)
)
Vous pouvez facilement convertir la structure du tableau ci-dessus en JSON pour les appels frontaux ou la sortie d'interface:
echo json_encode($currentData, JSON_PRETTY_PRINT);
Si le document XML provient du réseau, tel que https://m66.net/data/books.xml , vous pouvez utiliser File_get_Contents () pour l'obtenir: