[DOM] Parser du XML - L'exemple du zCode

Formation

En Semi-présenciel Paris

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Méthodologie

    En semi-présentiel

  • Lieu

    Paris

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Les sites et dates disponibles

Lieu

Date de début

Paris ((75) Paris)
Voir plan
7 Cité Paradis, 75010

Date de début

Consulter

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

Bonjour à tous, chers Zéros !

Si vous vous demandez ce qu'est un parseur (ou « parser ») XML, à quoi cela peut bien servir ou encore comment élaborer un langage comme le zCode, ce tutoriel est fait pour vous. ^^

Nous aborderons ensemble les bases du parsage en XML à travers la mise en place d'un système de parsage pour le zCode ! Mais je vous sens intrigués, pleins de fougue et d'entrain : entrons donc sans plus tarder dans le vif du sujet. ;)

Avant de commencerPrérequis

Avant de mettre les mains dans le cambouis, je tiens à vous avertir qu'il vous faut avoir suivi en entierle cours de M@teo21 sur le PHP (expressions régulières comprises) ainsi que le tuto de Tangui qui introduit le langage XML.

Un parseur XML…… qu'est-ce que c'est ?

Si vous avez lu les chapitres concernant les Regex, vous avez codé un parseur pour le bbcode. En réalité, un parseur XML fait exactement la même chose, à la différence près que le langage à parser est fondé sur du XML. Le parseur est chargé de traduire le code XML en XHTML : il s'agit donc d'un script PHP qui va réaliser cette transformation.

« Parseur » est le mot francisé de « parser » en anglais. On parle aussi d'analyseur syntaxique.

Pourquoi XML ?

En plus des avantages du parsage en général, un parseur XML offre son (gros) lot d'avantages. En effet, grâce à l'API DOM intégré à PHP5, on peut non seulement élaborer très facilement un parseur, mais aussi gérer des fonctionnalités plus poussées de ce langage. :)
Voici une liste non exhaustive des atouts de DOM par rapport aux Regex :

  • plus « subtil » ;

  • plus complet ;

  • permet de gérer des fichiers XML (sauvegarde, ouverture, fermeture).

La seule contrainte de DOM est qu'il faut respecter les règles élémentaires du XML (balises entre chevrons, etc.).

Dites, ça ne vous fait pas penser à un langage existant, ce genre de système ? :-°
Mais si ! Le zCode ! Effectivement, le zCode utilise DOM et le XML pour parser ses messages (consultez cette page pour en avoir la confirmation). Au final, votre langage ressemblera peut-être au zCode. Nous nous fonderons sur ce dernier pour illustrer l'utilisation de DOM.

J'utiliserai des balises spécifiques au zCode. Pour nos visiteurs qui ne seraient pas encore familiers avec ce langage, voici (« Encore ? », me direz-vous) un peu de lecture.

DOM n'est disponible que pour PHP5. Son prédécesseur DOM XML (PHP4) et lui n'ont pas grand-chose en commun, bien que le principe reste le même.

Jetez un coup d'œil à cette brève présentation de DOM, puis découvrons ensemble la magie du parsage XML. :magicien:

À la découverte de DOMBut de cette partie

L'objectif est de vous initier à DOM en parsant une balise < gras> . Ce n'est peut-être pas encore le nirvana, mais il s'agit d'un passage nécessaire avant de réaliser dans la prochaine partie un parseur digne de ce nom.

Vous pouvez intégrer les feuilles de style du SdZ afin d'obtenir un résultat très fidèle au rendu de ce dernier.

Chargeons le XML

Comment charger du XML pour l'utiliser dans DOM ? C'est ce que nous allons voir.

La notion d'arbre XML

Ce terme désigne l'arborescence d'un langage XML, c'est-à-dire l'enchaînement de nœuds qui s'imbriquent les uns dans les autres. DOM se sert de cet arbre pour fonctionner : on dit qu'il adopte un fonctionnement hiérarchique. Ci-dessous, un exemple d'arbre XML.

