Lors du traitement des données XML en PHP, diverses fonctions d'analyse sont souvent nécessaires, parmi lesquelles XML_SET_END_NAMESPACE_DECL_HANDLER est une fonction spécialement utilisée pour définir le processeur de déclaration d'achat d'espace de noms. Cet article vous emmènera dans la compréhension approfondie de ses paramètres et fournira quelques conseils pratiques pour vous aider à l'utiliser plus efficacement.
La définition de xml_set_end_namespace_decl_handler est la suivante:
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
Sa fonction consiste à enregistrer un gestionnaire de fonction de rappel pour l' analyseur de l'analyseur XML spécifié, qui sera appelé lorsque l'espace de noms termine la déclaration.
En d'autres termes , lorsque l'analyseur détecte que la portée d'un espace de noms se termine, PHP appellera automatiquement le gestionnaire $ que vous avez spécifié.
Examinons de plus près la signification et l'utilisation des deux paramètres.
? $ analyseur
Il s'agit d'une instance d'analyseur créée via XML_PARSER_CREATE () . Par exemple:
$parser = xml_parser_create();
Vous devez vous assurer que ce que vous transmettez est une ressource d'analyse valide, sinon la fonction renverra faux .
? $ gestionnaire
Ceci est la fonction de rappel que vous avez définie, dans le format comme suit:
function handlerFunction(XMLParser $parser, string $prefix) {
// Logique de traitement
}
$ Parser : passez dans l'instance de l'analyseur actuel.
$ Prefix : le préfixe d'espace de noms de fin. Si l'espace de noms par défaut se termine, sa valeur sera une chaîne vide "" .
Exemple:
function endNsHandler($parser, $prefix) {
echo "Fin de l'espace de noms:$prefix\n";
}
Puis liez-le avec le code suivant:
xml_set_end_namespace_decl_handler($parser, 'endNsHandler');
?? Astuce 1: Vérifiez la signature du rappel
Assurez-vous que votre gestionnaire $ définit le numéro et l'ordre des paramètres corrects. Si les paramètres sont erronés, PHP rapportera une erreur au moment de l'exécution.
?? Astuce 2: combiné avec le processeur de démarrage
Habituellement, vous utiliserez XML_SET_START_NAMESPACE_DECL_HANDLER () en même temps pour gérer la déclaration de démarrage de l'espace de noms. Cela permet au cycle de vie de l'espace de noms d'être entièrement suivi.
function startNsHandler($parser, $prefix, $uri) {
echo "L'espace de noms commence:$prefix ($uri)\n";
}
xml_set_start_namespace_decl_handler($parser, 'startNsHandler');
?? Astuce 3: gérer l'espace de noms par défaut
Ne l'ignorez pas lorsque $ Prefix est une chaîne vide, elle indique la fin de l'espace de noms par défaut. Vous pouvez utiliser un jugement conditionnel pour y faire face spécifiquement:
if ($prefix === '') {
echo "默认Fin de l'espace de noms\n";
} else {
echo "Espace de noms $prefix Finition\n";
}
?? Astuce 4: débogage de la sortie
Pour déboguer l'analyse XML, vous pouvez ajouter des journaux détaillés au gestionnaire $ ou écrire des informations à un fichier. Par exemple:
file_put_contents('log.txt', "Fin de l'espace de noms:$prefix\n", FILE_APPEND);
?? Astuce 5: Soyez prudent lors du traitement des URL
Si votre XML contient des URL, par exemple:
<example xmlns:git="http://gitbox.net/ns">
Lors de la gestion de ces URL, n'oubliez pas d'échapper à la sortie pour éviter les XS ou autres problèmes d'injection. Par exemple:
$safeUrl = htmlspecialchars($uri, ENT_QUOTES, 'UTF-8');
Ce qui suit est un exemple d'utilisation complet, qui gère le début et la fin de l'espace de noms et diffuse des informations pertinentes.
<?php
$parser = xml_parser_create();
function startNsHandler($parser, $prefix, $uri) {
echo "L'espace de noms commence:$prefix ($uri)\n";
}
function endNsHandler($parser, $prefix) {
echo "Fin de l'espace de noms:$prefix\n";
}
xml_set_start_namespace_decl_handler($parser, 'startNsHandler');
xml_set_end_namespace_decl_handler($parser, 'endNsHandler');
$xml = <<<XML
<example xmlns:git="http://gitbox.net/ns">
<git:child>contenu</git:child>
</example>
XML;
xml_parse($parser, $xml, true);
xml_parser_free($parser);
?>
Dans cet exemple, lors de l'analyse de la balise <git: child> , le processeur d'espace de noms de démarrage est tiré, et à la fin du </git: enfant> , le processeur d'espace de noms final est appelé.