Développement Web et représentation de données :
Technologie XML, DTD, XSD et XSL ;
applications à la bureautique et à la bioinformatique
Exercices corrigés, série 1 : structuration XML
gilles.hunault "at" univ-angers.fr
Table des matières cliquable
1. Installation des outils logiciels
3. Structuration de personnes, VCARD et XCARD
4. Structuration de séquences Fasta
5. Structuration de personnes et de services
6. Formats XML usuels en bureautique
7. Formats XML usuels en bioinformatique
8. Bases de données et XML ; espaces de noms
Il est possible d'afficher toutes les solutions via ?solutions=1 et de les masquer avec ?solutions=0.
1. Installation des outils logiciels
Installer sous Linux les outils en ligne de commande nommés recode, rxp, xmllint, xmlstarlet, xsltproc puis les modules XML::Parser, XML::Checker, XML::SAX, XML::Validator::Schema et XML::XSLT pour perl.
Où sont les pages d'aides associées ?
Vérifier que le script demoXml fourni dans l'archive demoXml.zip fournit les mêmes résultats que dans le listing de sortie demoXml.txt et que vous comprenez les affichages. On pourra essayer de retenir les principales options des outils en ligne de commande. On utilisera bien sûr les fichiers suivants :
Fichier Explications dbf.xml fichier xml bien formé dmf.xml fichier xml mal formé adv.xml fichier xml valide pour la grammaire id.dtd adn.xml fichier xml invalide pour la grammaire id.dtd id.dtd fichier grammaire de type dtd axv.xml fichier xml valide pour la grammaire id.xsd axn.xml fichier xml invalide pour la grammaire id.xsd id.xsd fichier grammaire de type xsd (schéma) cours.xml fichier xml auquel appliquer la transformation .xsl cours.xsl fichier xml qui est une transformation xsl Ecrire un script iso2utf et un script utf2iso pour convertir les accents à l'aide de recode (plutôt que iconv).
Tester ces scripts avec les fichiers accentsIso.txt, accentsHtml.txt et accentsUtf.txt. Un fichier plus complet en iso est allcharIso.txt.
Solution : masquer la solution
Pour rxp, on peut exécuter sudo apt-get install rxp.
La page officielle pour rxp est http://www.cogsci.ed.ac.uk/~richard/rxp.html. La page d'aide (man) est http://www.cogsci.ed.ac.uk/~richard/rxp.txt dont une version un peu plus lisible est ici. Une autre page d'aide est là (merci à M. Racine et R. Gaborieau de nous l'avoir signalée).xmllint fait partie du package libxml2-utils, installable aussi par apt-get ou via http://xmlsoft.org. La page d'aide est http://xmlsoft.org/xmllint.html.
On peut trouver la page d'aide pour xmlstarlet sur sourceforge : xmlstarlet-ug.html.
On peut trouver la page d'aide pour xsltproc sur le site xmlsoft : xsltproc2.html.
Pour perl, installer le module MMM peut se faire en ligne de commande via sudo perl -MCPAN -e 'install MODULE::MMM'.
Voir le détail des commentaires en haut du fichier demoXml.La syntaxe de recode, qu'on installe par apt-get est la suivante : recode ISO-8859-15..UTF8 fichier.
La syntaxe de iconv qu'on installe par sudo apt-get install libc-bin est la suivante : iconv -f ISO_8859-15 -t UTF-8 fichier_original > fichier_modifié.
Le script iso2utf est donc tout simplement le fichier qui contient recode ISO-8859-15..UTF8 $1 rendu exécutable par chmod +x.
Pour être sûr que tout est bien installé, il faut exécuter les commandes suivantes
# document bien formé testebfpe dbf.xml testebfpe dmf.xml testebfph dbf.xml testebfph dmf.xml testebfj dbf.xml testebfj dmf.xml rxp dbf.xml rxp -s dbf.xml rxp dmf.xml rxp -s dmf.xml xmllint dbf.xml xmllint --noout dbf.xml xmllint --noout dmf.xml xmlstarlet val -w dbf.xml xmlstarlet val -w dmf.xml xmlstarlet val -e -w dmf.xml # document valide (dtd) testevdpe adv.xml id.dtd testevdpe adn.xml id.dtd testevdph adv.xml id.dtd testevdph adn.xml id.dtd testevdj adv.xml testevdj adn.xml rxp -V -s adv.xml rxp -V -s adn.xml xmllint --noout --valid adv.xml xmllint --noout --valid adn.xml xmllint --noout --dtdvalid id.dtd --valid adn.xml xmlstarlet val -d id.dtd adv.xml xmlstarlet val -d id.dtd adn.xml xmlstarlet val -e -d id.dtd adn.xml # document valide (xsd) testevspe axv.xml id.xsd testevspe axn.xml id.xsd testevsph axv.xml id.xsd testevsph axn.xml id.xsd testevsj axv.xml id.xsd testevsj axn.xml id.xsd xmllint --noout --schema id.xsd axv.xml xmllint --noout --schema id.xsd axn.xml xmlstarlet val -s id.xsd axv.xml xmlstarlet val -e -s id.xsd axn.xml # transformation xsl xsltph xsltph cours.xml cours.xsl xsltpe xsltpe cours.xml cours.xsl # attention à l'ordre des paramètres xsltproc cours.xsl cours.xml
2. Structuration de services
On veut modéliser des services dans une entreprise comme Achats, Direction, Courrier... Ecrire le fichier serv00.xml défini à l'aide des seuls éléments services et service ; les noms de services seront intégrés comme des contenus-texte d'éléments. Comment vérifier que le fichier est bien formé ? Ajouter le service Représentation après avoir remarqué qu'il y a un caractère accentué. On nommera serv01.xml le fichier avec accent.
Ecrire le fichier serv02.xml défini à l'aide des éléments services et service et du sous-élément nomDeService dont le contenu-texte est un nom de service puis écrire le fichier serv03.xml défini à l'aide des éléments services et service et de l'attribut nomDeService.
On décide maintenant d'ajouter un identifiant de service (comme pour une base de données). Faut-il utiliser l'initiale des services ou un entier auto-incrémenté ? Si on nomme numService cette donnée, comment l'implémenter ? Vous écrirez dans serv04.xml à partir de serv02.xml la solution avec sous-élément et dans serv05.xml la solution avec attribut. Y a-t-il pour l'instant une meilleure solution ?
Solution : masquer la solution
Voici les fichiers solutions :
Fichier Explications serv00.xml fichier sans accent et sans sous structure serv01.xml fichier avec accent et sans sous structure serv02.xml fichier avec sous-structure en élément serv03.xml fichier avec sous-structure en attribut serv04.xml complément de serv02.xml avec numéro de service en élément serv05.xml complément de serv02.xml avec numéro de service en attribut serv00.xml serv01.xml serv02.xml serv03.xml serv04.xml serv05.xml
Quelques remarques
Il est conseillé, lorsqu'on écrit un fichier XML «à la main» sous éditeur, d'adopter un standard d'écriture. Ainsi, dans serv00.xml et serv02.xml, il est maladroit de mettre des retours-charriot uniquement pour le service Courrier.
L'écriture de serv03.xml est encore plus maladroite : il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le même même codage à l'intérieur d'un même fichier. De plus il doit en principe y avoir un espace devant le symbole / si on utilise le codage court, ce qui n'est pas le cas pour le service Direction où le / est collé au symbole guillemet du nom de l'attribut.
Pour l'instant, le fichier serv04.xml est correct, mais il est clair qu'avoir utilisé 3r comme numéro de service pour Courrier est sans doute une faute de frappe, non détectable sans typage des numéros de service, d'où l'utilité des grammaires. Par contre, le choix d'un numéro ou d'une lettre est ici peu important, même si une initiale risque d'apparaitre plusieurs fois, ce qui ne permettra pas d'en faire un index. On verra plus tard comment définir par grammaire des identifiants et des références à des identifiants. On remarquera que nous avons volontairement dupliqué le service Direction ce qui constitue une erreur, non détectable à ce niveau ; la cardinalité unique sera, elle aussi, prise en compte par les grammaires.
Pour vérifier que les fichiers XML sont bien formés, on peut bien sûr utiliser rxp, xmllint, xmlstarlet ou se contenter de cliquer sur les liens fournis car les navigateurs vérifient les fichiers XML (contrairement aux fichiers HTML, y compris XHTML) et ne les affichent que s'ils sont bien formés.
3. Structuration de personnes, VCARD et XCARD
On admettra qu'on peut définir sommairement une personne par un nom, un prénom et une ddn (date de naissance) que l'on réduira pour l'instant à une année de naissance. Ecrire, à partir des éléments personnes et personne dans le fichier pers01.xml une solution tout élément puis dans pers02.xml une solution tout attribut. Enfin, écrire dans pers03.xml