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)
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
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 :
- XPath ;
- XLink ;
- XSL ;
- XQuery ;
- DOM ;
- RDF.
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 :
- élément ;
- attribut ;
- texte simple.
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.
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.phpExample#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 : PHP1 | <?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 : PHP1 | <?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 : PHP1 | <?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 : PHP1 | <?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 !