Dans les applications Web modernes, les fichiers XML sont toujours couramment utilisés pour la configuration, l'échange de données et le stockage persistant. Pour les fichiers XML fréquemment modifiés, la mise en œuvre d'un mécanisme de contrôle de version peut considérablement améliorer la fiabilité de la gestion des données. PHP fournit un ensemble complet de fonctions d'analyse XML de style sax, où XML_SET_END_NAMESPACE_DECL_HANDLER () nous permet d'effectuer un traitement de rappel à la fin de la déclaration d'espace de noms XML. Ce mécanisme peut être intelligemment utilisé pour suivre les changements structurels XML, réalisant ainsi le contrôle de version de base.
Cette fonction est utilisée pour définir une fonction de rappel qui est déclenchée lorsque l'analyseur analyse la fin d'une déclaration d'espace de noms. Ceci est utile lorsque vous traitez avec des documents XML complexes avec plusieurs espaces de noms et fournit également un point d'entrée conscient de la structure pour le contrôle de version.
Le prototype de fonction est le suivant:
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
$ Parser : une ressource d'analyse créée par XML_PARSER_CREATE () .
$ Handler : une fonction de rappel qui gère l'extrémité de l'espace de noms.
Afin d'implémenter la fonction de contrôle de version des fichiers XML, nous pouvons utiliser XML_SET_END_NAMESPACE_DECL_HANDLER () pour identifier les points de changement de l'espace de noms, enregistrer chaque modification de la structure et enregistrer la version correspondante des données.
Voici les points clés à réaliser:
Initialiser l'analyseur XML
Définissez la fonction de traitement pour le début et la fin de l'espace de noms
Enregistrer "Snapshot de version" au changement de la structure
Enregistrer les données d'instantané dans le stockage versé (tel que la base de données ou le système de fichiers)
<?php
$xmlData = file_get_contents('https://gitbox.net/xml/sample.xml');
$parser = xml_parser_create_ns("UTF-8", ":");
$versions = [];
$currentVersion = [];
$versionCount = 0;
// Fonction de traitement à la fin de l'espace de noms
function endNsHandler($parser, $prefix)
{
global $versionCount, $currentVersion, $versions;
// Enregistrer les instantanés à la fin de chaque espace de noms
$versionCount++;
$versions["version_$versionCount"] = $currentVersion;
$currentVersion = []; // Réinitialisez les données de la version actuelle
}
// Événement de démarrage de l'élément de traitement(Utilisé pour collecter des informations structurelles)
function startElement($parser, $name, $attrs)
{
global $currentVersion;
$currentVersion[] = [
'element' => $name,
'attributes' => $attrs
];
}
// Configuration des fonctions de traitement
xml_set_element_handler($parser, "startElement", null);
xml_set_end_namespace_decl_handler($parser, "endNsHandler");
// Analyse XML données
if (!xml_parse($parser, $xmlData, true)) {
die("XML Error: " . xml_error_string(xml_get_error_code($parser)));
}
// Informations sur la version de sortie
foreach ($versions as $version => $data) {
echo "=== $version ===\n";
foreach ($data as $node) {
echo "Element: {$node['element']}, Attributes: " . json_encode($node['attributes']) . "\n";
}
}
xml_parser_free($parser);
?>
Ce schéma de contrôle de version conscient de la structure peut être largement utilisé dans:
Sauvegarde et récupération de la version du fichier de configuration
Détection de conflit de l'édition collaborative multi-utilisateurs du contenu XML
Suivi automatique des modifications du format de document
En utilisant XML_SET_END_NAMESPACE_DECL_HANDLER () , les développeurs PHP peuvent analyser de manière percente la structure de fichiers XML sans utiliser de bibliothèques externes et implémenter la logique de contrôle de version de base. Bien qu'il ne soit pas aussi complexe et complet que le GIT, il suffit de traiter des exigences telles que l'enregistrement des changements structurels et la récupération de contenu dans de nombreux systèmes légers.
Dois-je vous aider avec une version de l'interface ou du stockage de la base de données?