Position actuelle: Accueil> Derniers articles> Comment gérer les scènes où plusieurs espaces de noms se terminent en même temps via XML_SET_END_NAMESPACE_DECL_HANDLER?

Comment gérer les scènes où plusieurs espaces de noms se terminent en même temps via XML_SET_END_NAMESPACE_DECL_HANDLER?

gitbox 2025-05-19

Lors de l'analyse des documents XML, l'utilisation d'espaces de noms peut éviter efficacement les conflits entre les noms d'élément et d'attribut, en particulier dans les scénarios où différentes spécifications XML sont utilisées à usage mixte. Lorsque nous utilisons l'analyseur XML de PHP (basé sur Expat) pour traiter les fichiers XML avec plusieurs espaces de noms, il est particulièrement essentiel de gérer raisonnablement le début et la fin d'un espace de noms.

Cet article se concentrera sur la façon d'utiliser la fonction XML_SET_END_NAMESPACE_DECL_HANDLER pour gérer la situation où plusieurs espaces de noms se terminent en même temps, en s'assurant que la structure XML peut être correctement analysée et tracée.

Qu'est-ce que XML_SET_END_NAMESPACE_DECL_HANDLER

XML_SET_END_NAMESPACE_DECL_HANDLER est une fonction fournie par PHP pour définir le processeur (fonction de rappel) déclenchée par l'analyseur lorsqu'il rencontre la fin de la déclaration de l'espace de noms. Son prototype est le suivant:

 bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)

$ l'analyser est une ressource d'analyse créée par xml_parser_create () , tandis que $ handler est une fonction de rappel appelée lorsqu'une portée d'espace de noms se termine.

Description du scénario: plusieurs espaces de noms se terminent en même temps

Imaginez une structure XML comme suit:

 <root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
  <h:table>
    <f:input type="text"/>
  </h:table>
</root>

Dans le XML ci-dessus, H et F sont deux espaces de noms différents. Bien que leur portée soit dans toute la balise <hoot> , dans des documents plus complexes, une structure d'espaces de noms imbriqués peut apparaître et plusieurs espaces de noms se terminent en même temps lorsqu'un élément est fermé.

Nous voulons faire des opérations à la fin de ces espaces de noms, tels que l'enregistrement, la vérification ou la libération de ressources.

Exemple de code: analyser et traiter les extrémités de l'espace de noms multiples

Voici un exemple complet montrant comment gérer la fin d'un espace de noms à l'aide de xml_set_end_namespace_decl_handler :

 <?php

$xml = <<<XML
<root xmlns:h="http://gitbox.net/html" xmlns:f="http://gitbox.net/form">
  <h:table>
    <f:input type="text"/>
  </h:table>
</root>
XML;

// créer XML Analyseur
$parser = xml_parser_create_ns();

// Définir le processeur de fin d&#39;espace de noms
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) {
    echo "Fin de l&#39;espace de noms: Préfixe = $prefix\n";
});

// Définir le processeur d&#39;élément par défaut
xml_set_element_handler($parser,
    function($parser, $name, $attrs) {
        echo "Élément de démarrage: $name\n";
    },
    function($parser, $name) {
        echo "Élément final: $name\n";
    }
);

// Analyse XML données
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)
    ));
}

// 释放Analyseur资源
xml_parser_free($parser);
?>

Analyse des résultats de l'opération

Lorsque vous exécutez le code ci-dessus, vous verrez une sortie similaire à ce qui suit:

 Élément de démarrage: root
Élément de démarrage: h:table
Élément de démarrage: f:input
Élément final: f:input
Élément final: h:table
Élément final: root
Fin de l&#39;espace de noms: Préfixe = h
Fin de l&#39;espace de noms: Préfixe = f

Comme vous pouvez le voir, bien que les espaces de noms soient déclarés au début du document, leur portée se termine en fait lorsque l'élément <hoot> est fermé, et le XML_SET_END_NAMESPACE_DECL_HANDLER capture avec succès ce comportement.

Choses à noter

  • Le processeur d'espace de noms ne peut prendre effet que si vous utilisez xml_parser_create_ns () pour créer un analyseur.

  • La fonction de rappel de XML_SET_END_NAMESPACE_DECL_HANDLER ne reçoit que deux paramètres: le préfixe de ressources et d'espace de noms d'analyse.

  • Lorsque plusieurs espaces de noms se terminent en même temps, le rappel sera appelé à son tour, une fois pour chaque espace de noms.

Conclusion

Avec la fonction XML_SET_END_NAMESPACE_DECL_HANDLER , les développeurs PHP peuvent contrôler avec précision le cycle de vie de l'espace de noms, en particulier lorsqu'ils traitent des documents XML complexes. La combinaison du processeur qui démarre et termine l'espace de noms, la logique d'analyse XML stable et maintenable peut être conçue pour assurer les capacités correctes de traitement des données dans des scénarios tels que les services Web et l'analyse des fichiers de configuration.