<?xml version="1.0" encoding="ISO-8859-1"?> <zcode> <gras>Bonjour</gras>, ça va ? <couleur nom="rouge">Très bien, merci.</couleur> <liste> <puce>Et tes enfants ?</puce> <puce>Ils passent trop de temps sur le SdZ. :)</puce> </liste> </zcode> Récupérer du contenu XML

Nous allons voir comment récupérer cet arbre avec DOM. Cette étape est indispensable.

DOM est orienté objet. Par conséquent, il comporte forcément des classes et des méthodes que nous allons utiliser. Nous allons nous familiariser avec ces classes au fur et à mesure de notre progression dans ce tutoriel.

On commence par initialiser deux éléments : le premier est le document XML chargé par DOM, le second est la chaîne de caractères qui va contenir le code XHTML à afficher (cet élément est facultatif).

<?php $document_xml = new DomDocument(); // Instanciation de la classe DomDocument : création d'un nouvel objet $resultat_html = ''; // Initialisation de la chaîne qui contient le résultat ?>

On voit que le premier type de classe que nous utilisons est DomDocument : il s'agit d'un document DOM . ;)
Pour l'instant, $document_xml est vide : il faut donc le remplir avec du XML. On peut le faire de deux manières.

Imaginons que vous ayez un fichier zcode.xml dans le même dossier que votre script ; il vous faut l'ouvrir avec DOM. Pour cela, on utilise la méthode load (c'est une méthode DomDocument, bien entendu).

<?php $document_xml->load('zcode.xml'); // Chargement à partir de zcode.xml ?>

Vous remarquez que l'on obtient la méthode load grâce à « -> » : il en sera de même pour les variables d'un objet.

On peut faire la même chose à partir d'une chaîne de caractères tout à fait banale.

<?php $chaine_xml = '<?xml version="1.0" encoding="ISO-8859-1"? > <zcode><gras>Bonjour</gras>, ça va ? <couleur nom="rouge">Très bien, merci.</couleur> <liste> <puce>Et tes enfants ?</puce> <puce>Ils passent trop de temps sur le SdZ. :)</puce> </liste> </zcode>'; // Chaîne de caractères contenant le texte XML à parser. $document_xml->loadXML($chaine_xml); // On charge du XML à partir de $chaine_xml. ?>

Vous pouvez aussi sauvegarder une chaîne de caractères XML dans un fichier.

<?php $document_xml->save('un_nouveau_fichier_xml.xml'); ?> Comment récupérer des balises ?

Nous avons chargé le XML : comment récupérer les balises afin de les parser ?

La notion de nœud

Un nœud est un élément de l'arbre XML. Dans notre exemple, on peut distinguer les nœuds zcode, gras, couleur, liste, nom, etc.

Un nœud peut donc être :

  • un ensemble de balises qui vont par paires (<zcode></zcode> ) ;

  • un contenu textuel (à l'intérieur de balises < gras></ gras> , par exemple) ;

  • l'attribut d'une balise (son nom) ;

  • la valeur de l'attribut (entre guillemets).

Quand on parle du nœud zcode, on parle de tout ce qui se trouve entre <zcode> et </zcode>  :

<gras>Bonjour</gras>, ça va ? <couleur nom="rouge">Très bien, merci.</couleur> <liste> <puce>Et tes enfants ?</puce> <puce>Ils passent trop de temps sur le SdZ. :)</puce> </liste>

Le nœud gras, quant à lui, contient :

Bonjour

En fait, gras contient un nœud textuel appelé #text, qui lui contient bien uniquement une valeur « Bonjour ».

