TP axe ISI - École des Mines de Saint

Transcription

TP axe ISI - École des Mines de Saint
T.P. d’initiation à XML
Axe ISI - Philippe Beaune et Yann Krupa
Lundi 13 octobre 2008 matin / 3h
Résumé
Ce T.P. consiste en la découverte de XML et de quelques outils de base
permettant la validation, la manipulation et la transformation de fichiers
XML.
1
Objectif et moyens
À l’issue de ce T.P., vous devrez savoir créer des documents XML et des
DTD, valider des documents XML, et faire des transformations de documents
XML.
Pour cela nous utiliserons des outils classiques et disponibles dans l’environnement Linux : xmllint et xsltproc.
Dans le temps imparti nous ne pourrons pas découvrir comment le logiciel
eclipse permet de faciliter la création de documents XML et les transformer. De
plus, nous ne manipulerons pas de fichiers XML avec le langage JAVA. Pour les
plus curieux d’entre vous, sachez que certains T.P. des années passées, toujours
accessibles sur le site du cours, abordaient ces aspects des choses.
La partie 2 ci-dessous est une découverte des outils utiles pour la partie 3.
Vous devez réaliser cette partie 2 en 1h30, pour consacrer ensuite 1h30 à la
partie 3, qui est plus intéressante.
En fin de T.P. vous devrez m’envoyer un mél : mailto:[email protected]
2
2.1
Vérification de syntaxe, et validation de fichiers XML
Installation des logiciels
La distribution Linux des machines à votre disposition contient a priori tous
les outils requis pour ce T.P. Vous n’avez donc pas à les installer. Néanmoins,
si vous vous trouvez devant une machine ne contenant pas les logiciels requis,
sachez que le T.P. d’il y a 2 ans (encore disponible sur le site du cours) expliquait
comment les installer.
1
2.2
L’inévitable HelloWorld, bien formé puis valide
Créez un nouveau fichier xml (nommé hello.xml ) contenant un seul élément
nommé greeting et dont le contenu est Hello World !.
Première chose à faire : vérifier qu’il est bien formé :
xmllint hello.xml
Pas très explicite comme réponse, a priori (si vous n’avez pas fait d’erreur
dans votre document XML). Introduisez donc une erreur de syntaxe dans le
fichier hello.xml et recommencez. Au vu du résultat il semble donc que le fichier
d’origine était bien formé. Ré-essayez (avec toujours l’erreur) en testant certaines
options (qui vous semblent pertinentes) de xmllint. Pour connaitre ces options :
xmllint --help
ou :
man xmllint
Par exemple, l’option recover permet d’obtenir, parfois, une proposition intéressante de correction du fichier mal formé.
Écrivez maintenant la DTD correspondant à ce fichier hello.xml et testez sa
validité :
xmllint --dtdvalid hello.dtd hello.xml
Si votre document XML contient la déclaration de sa DTD, ce n’est plus
la peine d’indiquer à xmllint le nom de cette DTD. Dans ce cas la commande
devient :
xmllint --valid hello.xml
Introduisez des erreurs pour voir comment se comporte xmllint.
Augmentez votre fichier XML avec un nouvel élément nommé salutation
et ayant comme contenu Bonjour Le Monde ! : votre fichier XML est-il toujours
bien formé ? Est-il toujours valide ?
2.3
Transformation de HelloWorld
En reprenant le fichier hello.xml d’origine, écrivez une feuille de style XSL-T
permettant de générer un fichier HTML où Hello, World ! s’afficherait en style
h1. Vous pouvez nommer ce nouveau fichier hello.xsl.
Une version basique d’un template de cette feuille de style XSL-T peut être :
<xsl:template match="greeting">
<html>
<body>
<h1>
<xsl:value-of select="."/>
</h1>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2
NB : comme sous-élément de l’élément stylesheet vous pouvez ajouter l’élément suivant : <xsl:output method="html"/>. Il permet d’indiquer au processeur XSL-T qu’il devra générer du HTML, même si cela n’est pas indispensable
dans le cas présent.
Vérifiez que votre fichier XSL-T est bien formé. Pour appliquer la transformation, utilisez xsltproc :
xsltproc -o hello.html hello.xsl hello.xml
Testez le fichier obtenu hello.html dans un navigateur web.
Si vous transformez le fichier hello.xml pour qu’il contienne deux greetings (un
en anglais et un en français), le tout englobé dans une balise truc, alors votre
DTD ne fonctionnera plus (modifiez la) et votre hello.xsl ne fonctionnera pas
non plus : modifiez le de façon à ce qu’il sorte du bon HTML (par exemple, une
seule balise html doit apparaı̂tre).
ASTUCE : plutôt que de demander à xlstproc de fabriquer un document HTML
puis de visualiser celui-ci avec FireFox, vous allez utiliser le processeur XSLT
inclus dans FireFox. Pour cela ajouter cette ligne à votre feuille de style :
<?xml-stylesheet version="1.0" href="hello.xsl" type="text/xsl"?>
et ouvrez hello.xml directement avec FireFox.
2.4
Histoires de recettes
Dans ce répertoire :
http://www.emse.fr/~beaune/docnum/2006_2007/recettes/
se trouvent un fichier XML et sa DTD décrivant des recettes de cuisine (fichiers
issus du cours de Jean-Jacques Girardot, merci à lui). Chargez ces deux fichiers
sur votre machine.
Vérifiez que le fichier XML est bien formé et valide. Notez que puisque le fichier
recettes.xml contient l’URL de sa DTD, la commande suivante est suffisante
pour vérifier la validité :
xmllint --valid --noout recettes.xml
Pour bien comprendre le contenu de recettes.xml, ajoutez une recette et revérifiez.
Maintenant on va piocher dans ces recettes. Pour extraire tous les titres de
recettes, avec cette règle, à insérer dans le bon template, ça devrait aller :
<xsl:value-of select="titre"/>
Incluez la dans une feuille de style et testez la.
Pour continuer la pioche, et pour extraire toutes les recettes faciles, avec
cette règle, ça devrait aller :
<xsl:apply-templates select="/*/*[difficulte=’Facile’]"/>
Incluez la dans une feuille de style et testez la.
Pour vous entrainer avec les formules XPATH, vous pouvez le faire en ligne
avec xmllint :
3
xmllint --shell recettes.xml
Essayez du, puis cat.
Avec cat /*/*[difficulte=’Facile’] vous sélectionnez les seules recettes
prétendues faciles. Si vous ne voulez que les titres de ces recettes dites faciles :
cat /*/*[difficulte=’Facile’]/titre
Et avec : cat //*[@cout="faible"]/../difficulte que sélectionnez-vous ?
Continuez ces sélections à votre convenance. Pour obtenir de l’aide syntaxique
sur XPATH, vous pouvez aller regarder à cette adresse :
http://www.emse.fr/~beaune/docnum/2006_2007/intro_xpath.html
Créez la formule XPATH qui permet d’extraire les titres des recettes contenant au plus 100g de beurre. Mettez cette formule de côté, vous devrez me
l’envoyer en fin de T.P. Incluez cette formule dans une feuille de style XSLT
pour générer du HTML.
Pour réaliser cela, vous devrez aller voir du côté des fonctions XPATH permettant la manipulation de chaines des caractères, ainsi qu’une fonction permettant de transformer son argument en nombre.
Pour aller plus loin, vous pourrez essayer les T.P. de Jean-Jacques Girardot :
http://kiwi.emse.fr/DN/
3
Exploitation d’un Web Service météorologique
À cette adresse :
http://xoap.weather.com/weather/local/FRXX0274?cc=*&unit=m&dayf=10
vous pouvez obtenir un fichier XML contenant des informations météorologiques
sur Saint-Étienne. L’URL contient le code de Saint-Étienne : FRXX0274.
Pour obtenir les codes d’autres villes, vous pouvez aller ici :
http://aspnetresources.com/tools/locid.aspx
et regarder ce que donne l’URL correspondante.
Les paramètres passés en fin d’URL ont la signification suivante :
– cc=* : toutes les conditions courantes
– unit=m : les unités sont celles du système métrique
– dayf=10 : prévisions pour les 10 prochains jours
D’autres paramètres sont probablement disponibles, mais ceux-ci nous suffisent.
Pour vous aider à mieux comprendre le contenu de ce Web Service, nous vous
fournissons aussi la DTD correspondante :
http://www.emse.fr/~beaune/docnum/2008_2009/weather.dtd
Le but de cet exercice est de fabriquer une page XHTML à partir des données que fournit ce web service. Vous l’avez deviné : vous allez devoir appliquer
une transformation sur ces données XML pour en faire du XHTML. Ce que
vous devez obtenir ressemblera à cela (vous pouvez bien entendu faire beaucoup
mieux si vous le souhaitez) :
4
http://www.emse.fr/~beaune/docnum/2008_2009/meteo.xhtml
Malheureusement les choses ne vont pas être simples. En effet, l’idéal aurait
été de fabriquer un document XML, capable d’invoquer le Web Service, de façon à récupérer ses données XML. Puis avec la déclaration d’une feuille de style,
le tour aurait été joué. Mais l’inclusion de données XML dans un autre document XML n’est pas chose aisée pour l’instant. Nous allons donc utiliser une
astuce : demander à la feuille de style d’aller invoquer elle-même le Web Service.
La manipulation consiste donc à utiliser une toute petite feuille XML qui ne
contient rien d’autre (ou presque) qu’une référence à sa feuille de style. Cette
feuille XML vous est fournie :
http://www.emse.fr/~beaune/docnum/2008_2009/meteo.xml
Pour la voir réellement, regardez-en le code source. En chargeant cette feuille
XML, tout processeur XSLT sait ce qu’il doit faire : il doit aller chercher la
feuille de style. L’astuce est dans cette feuille de style qui contiendra une instruction utilisant la fonction XPATH document(). Voici cette instruction :
<xsl:apply-templates select="document(’FRXX0274.xml’)/weather"/>
Cette instruction indiquera au processeur XSLT de désormais aller parcourir
le fichier FRXX0274.xml à partir de l’élément racine weather, et non plus le
fichier XML de départ.
Vous allez tester cette astuce. Téléchargez la toute petite feuille XML sur votre
machine, ainsi que le fichier FRXX0274.xml ; puis créez une feuille de style
nommée meteo.xsl contenant le code suivant :
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>un test</title></head>
<body>
<xsl:apply-templates select="document(’FRXX0274.xml’)/weather" />
</body>
</html>
</xsl:template>
<xsl:template match="weather">
<xsl:value-of select="loc/dnam"/>
</xsl:template>
</xsl:stylesheet>
Ouvrez maintenant la toute petite feuille XML avec FireFox : le processeur
XSLT de FireFox est bien allé chercher le fichier FRXX0274.xml pour en extraire le contenu de l’élément /weather/loc/dnam (vérifiez soigneusement que
c’est ce que vous obtenez dans votre navigateur).
En fait, nous pourrions donner comme argument de la fonction document(),
l’adresse du web service (directement chez xoap.weather.com). Le problème c’est
5
que FireFox considère qu’utiliser la fonction document() sur une URL extérieure
est une faille de sécurité que certains internautes mal-intentionnés pourraient
utiliser. FireFox refuse donc d’exécuter la fonction document() sur une URL
extérieure. Essayez, vous verrez. Nous travaillerons donc localement en faisant
en sorte que la feuille de style contenant l’instruction ci-dessus soit sur la même
machine que le document FRXX0274.xml.
NB : xsltproc n’a pas la même prudence que FireFox et accepte bien d’appliquer
la fonction document() sur une URL extérieure. Mais il faudrait alors indiquer
à xsltproc comment passer par le proxy de l’École, et ce n’est pas facile. Nous
travaillerons donc résolument en local.
Comme vous n’êtes pas forcément expert en XHTML, la structure globale de la
feuille de style à réaliser vous est fournie (les encadrants de T.P. peuvent vous
aider à comprendre le contenu de ce document) :
http://www.emse.fr/~beaune/docnum/2008_2009/meteoDebut.xsl
Vous avez désormais tous les ingrédients à votre disposition. Il ne vous reste
plus qu’à fabriquer la feuille de style qui vous fera les bonnes transformations.
Au fait ... où se trouvent les images de la météo ?
CONSEIL : n’hésitez pas à générer votre document XHTML avec xsltproc, de
façon à pouvoir en vérifier la validité avec xmllint. Il est en effet impératif que
votre document soit du XHTML Strict, sinon vous n’aurez aucune garantie qu’il
s’affichera correctement sur n’importe quel navigateur.
Une fois réalisée, mettez de côté votre feuille de style.
4
Rendu individuel de T.P.
À 11h30 au plus tard vous devez m’envoyer un mél avec vos productions des
chapitres 2.4 (une formule XPATH dans le corps du mél) et 3 (une XSLT en
attachement).
FIN
6