Valid XHTML     Valid CSS2    

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

  2. Structuration de services

  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

  9. Dessins et rendus XML

10. Lecture de fichiers XML sur Internet et logiciel R

11. Questions diverses

 

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 :  

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 (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 :  

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