L'analyseur XML intégré de PHP (basé sur la bibliothèque Expat) est un outil très puissant lorsqu'il s'agit de données XML complexes. Grâce à xml_parser_create () et aux fonctions de traitement qui l'accompagnent, nous pouvons analyser de manière flexible la structure XML. Surtout lorsque vous êtes confronté à des documents XML avec des niveaux de nidification profonds et de nombreux éléments, un gestionnaire d'éléments personnalisé améliorera considérablement l'efficacité et la lisibilité de l'analyse.
Cet article expliquera en détail comment utiliser xml_set_element_handler () pour personnaliser le processeur d'élément XML et analyser une structure de données XML complexe avec un exemple de code.
Lorsque l'analyse des flux XML à l'aide de XML_Parse () , nous pouvons enregistrer deux fonctions de rappel pour l'analyseur via XML_SET_Element_Handler () :
startElementHandler : la fonction de rappel pour démarrer la balise
EndementHandler : fonction de rappel pour la fin des balises
Les signatures de ces deux fonctions sont généralement les suivantes:
function startElement($parser, $name, $attrs)
function endElement($parser, $name)
où $ name est le nom du nœud actuel et $ attrs est le tableau associatif, représentant les attributs du nœud.
Supposons que nous obtenons des données XML dans le format suivant à partir d'une API:
<catalog>
<book id="001">
<title>PHP Pratiques de développement</title>
<author>Zhang San</author>
<price currency="CNY">89.00</price>
</book>
<book id="002">
<title>Compréhension approfondie XML</title>
<author>Li si</author>
<price currency="CNY">75.50</price>
</book>
</catalog>
Nous rédigerons un analyseur qui extrait les informations de titre, d'auteur et de prix pour chaque livre et les publie.
<?php
$xmlData = file_get_contents('https://m66.net/api/books.xml');
// Utilisé pour stocker les résultats analysés
$books = [];
$currentBook = [];
$currentTag = "";
// créer XML Analyseur
$parser = xml_parser_create("UTF-8");
// Définissez les fonctions de traitement pour les balises de début et de fin
xml_set_element_handler($parser, "startElement", "endElement");
// Définir la fonction de traitement des données des caractères
xml_set_character_data_handler($parser, "characterData");
// 设置Analyseur参数
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); // Gardez le cas d'étiquette cohérent
// Définir les fonctions de traitement
function startElement($parser, $name, $attrs) {
global $currentBook, $currentTag;
$currentTag = $name;
if ($name == "book") {
$currentBook = [
"id" => $attrs['id'] ?? null,
"title" => "",
"author" => "",
"price" => "",
"currency" => ""
];
}
if ($name == "price" && isset($attrs['currency'])) {
$currentBook['currency'] = $attrs['currency'];
}
}
function endElement($parser, $name) {
global $books, $currentBook, $currentTag;
if ($name == "book") {
$books[] = $currentBook;
$currentBook = [];
}
$currentTag = "";
}
function characterData($parser, $data) {
global $currentBook, $currentTag;
$data = trim($data);
if (empty($data)) return;
switch ($currentTag) {
case "title":
$currentBook["title"] .= $data;
break;
case "author":
$currentBook["author"] .= $data;
break;
case "price":
$currentBook["price"] .= $data;
break;
}
}
// Exécuter l'analyse
if (!xml_parse($parser, $xmlData, true)) {
die(sprintf("XML erreur: %s Dans le %d D'ACCORD",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
// Résultats de l'analyse de sortie
foreach ($books as $book) {
echo "Titre de livre: {$book['title']}\n";
echo "auteur: {$book['author']}\n";
echo "prix: {$book['price']} {$book['currency']}\n";
echo "------------------------\n";
}
Suivi du contexte à l'aide de variables de statut <br> Les variables d'état comme $ currenttag et $ currentbook sont très critiques lorsqu'elles sont imbriquées profondément et peuvent vous aider à déterminer dans quel nœud vous êtes actuellement.
Filtrer les caractères des espaces
Le personnageData peut recevoir un grand nombre de nouvelles lignes et d'espaces, et vous devez couper () pour déterminer s'il est vide.
Évitez les affectations répétées <br> Un contenu de balise peut être renvoyé dans plusieurs segments (en particulier le texte long), et l'utilisation . = L'épissage peut empêcher la troncature des données.
Utilisation de l'espace de noms pour traiter le XML complexe
Si XML utilise un espace de noms, il est recommandé d'utiliser des API avancées telles que XML_SET_START_NAMESPACE_DECL_HANDLER () pour coopérer avec l'analyse.
Étiquettes associées:
xml_parse