Position actuelle: Accueil> Derniers articles> Comment analyser récursivement les documents XML imbriqués dans XML_PARSE

Comment analyser récursivement les documents XML imbriqués dans XML_PARSE

M66 2025-05-12

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 () .

1. Échantillon de données 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>

2. Créez un analyseur et configurez les fonctions de traitement

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.

3. La clé de la mise en œuvre de la structure récursive: construire un tableau en forme d'arbre

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&#39;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);
?>

4. Description de la structure de sortie

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

5. Convertir la structure analysée en JSON ou d'autres formats

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

Six. Conseils

  • 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: