Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Langage, bibliothèques et fonctions > Lecture du tutoriel

[XML] Création d'un système de parsage XML pour un langage tel que le zCode

Avatar
Auteur : Savageman
Créé : le 18/08/2006 21:28:35
Modifié : le 19/04/2008 11:09:30
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)

Bonjour à toi, ami zéro ! Si tu viens par ici, c'est que le titre de ce tutoriel t'a accroché, et je vais essayer de ne pas te décevoir. Tu as sûrement l'habitude des cours simples et clairs de M@teo21, et je vais essayer de faire aussi bien que lui (bien que je n'ai pas autant d'expérience dans ce domaine).

Comme son nom l'indique, ce magnifique tutoriel va s'appuyer sur le zCode, donc avant de lire celui-ci, tu dois connaître le zCode.
Si tu ne le connais pas, va d'abord lire le premier chapitre rédigé par l'auteur du zCode.

C'est un mini-tuto assez long, mais le sujet et vaste, et surtout vous pourrez réaliser votre propre système de zCode complet à la fin : ça en vaut donc la chandelle !

Sommaire du chapitre :

Introduction : qu'est ce qu'un système de parsage ?

Un peu d'histoire



Définitions



Le mot parsage nous vient du verbe anglais "to parse", qui signifie littéralement "analyser". Le verbe anglais a donné naissance au verbe français "parser", qui est un simple synonyme d'analyser. C'est une francisation employée couramment dans le monde de la programmation d'aujourd'hui.
Le parsage est le fait d'analyser quelque chose.
Le parseur est le script qui analyse une donnée d'entrée.
Un système de parsage est donc un système d'analyse. Un système de parsage XML est un système d'analyse XML.

Analyse, c'est bien gentil, mais ça sert à quoi, analyser ?

Généralisation



Un système d'analyse de code en soi-même ne sert à rien. En effet, ça ne sert à rien de savoir qu'il y a une variable, une chaîne de caractères ou encore un bloc d'instructions à un endroit : il faut bien faire quelque chose de ce code !
C'est pourquoi un système de parsage va rarement seul, et sert à appliquer un traitement à l'objet d'analyse.
De cette façon, beaucoup de personnes ont étendu le mot parsage à système de transformation. Ce système de parsage utilise un parseur, qui fait la moitié du travail : l'analyse de la donnée d'entrée. Reste la deuxième moitié : la transformation.

Le tout en schéma



Image utilisateur

Le standard XML

Définition, buts et origine



Définition



XML est un langage de description de données. XML est l'abréviation de eXtensible Markup Language. C'est un langage de balises (markup language) extensible. C'est-à-dire que l'on peut définir ses propres balises et leur signification.

Buts et origine



À l'origine de XML, il y a le W3C, qui a créé un groupe de travail en 1996. La norme XML 1.0 a été publiée le 10 février 1998.
XML avait pour but d'être utilisable sans difficulté sur Internet et de soutenir un grand nombre d'applications. Le langage devait être clair, facile et rapide à écrire tout en étant compréhensible par l'homme.
La dernière norme XML est la 1.1 (2ème version), publiée le 16 août 2006.

Comme tu peux le voir, XML avait de grande ambitions... Qui ont été réalisées avec succès ! XML est aujourd'hui un standard reconnu !
Grâce à son succès, un vrai monde s'est formé autour de XML (on l'appelle la galaxie XML). En voici les composantes les plus connues :


Les notions du langage



La base du langage est le noeud, ce qui permet de représenter un document XML sous forme d'un arbre.

XML définit des noeuds de 3 types :

Un noeud élément peut contenir ou non des noeuds attributs. L'ensemble composé d'un noeud élément, et des noeuds attributs associés au noeud élément s'appelle une balise.
Seuls les noeuds éléments peuvent contenir des sous-noeuds, mais ils peuvent en contenir une infinité.

Ce qui vient d'être dit est très important : relis-le un coup pour être sûr d'avoir tout compris et ne pas confondre les termes noeud, élément et attribut !


Un document XML possède un prologue (obligatoire depuis la norme 1.1) : le DTD (définition du type de document en français). Cette DTD sert à définir les éléments de la page, ainsi que leurs attributs et les éléments qu'ils peuvent contenir.
D'autres prologues sont disponibles, comme le XML Schema, qui intègre toutes les nouveautés de la norme 1.1, mais ils sont encore peu utilisés.

XHTML est une DTD qui définit tous les éléments que vous connaissez : <html> <head> <title> <body> <div> etc.


En bref



La norme XML a suscité un grand engouement et possède maintenant une grande communauté active. Le monde XML est éprouvé et peut être utilisé dans beaucoup de langages, dont le PHP, qui intègre pas moins de 6 extensions différentes pour faire du XML.
Le XML t'intéresse ? Tu peux aller lire ce tutoriel qui décrit plus longuement ce langage.

Apprenons à recréer le zCode !

Il est maintenant temps d'entrer dans le vif du sujet : la réalisation du parseur pour le zCode !

Regardons les outils à notre disposition pour traiter du XML sur php.net.
Recherchons "XML", nous tombons sur cette page.

Voici un parseur XML pour PHP ! La popularité de XML est donc au rendez-vous et nous trouvons des librairies officielles toutes prêtes :) . En vrai, il existe encore d'autres librairies officielles XML pour PHP : XMLReader, XMLWriter, DOM, DOMXML et XMLRPC. Mais nous utiliserons XML (la première citée), car elle est utilisable sans installation dans toutes les versions de PHP.

Regardons maintenant ce qu'elle permet de faire. Lisons un peu la documentation, et nous tombons sur cet exemple :

Citation : http://fr.php.net/manual/fr/ref.xml.php
Example#2 Transtypage XML -> HTML

Voici quelque chose de très intéressant : cette exemple transforme les balises <BOLD> en <B>, les balises <EMPHASIS> en <I>, les balises <LITERAL> en <TT>, et ignorent toutes les autres balises ! Nous n'avons pas encore réfléchi quant au comportement à adopter avec les balises inconnues, mais les ignorer semble pas mal : cela règle un bon nombre de problèmes de sécurité.

C'est presque ce qu'on veut (pas tout à fait, quand même...) : on veut transformer <gras> en <span style="gras">, par exemple !

Attardons-nous donc 2 secondes sur le code pour voir comment il fonctionne.

Dans l'exemple, nous pouvons voir la ligne :Code : PHP
1
<?php xml_set_element_handler($xml_parser, "startElement", "endElement");

Cette ligne indique en fait au parseur des fonctions de "callback" à appeler lorsqu'il rencontre un tag d'ouverture ou de fermeture d'une balise (il faut spécifier les deux). Ici, la fonction de callback pour un élément ouvrant est startElement(), et celle pour un élément fermant est endElement().

La fonction de callback pour un tag d'ouverture prend 3 arguments en paramètre. Le premier vous fournit une référence vers le parseur, le deuxième vous fournit le nom de la balise (BOLD, EMPHASIS, LITERAL, ... ), et enfin les attributs de cette balise (comme par exemple son ID).
La fonction de callback pour les tags de fermeture prend les deux mêmes premiers arguments que la fonction de callback pour les tags d'ouverture.
Par défaut, les noms des balises et des attributs sont convertis en majuscules par le parseur : faites bien attention !
Vous pouvez changer ce comportement en utilisant la commande ci-dessous :
Code : PHP
1
<?php xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

Cette fonction permet également de modifier d'autres options telles que l'encodage de sortie notamment (référez-vous à la documentation pour une liste exhaustive).

La ligne suivante de l'exemple est :Code : PHP
1
<?php xml_set_character_data_handler($xml_parser, "characterData");

Cette ligne indique également une fonction de callback, mais ce coup-ci, c'est pour le texte littéral, c'est-à-dire ce qu'il y a entre les balises.
Cette fonction de callback prend deux paramètres : une référence vers le parseur et les données (le texte).

Ces fonctions de callback jouent un rôle déterminant dans le traitement à appliquer aux données de départ.

Dans la fonction startElement(), nous avons le code suivant :
Code : PHP
1
<?php if (isset($map_array[$name]))

Cette condition permet de repérer si la balise rencontrée doit être remplacée par notre parseur ou non. Cette condition sert à traiter uniquement les balises contenues dans le tableau $map_array, et d'ignorer les autres.

La même condition est présente dans la fonction endElement().

Pour garder un document cohérent, il est indispensable de traiter les mêmes balises dans les deux fonctions. Si vous traitez la balise <gras> et que vous la transformez en <span class="gras">, il faudra alors afficher </span> dans la fonction qui traite les fins de balise afin que le document final soit cohérent.

Nous avons compris le principe de fonctionnement du script ; modifions maintenant le tableau $map_array et les deux fonctions startElement et endElement afin de correspondre à notre besoin : afficher <span style="notre_style_personnalise"> au lieu de nos balises <gras> et <italique> !
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
// Fichier source
$file = "data.xml";
 
$map_array = array(
   "GRAS"    => "font-weight: bold;",
   "ITALIQUE" => "font-style: italic;",
);
 
function startElement($parser, $name, $attrs)
{
   global $map_array;
   if (isset($map_array[$name])) {
       echo '<span style="'.$map_array[$name].'">';
       // ou echo '<span class="'.$name.'">';
   }
}
 
function endElement($parser, $name)
{
   global $map_array;
   if (isset($map_array[$name])) {
       echo "</span>";
   }
}
 
function characterData($parser, $data)
{
   echo $data;
}
 
$xml_parser = xml_parser_create();
// Utilisons la gestion de casse, de manière à être sûrs de trouver la balise dans $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
   die("Impossible de trouver le fichier XML");
}
 
while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("erreur XML : %s à la ligne %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
?>

Nous n'avons donc pas modifié le reste de l'exemple, juste le tableau $map_array et les fonctions startElement et endElement. Cet exemple traite le cas d'un fichier source, mais nous verrons l'intégration d'un formulaire dans une prochaine partie.

Nous pouvons (une fois de plus, si vous avez l'habitude de travailler avec la documentation) démontrer la puissance de la documentation PHP : nous avons fait un début parseur XML pour un langage tel que le zCode en moins de 10 minutes !

Ce tutoriel touche à sa fin. J'espère avoir été clair, qu'il vous aura plu, et que vous aurez compris le principe de la transformation.
Maintenant c'est à vous de travailler pour faire votre propre zCode personnalisé avec les balises que vous aurez choisies, alors au travail !

Pour toute question, n'hésitez pas à m'envoyer un message privé !
Auteur : Savageman
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 304 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.0796s (0.0615s)