Comment parser facilement du XML

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.
Vous venez d'apprendre le XML, et vous ne savez pas à quoi ça va bien pouvoir vous servir ? Ou vous voulez une méthode simple pour lire un fichier XML comme si il s'agissait d'un fichier XHTML ?
Eh bien vous êtes au bon endroit !
Nous allons apprendre à « transformer » du XML très facilement.
En avant !

Définitions

Dans cette rubrique, nous allons aborder la théorie, et LA technique utilisée pour parser simplement du XML.

Le XML

Je ne vais pas parler du XML, considérant que vous avez déjà lu et compris ce tuto et celui-ci (au moins la première partie).

La technique

Nous allons utiliser un fichier pour parser (= transformer en un autre fichier) notre fichier XML. Oui, c'est vrai, ça peut paraître un peu bizarre de transformer un fichier en un autre fichier par un fichier... o_O

Ce fichier sera écrit dans un langage que vous devriez bien connaître, puisqu'il s'agit du... XML. :-° En effet, ce langage nommé « stylesheet » (« feuille de style » en anglais), ou XSLT (eXtensible Stylesheet Language Transformation) est totalement basé sur le XML.

Le XSLT est un langage définit par le W3C et qui sert tout spécialement à la transformation de fichiers XML en... d'autres fichiers XML... Or, comme certains langages que vous devez connaître (comme le xHTML par exemple) sont eux aussi basés sur le XML...

Pour « jumeler » la feuille de style avec un document XML, on place le code suivant juste après la toute première ligne XML :

<?xml version="1.0" encoding="ISO-8859-1" ?><!--Première ligne XML--> <?xml-stylesheet type='text/xsl' href='nomStylesheet.xsl'?><!--Ligne de jumelage--> <!--Code-->

Ici, le fichier XML sera couplé avec le fichier « nomStylesheet.xsl ».

Les stylesheets ont leur extension en .xsl, pensez-y lorsque vous enregistrerez votre fichier !

Quelques informations supplémentaires

Vous serez plus loin appelés à manier les signes « < » et « > ». Or, ceux-ci sont déjà utilisés pour les balises. Veillez donc à les remplacer par « &lt; » pour « < » (Lower Than ; plus petit que), et « &gt; » pour « > » (Greater Than ; plus grand que).
Ainsi, un « <= » se transforme en « &lt;= ». Pensez-y : c'est la source de beaucoup d'erreurs !

Pour ceux qui sont déçus

Oui, je n'utilise pas le PHP. Mais il y a un tuto écrit justement pour ça.

Les bases

Comme tout langage, il y a des bases. Autant vous dire qu'elles ne sont pas très difficiles. Sachez que nous utiliseront un namespace nommé « xsl ».

Le code de base

Il y a un code de base sans lequel le fichier ne servirait strictement à rien :

<?xml version="1.0" encoding="ISO-8859-1"?><!--Vous devez connaître :)--> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!--Vous vous en doutez : on mettra le code ici--> </xsl:stylesheet>

Analysons tout ça...
D'abord, la balise XML que vous devez connaître.
Ensuite, une balise XML qui permet de dire qu'il s'agit de XSLT (avec sa version) et de faire un lien vers le site W3C par lequel passera notre document pour être transformé.

Allons un peu plus loin : en effet, si vous compilez même avec une stylesheet correcte un fichier XML... ça ne marchera pas. Pourquoi ? Parce qu'on n'a pas défini les sorties !

<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD XHTML//EN" doctype-system="http://www.w3.org/TR/2001/REC-xhtml11-20010531" indent="yes" />

