Licence Informatique/Miage S6 - XML - TP N°1
Licence Informatique/Miage S6 - XML - TP N°1
Licence Informatique/Miage S6 - XML - TP N°1
Lors de ce TP et des suivants, nous serons amenés à utiliser xmllint qui est un petit
utilitaire en ligne de commande pour valider et manipuler des fichiers xml. Pour connaître
le manuel d'utilisation vous pouvez taper la commande man xmllint.
Exercice 1 :
1. Ce document estil bien formé (i.e. respectetil la syntaxe XML) ?
2. S'il ne l'est pas, corrigez les erreurs.
3. Vérifier que le document obtenu est correct en tapant la commande xmllint exo1.xml.
Exercice 2 :
Corrigez le fichier exo2.xml suivant. Vérifier que le document corrigé est valide en tapant
la commande xmllint --noout exo2.xml && echo ''tout est OK''.
Exercice 3 :
Exercice 4 :
Créez un document exo4.xml listant votre collection de Cds à l'aide de la DTD exo4.dtd
ci-dessous.
Pour valider un document xml, avec un doctype, si le document xml ne contient aucune
référence à un doctype :
xmllint --noout --dtdvalid exo4.dtd exo4.xml && echo ''respecte la dtd''
Exercice 5 :
Vérifiez la validité des 5 fichiers XML ,donnés plus bas, relativement à la DTD
pingpong.dtd ci-dessous . Si un fichier est invalide, corrigez-le pour le rendre valide, en
minimisant le nombre de corrections.
pp1.xml :
<racine>
<debut>
<ping/><pong/>
</debut>
<suite>
<ping/><pong/>
</suite>
<suite>
<ping/><pong/>
</suite>
</racine>
pp2.xml :
<racine>
<debut/>
<suite>
<ping/><pong/>
</suite>
</racine>
pp3.xml :
<racine>
<debut>
<ping/><ping/>
<pong/><pong/>
</debut>
<suite>
<ping/><pong/>
</suite>
</racine>
pp4.xml :
<racine>
<suite>
<pong/><pong/>
</suite>
<suite>
<ping/><pong/>
</suite>
</racine>
pp5.xml :
<racine>
<debut/>
<suite/>
</racine>
Exercice 6 :
Proposez un fichier xml exo6.xml contenant au moins 6 éléments qui soit valide pour le
doctype exo6.dtd suivant :
Exercice 7 :
Proposez une DTD dialogue.dtd pour le fichier xml ci-dessous et vérifiez la validité du
document xml au regard ce cette DTD en utilisant la commande xmllint. Au moins deux
attributs ne devront pas être de type CDATA.
Exercice 8 :
Proposez une DTD pour le fichier xml ci-dessous et vérifiez la validité du document xml au
regard ce cette DTD en utilisant la commande xmllint.
<?xml version="1.0" encoding="UTF-8"?>
<étudiant>
<prénom>Jean</prénom>
<nom>Duschmol</nom>
<num_etudiant>21867809</num_etudiant>
<parcours>
<année year="3">
<module>
<titre> Programmation orientée objet </titre>
<abbréviation>POO</abbréviation>
<résultat>
<note>5</note>
<date>13/06/2017</date>
</résultat>
</module>
<module>
<titre>XML</titre>
<résultat>
<note>10</note>
<date>13/06/2017</date>
</résultat>
<résultat>
<note>9</note>
<date>12/03/2017</date>
<observation> Triche durant l'examen </observation>
</résultat>
</module>
</année>
</parcours>
</étudiant>
Exercice 9 :
Proposez une DTD pour le fichier xml ci-dessous et vérifiez la validité du document xml au
regard ce cette DTD en utilisant la commande xmllint.
Exercice 10 :
Considérez les deux doctypes suivants, puis répondez aux 4 questions qui suivent. Pour
chacune d'entre elles utilisez la commande xmllint pour vérification.
4. Ecrire un fichier xml satisfaisant les deux doctypes et qui contient au moins 4 éléments
tutu.
Exercice 12 :
Un aspect qui n'a pas été abordé jusque maintenant est le fait que toute DTD doit être
déterministe. En d'autres termes, à chaque fois que le parseur tombe sur une balise dans
le document xml, il ne doit pas aller analyser la suite du document xml pour savoir quelle
règle est activée. Cela permet un gain d'efficacité considérable pour vérifier la validité d'un
document xml au regard d'une DTD (on obtient une complexité linéaire en nombre
d'éléments au lieu d'une complexité cubique).
Quand le parseur tombe la première fois sur une balise B fille d'une balise A, il ne sait pas
si la règle activée est le B de (B,C) ou le B de (B,D) : il faudrait voir la suite du document,
ce qui rend la DTD non déterministe.
Un autre exemple :
Quand le parseur tombe la première fois sur une balise Y fille d'une balise X, il ne sait pas
si la règle activée est celle du Y* ou celle du Y : il faudrait voir la suite du document, ce qui
rend la DTD non déterministe.
Pour les deux exemple non déterministes du dessus, on a des règles déterministes
équivalentes. Pour le premier, on a
Et pour le second, on a :
<!ELEMENT X (Y,Y*) ?>
Il faut savoir qu'il n'est pas toujours possible de traduire une règle non déterministe en une
règle déterministe équivalente (cf. cours de langage formel). Il faut alors dans ce cas
généraliser ou contraindre la règle initiale…
Définir une DTD bidule.dtd permettant de valider les documents xml ayant pour balise
racine un élément TRUC qui respecte les règles suivantes :
Vérifiez la validité de votre DTD avec des documents XML respectant ces contraintes en
utilisant la commande xmllint. Assurez-vous de ne pas voir le message suivant apparaître
« validity error : Content model of section is not determinist:... », auquel cas il faut revoir la
DTD pour la rendre déterministe.
Exercice 13 :
<X> <X>
<Y algo="A307"/> <Y algo="307"/>
<Y algo="a380"/> <Z/>
<Z/> </X>
</X>
<X> <X>
<Y algo="A307"/> <Y algo="A307"/>
<Z/> <Z/>
<Z/> <Y algo="C307"/>
</X> <Z/>
<Y/>
</X>
<X machin="truc"> <X machin="truc">
<Y algo="A307"> <Y algo="a307">
blablabla blablabla
</Y> </Y>
<Z/> <Z/>
<Y algo="a307"/> <Y algo="b307"/>
<Z> <Z>
<Z/> <Z/>
</Z> <Z/>
</X> <Z/>
<Z/>
</Z>
</X>
<X machin="truc"> <X machin="12">
<Y algo="a307"> <Y algo="A307">
blablabla blablabla
</Y> </Y>
<Z/> <Z/>
<Y algo="b307"/> <Y algo="a380"/>
<Z> <Z>
<Z>blablabla</Z> <Z/>
<Z/> <Z/>
</Z> </Z>
</X> </X>
<X machin="truc"> <X machin="truc">
<Y algo="A307"> <Y algo="a307">
blablabla <Z/>
</Y> </Y>
<Z/> <Z/>
<Y algo="A307"/> <Y algo="b307"/>
<Z> <Z>
<Z/> <Z/>
<Z/> <Z/>
</Z> </Z>
</X> </X>
Ecrire une DTD qui invalide les 10 documents du dessus mais qui valide les documents ci-
dessous. Vérifiez via xmllint.
<X machin="truc">
<Y algo="A307">
blablabla
</Y>
<Z/>
<Y algo="b307"/>
<Z>
<Z/>
<Z/>
</Z>
</X>
<X machin="chose36">
<Y algo="badaboum"/>
<Z/>
</X>
<X>
<Y algo="X"/>
<Z/>
</X>