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.
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.
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.
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.
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.
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.
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'analyse,Activer le traitement de l'espace de noms
$parser = xml_parser_create_ns(null, ':');
// Table de carte de l'espace de noms
$nsMap = [];
// Configuration du processeur de démarrage de l'espace de noms
xml_set_start_namespace_decl_handler($parser, function($parser, $prefix, $uri) use (&$nsMap) {
// Remplacement unifié de tous les préfixes d'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'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'é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'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'é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);
?>
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.
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!