XML en L2, université d'Angers
gilles.hunault@univ-angers.fr
T.P. numéro 1
Table des matières cliquable
1. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict
2. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict
3. Créer un document XML qui respecte une grammaire DTD
Il est possible d'afficher toutes les solutions via ?solutions=1 et de les masquer via ?solutions=0 .
1. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict
Ce n'est pas parce qu'un navigateur affiche un document qu'il est valide. Corriger le document HTML de l'archive l2xml_bad.zip pour qu'il soit valide pour la grammaire XHTML 1.0 Strict. On pourra utiliser des outils Web ou en ligne de commande.
Solution : afficher la solution
Que ce soit à l'aide d'un outil Web comme le W2C validator, d'un outil intégré à Firefox comme HTML Validator ou d'un outil en ligne de commande comme rxp, xmllint ou xmlstarlet, on trouve les erreurs suivantes :
il manque la structure englobante html/head/body ;
il manque donc aussi l'élément title dans la partie head ;
le deuxième paragraphe qui commence en ligne 4 n'est pas fermé car il n'y a pas de </p> correspondant à son <p> ;
toujours en ligne 4 l'entité   est mal écrite, il manque un point-virgule en fin d'entité ;
le lien pour Google est incorrect, il faut des guillemets autour de l'URL ;
le lien pour Google est un élément inline et doit être inclus dans un élément de type boite comme par exemple un élément p ou div.
La page l2xml_ok.html contient une version corrigée de la page et avec une indication explicite du jeu de caractères utilisé.
Remarque : une page Web peut comporter autre chose que du HTML ; ainsi les erreurs CSS et JavaScript ne sont pas détectables via ces outils.
2. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict
Quelles sont les principales différences entre les grammaires XHTML 1.0 Transitionnel et XHTML 1.0 Strict ?
Solution : afficher la solution
Comme le montre notre comparateur de grammaires DTD, ce sont surtout les éléments font, iframe et center qui ne sont plus admis en XHTML 1.0 Strict. Ce qui signifie qu'il faut utiliser plus de CSS.
On pourra lire l'article trans-vs-strict pour plus de détails.
3. Créer un document XML qui respecte une grammaire DTD
Nous admettrons pour ce qui suit qu'une molécule est définie par une liste d'atomes avec le nom des atomes, leur notation et le nombre de ces atomes fournis en attributs. Par exemple la molécule d'eau H2O est définie par l'atome de nom hydrogène, de notation H en nombre 2 et par l'atome de nom oxygène, de notation O et en nombre 1 (qui peut donc être omis). Après avoir lu soigneusement le fichier suivant nommé molecule.dtd, écrire un fichier eau.xml valide pour cette grammaire DTD. On utilisera un outil en ligne de commande pour vérifier cette validité. On pourra ignorer les accents.
Fichier molecule.dtd :
<!ELEMENT molecule (atome)+ > <!ELEMENT atome EMPTY > <!ATTLIST atome nom CDATA #REQUIRED > <!ATTLIST atome lettre CDATA #REQUIRED > <!ATTLIST atome nombre CDATA "1" >Solution : afficher la solution
Voici un fichier eau.xml possible :
<?xml version="1.0" ?> <molecule> <atome nom="Hydrogene" lettre="H" nombre="2" /> <atome nom="Oxygene" lettre="O" nombre="1" /> </molecule>On peut vérifier la validité de ce fichier pour la grammaire molecule.dtd via les commandes suivantes :
xmllint --dtdvalid molecule.dtd --valid eaudtd.xml xmlstarlet val -d molecule.dtd eau.xml
4. Créer un document XML qui respecte une grammaire XSD
On décide maintenant d'utiliser la grammaire molecule.xsd suivante pour stocker les mêmes informations.
Fichier molecule.xsd :
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="molecule"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="atome"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="atome"> <xs:complexType> <xs:sequence> <xs:element ref="nom"/> <xs:element ref="nombre"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="nom"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="lettre" use="required" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="nombre" type="xs:integer"/> </xs:schema>Ecrire un fichier eau2.xml valide pour cette grammaire XSD. On utilisera un outil en ligne de commande pour vérifier cette validité. Là encore, on pourra ignorer les accents.
Solution : afficher la solution
Voici un fichier eau2.xml possible :
<?xml version="1.0" ?> <molecule> <atome> <nom lettre="O">Oxygene</nom> <nombre>1</nombre> </atome> <atome> <nom lettre="H">Hydrogene</nom> <nombre>2</nombre> </atome> </molecule>On peut vérifier la validité de ce fichier pour la grammaire molecule.xsd via les commandes suivantes :
xmllint --noout --schema molecule.xsd eau2.xml xmlstarlet val -s molecule.xsd eau2.xml
5. Créer des grammaires DTD et XSD
Disons qu'un trajet ferroviaire est représenté schématiquement mais obligatoirement par un numéro identifiant de trajet, un type de train, un lieu de départ et un lieu d'arrivée. Ces informations sont éventuellement complétées, lorsqu'elles sont disponibles, par deux informations ts (pour time stamp en anglais) qui fournissent respectivement la date et heure de départ et la date et heure d'arrivée.
Voici un exemple de fichier XML regroupant deux trajets, nommé trajets.xml.
Fichier trajets.xml :
<trajets> <trajet id="tr02436"> <train>TGV </train> <depart>Angers</depart> <arrive>Paris Montparnasse</arrive> </trajet> <trajet id="tr5897"> <train>Micheline </train> <depart ts="2016-09-08 13:00">Troyes</depart> <arrive ts="2016-09-08 17:08">Dijon</arrive> </trajet> </trajets>Donner pour ce fichier trajets.xml une grammaire DTD minimale et raisonnable qui permet de décrire les trajets ferroviaires puis une grammaire XSD équivalente.
Solution : afficher la solution
On lira attentivement les fichiers ci-dessous.
Grammaire trajets.dtd :
<!ELEMENT trajets (trajet)+ > <!ELEMENT trajet (train,depart,arrive) > <!ELEMENT train (#PCDATA) > <!ELEMENT depart (#PCDATA) > <!ELEMENT arrive (#PCDATA) > <!ATTLIST trajets xmlns CDATA #FIXED '' > <!ATTLIST trajet xmlns CDATA #FIXED '' id NMTOKEN #REQUIRED > <!ATTLIST train xmlns CDATA #FIXED '' > <!ATTLIST depart xmlns CDATA #FIXED '' ts CDATA #IMPLIED > <!ATTLIST arrive xmlns CDATA #FIXED '' ts CDATA #IMPLIED >Grammaire trajets.xsd :
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="trajets"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="trajet"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="trajet"> <xs:complexType> <xs:sequence> <xs:element ref="train"/> <xs:element ref="depart"/> <xs:element ref="arrive"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:NCName"/> </xs:complexType> </xs:element> <xs:element name="train" type="xs:NCName"/> <xs:element name="depart"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:NCName"> <xs:attribute name="ts"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="arrive"> <xs:complexType mixed="true"> <xs:attribute name="ts"/> </xs:complexType> </xs:element> </xs:schema>Il existe des outils pour créer automatiquement des grammaires à partir d'exemples, comme par exemple trang.
Questions sans réponse écrite (donc venez en TP !)
Que faut-il changer dans les fichiers XML et dans les grammaires DTD et XSD précédentes si on décide d'utiliser des accents, que ce soit avec un encodage latin1 ou UTF ?
Est-ce qu'un navigateur peut être validant c'est-à-dire refuser l'affichage d'un document XML s'il n'est pas valide pour la grammaire indiquée en début de document ?
Après avoir vérifié qu'un document DOCX ou ODT est une archive (lisible par exemple par zip), chercher comment on peut lister tous les espaces de noms associés. Où trouve-t-on les grammaires pour ces documents ?
Retour à la page principale de (gH)