Lors du traitement des données XML, nous rencontrons souvent des "informations sur le bruit" - il peut s'agir de caractères illégaux, de balises inutiles, de commentaires ou de données sales imbriquées dans les CDATA. Pour assurer la précision de l'analyse de données, nous pouvons prétraiter le contenu XML en utilisant la fonction XML_PARSE de PHP et des expressions régulières pour effacer ces éléments d'interférence et améliorer l'efficacité de l'analyse et la fiabilité des données.
XML_PARSE est un analyseur XML sous-jacent fourni par PHP, qui est basé sur l'analyseur XML Expat. Il peut lire le segment des chaînes XML par segment et traiter les nœuds via des fonctions de rappel. Cependant, XML_Parse a des exigences extrêmement élevées pour le format XML. S'il y a des caractères illégaux ou des erreurs de format dans XML, il reviendra directement à l'échec.
L'utilisation de l'exemple est la suivante:
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$xml_data = file_get_contents("https://m66.net/sample.xml");
if (!xml_parse($xml_parser, $xml_data, true)) {
die("XML L'analyse a échoué: " . xml_error_string(xml_get_error_code($xml_parser)));
}
xml_parser_free($xml_parser);
function startElement($parser, $name, $attrs) {
echo "Élément de démarrage: $name\n";
}
function endElement($parser, $name) {
echo "Élément final: $name\n";
}
function characterData($parser, $data) {
echo "Contenu de données: $data\n";
}
Ce code lit XML distant et utilise une fonction de rappel pour traiter chaque balise et nœud de données étape par étape. Cependant, si le XML contient des caractères illégaux, tels que des caractères de contrôle ou des nœuds CDATA incomplets, une défaillance d'analyse se produira.
Pour que XML_Parse fonctionne correctement, les informations sur le bruit dans le XML doivent être nettoyées avant l'analyse. Cela peut être fait efficacement avec des expressions régulières. Le "bruit" commun comprend:
Caractères de contrôle (comme ASCII 0-31)
Commentaires HTML illégaux (comme <! ----> ou contenant des scripts)
Tags erronés imbriqués
Espace supplémentaire ou pause de ligne
Voici quelques exemples de traitement:
function cleanXmlData($xml) {
// Supprimer les caractères de contrôle illégal
$xml = preg_replace('/[^\x09\x0A\x0D\x20-\x7E\xA0-\xFF]/u', '', $xml);
// Supprimer le contenu des commentaires
$xml = preg_replace('/<!--.*?-->/s', '', $xml);
// Remplacer le format d'étiquette vide non valide
$xml = preg_replace('/<(\w+)[^>]*>\s*<\/\1>/', '', $xml);
// Nettoyer CDATA Masquer le script ou injecter du contenu dans
$xml = preg_replace('/<!\[CDATA\[(.*?)\]\]>/s', function($matches) {
$content = $matches[1];
// Le contenu peut être filtré au besoin,Par exemple, supprimer <script>
$content = preg_replace('/<script.*?>.*?<\/script>/is', '', $content);
return "<![CDATA[$content]]>";
}, $xml);
return $xml;
}
Intégrez les étapes de nettoyage et l'analyseur XML:
$raw_xml = file_get_contents("https://m66.net/raw-feed.xml");
$clean_xml = cleanXmlData($raw_xml);
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
if (!xml_parse($parser, $clean_xml, true)) {
die("Nettoyerdos XML L'analyse a échoué: " . xml_error_string(xml_get_error_code($parser)));
}
xml_parser_free($parser);
De cette façon, même s'il existe des informations bruyantes dans le fichier XML d'origine, il peut être analysé avec succès après le nettoyage, améliorant la stabilité du système.
La combinaison des méthodes de nettoyage de XML_PARSE et des expressions régulières peut considérablement améliorer notre tolérance aux défauts dans le traitement des données XML. La régularité peut gérer les données "sales" faiblement structurées, tandis que XML_PARSE peut traiter efficacement les documents XML bien structurés. La combinaison des deux convient aux scénarios système tels que l'analyse des journaux, la collecte de données, les passerelles API, etc. qui reposent fortement sur XML.
Rappelez-vous toujours: le prétraitement des données est la première étape pour réussir l'analyse.