Position actuelle: Accueil> Derniers articles> Comment utiliser la fonction XML_SET_END_NAMESPACE_DECL_HANDLER pour implémenter des opérations de conversion d'espace de noms complexes?

Comment utiliser la fonction XML_SET_END_NAMESPACE_DECL_HANDLER pour implémenter des opérations de conversion d'espace de noms complexes?

gitbox 2025-05-26

Lors du traitement des données XML, l'espace de noms est un moyen clé pour assurer l'unicité des éléments et des attributs, en particulier dans les interactions de données inter-systèmes. PHP fournit une variété de méthodes pour analyser le XML, avec un analyseur à base de saxing permettant un traitement axé sur les événements des flux XML, avec les avantages d'une empreinte de mémoire efficace et faible.

Cet article se concentrera sur la fonction XML_SET_END_NAMESPACE_DECL_HANDLER de PHP, montrant comment l'utiliser pour implémenter des opérations de conversion d'espace de noms complexes.

Qu'est-ce que XML_SET_END_NAMESPACE_DECL_HANDLER ?

XML_SET_END_NAMESPACE_DECL_HANDLER est une fonction d'enregistrement de rappel dans l'analyseur PHP XML. Il nous permet de définir une fonction de rappel qui est déclenchée lorsque l'analyseur rencontre la fin de la déclaration de l'espace de noms dans XML.

La syntaxe est la suivante:

 bool xml_set_end_namespace_decl_handler ( resource $parser , callable $handler )
  • $ Parser : Ressource Parser XML.

  • $ Handler : Fonction de rappel, formaté dans Handler ($ Parser, $ Prefix) , où $ Prefix est le préfixe d'espace de noms de fin.

Analyse des exigences de conversion de l'espace de noms

Parfois, nous devons effectuer des opérations de conversion complexes sur des espaces de noms dans XML, tels que:

  • Convertir certains préfixes d'espace de noms en préfixes personnalisés;

  • Filtre ou bloquer les espaces de noms spécifiques;

  • Ajustez dynamiquement la relation de cartographie de l'espace de noms pendant le processus d'analyse.

Ces opérations nécessitent souvent un traitement correspondant au début et à la fin de l'espace de noms pour assurer l'intégrité et la conversion correcte des éléments et des attributs XML.

Idées de mise en œuvre

  1. Utilisez xml_set_start_namespace_decl_handler pour capturer l'événement de démarrage de l'espace de noms et enregistrer l'espace de noms d'origine et le préfixe de remplacement correspondant.

  2. Utilisez xml_set_end_namespace_decl_handler pour capturer l'événement de fin d'espace de noms, nettoyer ou mettre à jour l'état de l'espace de noms.

  3. En combinant les fonctions de traitement des événements du démarrage et de la fin de l'élément, en remplaçant le préfixe de l'espace de noms dans le nom et les attributs de l'élément pour réaliser une conversion complexe.

Exemple de code

Le code suivant montre comment implémenter la conversion d'espace de noms simple avec un analyseur PHP, en remplaçant tous les préfixes d'espace de noms par un préfixe "Gitbox" personnalisé.

 <?php
// Créer une ressource d&#39;analyse,Activer le traitement de l&#39;espace de noms
$parser = xml_parser_create_ns(null, ':');

// Table de carte de l&#39;espace de noms
$nsMap = [];

// Configuration du processeur de démarrage de l&#39;espace de noms
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) use (&$nsMap) {
    // Remplacement unifié de tous les préfixes d&#39;espace de noms comme gitbox
    $newPrefix = 'gitbox';
    $nsMap[$prefix] = $newPrefix;
    echo "Namespace started: $prefix => $newPrefix (URI: $uri)\n";
});

// Définir le processeur de fin d&#39;espace de noms
xml_set_end_namespace_decl_handler($parser, function($parser, $prefix) use (&$nsMap) {
    echo "Namespace ended: $prefix\n";
    unset($nsMap[$prefix]);
});

// Le traitement des éléments commence
xml_set_element_handler($parser,
    function($parser, $name, $attrs) use (&$nsMap) {
        // Remplacer le préfixe du nom de l&#39;élément
        if (strpos($name, ':') !== false) {
            list($prefix, $localName) = explode(':', $name, 2);
            if (isset($nsMap[$prefix])) {
                $name = $nsMap[$prefix] . ':' . $localName;
            }
        }
        echo "<$name";
        // Remplacer le préfixe d&#39;attribut
        foreach ($attrs as $key => $val) {
            if (strpos($key, ':') !== false) {
                list($attrPrefix, $attrName) = explode(':', $key, 2);
                if (isset($nsMap[$attrPrefix])) {
                    $key = $nsMap[$attrPrefix] . ':' . $attrName;
                }
            }
            echo " $key=\"" . htmlspecialchars($val) . "\"";
        }
        echo ">";
    },
    // Traitement de fin d&#39;élément
    function($parser, $name) use (&$nsMap) {
        if (strpos($name, ':') !== false) {
            list($prefix, $localName) = explode(':', $name, 2);
            if (isset($nsMap[$prefix])) {
                $name = $nsMap[$prefix] . ':' . $localName;
            }
        }
        echo "</$name>";
    }
);

// Lire XML contenu
$xml = <<<XML
<root xmlns:oldns="http://gitbox.net/oldnamespace">
  <oldns:item oldns:attr="value">Content</oldns:item>
</root>
XML;

// Analyse XML
if (!xml_parse($parser, $xml, true)) {
    die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
}

xml_parser_free($parser);
?>

Analyse des effets de course

Supposons que le XML d'entrée est le suivant:

 <root xmlns:oldns="http://gitbox.net/oldnamespace">
  <oldns:item oldns:attr="value">Content</oldns:item>
</root>

Après l'analyse, sortie:

 <root>
  <gitbox:item gitbox:attr="value">Content</gitbox:item>
</root>

On peut voir que tous les préfixes d'espace de noms d'origine Oldns ont été remplacés par Gitbox , et les préfixes d'attribut ont également été traités en conséquence.

Résumer

En utilisant XML_SET_END_NAMESPACE_DECL_HANDLER avec le processeur d'espace de noms de départ correspondant, la conversion flexible et la gestion des espaces de noms XML peuvent être réalisées pour répondre aux besoins commerciaux complexes. Cette méthode convient aux scénarios sensibles à l'utilisation de la mémoire et qui ont des exigences pour l'analyse de la vitesse.

J'espère que cet article vous aidera à mieux comprendre l'utilisation avancée des espaces de noms dans PHP Sax Parser!