On distingue différentes catégories de nœuds, définies selon leur organisation.

  • Nœud racine : c'est celui qui englobe le contenu du fichier XML. Ici, il s'agit de zcode. Il ne peut y avoir qu'un nœud racine par document.

  • Nœud parent : on parle du nœud qui englobe le nœud dont on parle. Pour nous, le nœud parent de puce est liste, celui de liste est zcode. Notez bien que nom a pour nœud parent couleur.

  • Nœud associé : on utilise ce terme pour désigner les attributs. Le nœud associé de couleur est nom. En revanche, liste n'a pas de nœud associé.

  • Nœud enfant : on veut parler des nœuds compris dans le nœud dont on parle. Par exemple, le nœud enfant de liste est puce. Notez que le nœud enfant de nom est rouge : cela désigne aussi les valeurs des attributs.

On peut également les distinguer selon leur type (nœud textuel, attribut, etc).

DOM : un véritable sac de nœuds

DOM repose entièrement sur les nœuds, et vous serez inexorablement amenés à les utiliser. DOM « découpe les nœuds » et les trie selon leur position dans l'arbre XML.

Nom du nœud

Caractéristiques du nœud

Contenu du nœud

puce (no 2)

Nœud enfant de liste et de zcode.
A pour enfant un nœud #text invisible contenant le vrai texte.

Ils passent trop de temps sur le SdZ. :)

puce (no 1)

Nœud enfant de liste et de zcode.
A pour enfant un nœud #text invisible contenant le vrai texte.

Et tes enfants ?

liste

Nœud enfant de zcode.
Nœud parent de puce.

<puce>Et tes enfants ?</puce> <puce>Ils passent trop de temps sur le SdZ. :)</puce>

nom

Nœud enfant de couleur.
A pour enfant un nœud #text invisible contenant le vrai texte.

<police nom="courrier">rouge</police>

couleur

Nœud enfant de zcode.
A pour enfant un nœud #text invisible contenant le vrai texte.

Très bien, merci.

Texte (sans nœud particulier)

Nœud enfant de zcode.
A pour enfant un nœud #text invisible contenant le vrai texte.

, ça va ?

gras

Nœud enfant de zcode.
A pour enfant un nœud #text invisible contenant le vrai texte.

Bonjour

zcode

Nœud racine.

<gras>Bonjour</gras>, ça va ? <couleur nom="rouge">Très bien, merci.</couleur> <liste> <puce>Et tes enfants ?</puce> <puce>Ils passent trop de temps sur le sdz :)</puce> </liste>

Vous voyez que DOM décompose l'arbre XML en détaillant beaucoup. Tout ce qu'il nous reste à faire, c'est exploiter cette décomposition intelligemment. On peut également représenter une interprétation DOM sous la forme d'un arbre :

Un document XML selon DOM

Vous comprenez à présent les appellations « arbre » et « nœud » : les programmeurs filent souvent la métaphore. ^^

En pratique

Récupérons le nœud zcode.

<?php $elements = $document_xml->getElementsByTagName('zcode'); ?>

Nous utilisons getElementsByTagName, ce qui signifie obtenirElementsParNomDeBalise. On récupère ainsi le nœud zcode (il n'y en a qu'un car c'est le nœud racine).

Cette méthode retourne un objet de type DomNodeList. C'est une classe qui a pour caractéristique de lister des nœuds.

Ce ne sont pas des array ! On ne peut pas obtenir les entrées avec des crochets ! Par contre, on peut se servir de la structure foreach.

Pour récupérer des éléments d'une instance de DomNodeList, vous devez utiliser la méthode item. Exemple :

<?php $premier_element_liste = $liste_dom->item(0); ?>

Les DomNodeList sont composées d'objets de type DomNode. DomNode est une classe qui représente un nœud. Si, par exemple, vous récupériez les nœuds puce, vous pourriez les obtenir avec foreach.

<?php foreach($elements as $element) { // Effectuez les opérations sur $element } ?>

Mais nous ne ferons pas comme cela, pour la simple et bonne raison qu'avec cette méthode, on parse par nom de balise, mais pas dans l'ordre du texte. o_O Essayez, vous verrez !
Nous récupérerons donc zcode...

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

[DOM] Parser du XML - L'exemple du zCode

Prix sur demande