Je ne vais bien sûr pas détailler tous les paramètres. Sachez simplement que « method » est l'attribut de la méthode de transformation. Ici, c'est « html », mais cette valeur peut vouloir dire aussi « XHTML ». Vous pouvez tout mettre tant que vous connaissez le doctype correspondant (le lien de l'attribut 'doctype-system'). « encoding », c'est le type de caractère. Enfin, « indent » dit si les indentations du XHTML doivent être respectées (pour les paragraphes, les listes, etc.).

Les balises en elles-mêmes

Bon, nous y voilà...
Commençons par ce que je juge être l'essentiel :

<xsl:template match="nom_balise"> <!--Ici on mettra le code qui remplacera la balise et son contenu--> </xsl:template>

Cette ci s'activera à chaque fois que, dans la lecture du fichier XML, le fichier rencontrera la balise <nom_balise></nom_balise>ou <nom_balise />. À ce moment, le fichier va écrire dans le fichier de sortir le code qu'il y a entre les balises (en l'interprétant bien-sûr :) ).

Mais si je veux récupérer le contenu des attributs et balises ?

Petits impatients : :D La suite arrive !
C'est vrai qu'avec ce code, le parser ne se pose pas de question : il remplace, un point c'est tout. Cependant, nous pouvons faire en sorte d'écrire le texte des attributs et du contenu de la balise :

<xsl:value-of select="truc" /> <!--Ne vous amusez pas à écrire ça si vous n'avez pas lu la suite !!!-->

Là il y a un truc (hahem :-° ). Entre les guillemets, il faut mettre une requête XPATH. Nous verrons ça en détail plus loin, en attendant voici quelques requêtes simples :

  • select="." : récupère le contenu de la balise en cours de parsage

  • select="@attribut" : récupère la valeur de l'attribut nommé « attribut ».

Enfin, il nous reste une dernière balise à aborder dans cette partie :

<xsl:apply-templates select="nom_balise2" />

Cette balise permet d'appeler le parsage d'une autre balise, la balise <nom_balise2></nom_balise2> (ou <nom_balise2 />), tant que cette balise est fille de la balise en cours de parsage. Sachez que vous devez mettre là aussi une requête XPATH. Pour appeler le parsage de toutes les balises filles, mettez simplement select="*".

En fait, à chaque fois que dans une balise XSLT vous voyez l'attribut « <italique>select</itlaique> », c'est que vous devez mettre une requête XPATH.

Bon, un petit exemple ?

Le XML à parser :

<?xml version="1.0" encoding="ISO-8859-1" ?> <?xml-stylesheet type='text/xsl' href='parser.xsl'?> <A> <B>aaa</B> <C> <D att="1"/> <D att="2"/> </C> <B>bbb</B> </A>

et sa stylesheet :

<?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD XHTML//EN" doctype-system="http://www.w3.org/TR/2001/REC-xhtml11-20010531" indent="yes" /> <xsl:template match="A"> <html><body> <xsl:apply-templates select="*" /> </body></html> </xsl:template> <xsl:template match="B"> <xsl:value-of select="." /><br /> </xsl:template> <xsl:template match="C"> <xsl:apply-templates select="D" /> </xsl:template> <xsl:template match="D"> <xsl:value-of select="@att" /><br /> </xsl:template> </xsl:stylesheet>

Ici, la stylesheet est nommée « parser.xsl ».
Vous remarquerez que j'ai mis des balises XHTML dans la stylesheet. On a tout à fait le droit ! C'est quand même notre premier but de transformer du XML en XHTML...

J'espère que vous avez tout reconnu !

Pour lancer un document XML comme s'il s'agissait d'une page XHTML, il suffit de double-cliquer sur l'icone de votre document XML. Si le lien est bien fait, vous n'aurez aucun problème, sauf peut-être des erreurs dans votre code, qui seront alors indiquées à la place du document.

Bon, un petit exercice... :diable:

Voilà mon code :

<?xml version="1.0" encoding="ISO-8859-1" ?> <!--Ici, la ligne de jumelage. Je vous laisse la faire--> <tirelire nom="Ma tirelire"> <billet5 nombre="10">Allemandes</billet5> <billet10 nombre="5">Autrichiennes</billet10> <piece2 nombre="12">Françaises</piece2> <piece2 nombre="4">Espagnoles</piece2> <cent50 nombre="6">Italiennes</cent50> </tirelire>

Je veux que vous obteniez cela :

Citation : Ce que vous devez obtenir (ne tenez pas compte de la police, elle est automatique)

Tirelire : Ma tirelire
Billets de 5 euros : nombre = 10, nationalité = Allemandes
Billets de 10 euros : nombre = 5, nationalité = Autrichiennes
Pièces de 2 euros : nombre = 12, nationalité = Françaises
Pièces de 2 euros : nombre = 4, nationalité = Espagnoles
Pièces de 50 cents : nombre = 6, nationalité = Italiennes

Et pas de tricherie ! Je veux un code qui parse quand même si on change le XML !!! :colere2:

Au travail !

...

...

C'est bon ? Voilà la correction :

<?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD XHTML//EN" doctype-system="http://www.w3.org/TR/2001/REC-xhtml11-20010531" indent="yes" /> <xsl:template match="tirelire"> <html><body>Tirelire : <xsl:value-of select="@nom" /><br /> <xsl:apply-templates select="*" /><br /> </body></html> </xsl:template> <xsl:template match="billet10"> Billets de 10 euros : nombre = <xsl:value-of select="@nombre" />, nationalité = <xsl:value-of select="." /><br /> </xsl:template> <xsl:template match="billet5"> Billets de 5 euros : nombre = <xsl:value-of select="@nombre" />, nationalité = <xsl:value-of select="." /><br /> </xsl:template> <xsl:template match="piece2"> Pièces de 2 euros : nombre = <xsl:value-of select="@nombre" />, nationalité = <xsl:value-of select="." /><br /> </xsl:template> <xsl:template match="cent50"> Pièces de 50 cents : nombre = <xsl:value-of select="@nombre" />, nationalité = <xsl:value-of select="." /><br /> </xsl:template> </xsl:stylesheet>

Il faut avouer qu'il était simple, mais répétitif. Attention cependant, ce n'est pas la seule solution qui existe !

Programmez dans vos stylesheets !

Cette partie n'est pas vraiment indispensable, mais je vous la recommande vivement ! En effet, il est possible de programmer dans vos stylesheets... Allons-y ! ^^

La structure if et choose

Il existe dans ce langage des structures conditionnelles : if et choose. Ne vous méprenez pas, il n'y a pas de else...

La structure if

Voici d'emblée le code :

<xsl:if test="a == b"> <!--Le code--> </xsl:if>

If (= « si » en anglais) permet de tester une opération. Ici, il s'agit de « a=b ». Les opérations booléennes sont les mêmes que pour n'importe quel langage de programmation :

  • '<' pour « si ... inférieur à ... ».

  • '>' pour l'inverse.

  • '<=' pour « ... inférieur ou égal ... ».

  • '>=' pour « ... supérieur ou égal ... ».

  • '==' pour « ... égal ... » (attention il y a deux signes « égal »).

  • '!=' pour « ... différent de ... ».

Cette structure est pratique, si on utilise une fonction pour la canaliser. On apprendra ça plus tard.

La structure choose

Étant donné que le « else » (sinon) n'existe pas dans la structure if, une autre structure a été développée. Il s'agit d'une structure où il existe des « cas » selon la valeur d'entrée :

<xsl:choose> <xsl:when test="test = a"> <!--Code--> </xsl:when> <xsl:when test="test = b"> <!--Code--> </xsl:when> ... </xsl:choose>

Ici, le code ne sert à rien. Il est encore une fois préférable de l'utiliser dans une fonction.

Notez qu'il existe une condition nulle, c'est-à-dire appelée si aucun des cas ne correspond à la valeur d'entrée. Cette balise est :

<xsl:otherwise> <!--Code--> </xsl:otherwise> Les fonctions

Enfin les voilà !
Vous allez voir, c'est très simple. Pour déclarer une fonction, on utilise cette balise :

<xsl:template name="nomFonction"> <!--Le code de votre fonction--> </xsl:template>

Alors, ça ne vous rappelle rien ?
Et pour l'appeler, on utilise celle-là :

<xsl:call-template name="nomFonction" />

Dans les deux cas, « nomFonction » désigne le nom de votre fonction (vous pouvez le changer si vous le voulez). Je pense que ça paraît logique, mais il faut toujours déclarer une fonction avant de l'appeler.

Faites attention : call-template n'est pas pareil que apply-templates, ne vous trompez pas ou vous aurez de graves erreurs !

Bon ben on a fini, salut.

Eh attends ! Où sont les paramètres ?

Il vous faut toujours quelque chose !
Bon allez... Je suis sympa.
Il suffit juste de modifier un peu le code de la fonction :

<xsl:template name="nomFonction"> <xsl:param name="parametre" select="0" /> </xsl:template>

Et pour l'appeller :

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.

Comment parser facilement du XML

Prix sur demande