TD 1: Bases de XML, encoding, xmllint et bases de DTD

Rappels / Outils

Exercice 1: Encoding; et un premier document XML validé

  1. Sauvegardez ces 2 fichiers, contenant le même texte, mais dans un encoding différent. Ouvrez-les dans votre éditeur favori (cf instructions en haut de page). Voyez-vous une différence?
    Regardez la taille de ces 2 fichiers. Lequel est le plus gros? Pourquoi?

  2. Affichez ces deux fichiers avec l'afficheur hexadécimal od (ex: od mais1.txt). [Note: sur Mac OS, utilisez 0xED). Combien de différences voyez-vous?

  3. Ces fichiers sont-ils des documents XML valides? Renommez-les mais1.xml et mais2.xml et essayez ces commandes:
    xmllint mais1.xml
    xmllint mais2.xml
    
    Modifiez ces 2 fichiers pour les transformer en documents XML valides:
    Réparez jusqu'à ce que les 2 commandes ci-dessous passent:
    xmllint --noout mais1.xml && echo "SUCCESS"
    xmllint --noout mais2.xml && echo "SUCCESS"
    
    RENDU: mais1.xml et mais2.xml.

Note importante pour la suite

Dans toute la suite des TDs, on travaillera avec l'encoding utf-8, qui est celui séléctionné par défaut.
On préférera tout de même le spécifier explicitement dans l'en-tête: incluez bien encoding="utf8" dans <?xml ... ?>.

Exercice 2: Structure

  1. Corrigez ce qui suit pour en faire un document XML valide. Si vous mettez de l'indentation, c'est encore mieux!
    <les animaux de la forêt>
    <animal>
    <nom>chouette
    <cri>ouh ouh
    <animal/>
    <animal>
    <nom>écureuil
    <cri>non documenté
    <animal/>
    <animal>
    <nom>renard
    <repas> fromage
    <animal/>
    <les animaux de la forêt/>
    <les animaux de la savane>
    <animal herbivore=non>
    <nom> hyène
    <repas> zèbres, gnous, antilopes
    <animal/>
    <animal herbivore=oui>
    <nom>zèbre
    <repas> herbe
    </les animaux de la savane>
    <animal/>
    
    Vérifiez en sauvegardant votre fichier sous 2.1.xml puis en faisant:
    rm 2.1.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td1/2.1.tar.gz
    tar xf 2.1.tar.gz
    ./2.1.test.sh
    
    RENDU: 2.1.xml.

Exercice 3: DTD

Rappel: pour valider un document XML avec un fichier DTD donné:
xmllint --noout --dtdvalid file.dtd file.xml && echo "OK"
  1. Ecrivez un document 3.1.xml valide pour la DTD suivante:
    <!-- Racine -->
    <!ELEMENT ecole (annee+)>
    <!-- Année -->
    <!ELEMENT annee (nom, age, matieres, effectif)>
    <!ATTLIST annee bloc (maternelle | primaire | college | lycee) #REQUIRED>
    <!-- Nom et prénom -->
    <!ELEMENT nom (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT effectif (#PCDATA)>
    <!-- Bloc matières -->
    <!ELEMENT matieres (matiere+)>
    <!ELEMENT matiere (#PCDATA)>
    
    Mettez au moins deux années avec des blocs différents.
    Vérifiez:
    rm 3.1.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td1/3.1.tar.gz
    tar xf 3.1.tar.gz
    ./3.1.test.sh
    
    RENDU: 3.1.xml.

  2. Ecrivez un document 3.2.xml valide pour la DTD suivante:
    <!ELEMENT petita (petitf | (petita,petita))>
    <!ELEMENT petitf (#PCDATA)>
    
    De plus, le XML devra avoir au moins un élement a une profondeur de 5 (sachant que l'élément racine à une profondeur de 1).
    Vérifiez:
    rm 3.2.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td1/3.2.tar.gz
    tar xf 3.2.tar.gz
    ./3.2.test.sh
    
    RENDU: 3.2.xml.

  3. Ecrivez une DTD 3.3.dtd qui valide le document 2.1.xml fait lors de l'exercice 2.1
    Vérifiez avec la command xmllint rappelée ci-dessus, sur votre fichier 2.1.xml.

    RENDU: 3.3.dtd

  4. Étoffez votre DTD pour qu'elle soit la plus stricte possible.
    Vérifiez avec les modifications du fichier 2.1.xml suivantes, qui doivent provoquer des erreurs de validation.
    Essayez-les une à une, sans les combiner: xmllint --noout 2.1.xml && echo OK doit toujours marcher, mais xmllint --noout --dtdvalid 3.3.dtd 2.1.xml doit produire des erreurs (sinon, rendez votre DTD plus stricte!):
    RENDU: 3.3.dtd (amélioré si besoin)