TD 4: Schémas XML, et encore un bout de DTD


Exercice 1

  1. Écrivez un schéma 1.1.xsd pour lequel le fichier 1.1.xml, copié ci-dessous sans l'en-tête, est valide:
    <programme>
      <serie statut="fini">
        <nom>Dexter</nom>
        <saisons>8</saisons>
        <annee>2006</annee>
      </serie>
      <film>
        <titre>Autant en emporte le vent</titre>
        <annee>1950</annee>
      </film>
      <documentaire>
        <nom>Apocalypse</nom>
        <annee>2009</annee>
      </documentaire>
    </programme>
    Si nécessaire, modifiez votre schéma pour que:
    1. Un programme accepte autant de series, films et documentaires qu'on veut (même zéro), dans n'importe quel ordre
    2. Les sous-éléments nom, annee, titre et saisons doivent apparaitre une et une seule fois dans leurs parents respectifs, et dans n'importe quel ordre.
      Attention: cela interdit l'utilisation des groupes et des extensions de type pour définir un "tronc commun" (nom, annee).
    3. Les années doivent être entre 1880 et 2050 (inclus) (cf Cours).
      Note: il vaut mieux définir un élément global et le réutiliser pour ne pas le recopier à chaque fois
    4. Le nombre de saisons doit être strictement positif.
    5. L'attribut statut d'une serie soit obligatoire, ne puisse prendre que les valeurs "fini" et "en cours".
    6. Les nom et titre doivent commencer par une lettre majuscule. (cf Cours)
      Note: définissez un type global pour le réutiliser avec ces deux éléments
      Note: le type simple token peut être utile, car dans l'exemple les nom et titre sont multi-lignes.

    Vérifiez votre schéma et corrigez-le:
    rm 1.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td4/1.tar.gz
    tar xf 1.tar.gz
    ./1.1.test.sh
    RENDU: 1.1.xsd    Corrigé

Exercice 2

Dans cet exercice, on va modéliser un arbre binaire de noeuds de 2 façons. Conceptuellement, un noeud contient des données arbitraires (eg. #PCDATA ou CDATA, ou xsd:string avec les schémas), et a un fils gauche et un fils droit, facultatifs, qui sont eux-mêmes des noeuds ou des références vers des noeuds.
Le caractère 'gauche' ou 'droit' des fils est important. L'exemple ci-contre, qui est un arbre binaire de recherche, le montre bien.
  1. Représentation ambigüe (donc ratée)

    Pourquoi ne peut-on pas bien représenter un arbre binaire en utilisant un seul type d'élément noeud?
    Écrivez une courte explication dans un fichier 2.1.txt.
    Si vous ne trouvez pas: tentez de représenter l'exemple ci-contre. Où est l'ambiguïté?

    RENDU: 2.1.txt    Corrigé
  2. Représentation récursive

    On va utiliser deux types d'éléments:
    • noeud, qui s'auto-inclura si besoin, et sera également utilisé comme élément racine du document (on renonce à pouvoir représenter un arbre vide)
    • nil, qui servira à matérialiser l'absence de fils (gauche, droit, ou des deux).

    Les données des noeuds seront dans un attribut data (Note: on aurait aussi pu utiliser des noeuds à contenu mixte, mais il faut choisir une convention pour les auto-tests, et on choisit celle-là pour cet exercice).

    1. Écrire un fichier 2.2.xml représentant l'arbre illustré ci-contre.

      RENDU: 2.2.xml    Corrigé

    2. Écrire une DTD 2.2.dtd qui valide ce XML.

      RENDU: 2.2.dtd    Corrigé

    3. Écrire un schéma 2.2.xsd qui le valide.

      RENDU: 2.2.xsd    Corrigé

    Vérifiez vos XML, DTD et schéma et corrigez les:
    rm 2.2.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td4/2.2.tar.gz
    tar xf 2.2.tar.gz
    ./2.2.test.sh
  3. Représentation plate et par référence

    On va utiliser un élément racine arbre qui contiendra une liste (potentiellement vide) de noeud.
    Chaque noeud fera référence à ses fils droit et gauche (optionels) à l'aide d'attributs gauche et droit pointant vers un attribut id des noeuds correspondant, et aura ses données propres en tant que contenu simple.
    Pensez à ID et IDREF pour les DTD, cf le TD 3 ou le Cours.
    [Optionel]: L'élément racine arbre pointera vers le noeud qui est la racine de l'arbre à l'aide d'un attribut racine, tout comme les attributs gauche et droit des noeuds.

    1. Écrire l'arbre illustré ci-contre en XML.

      RENDU: 2.3.xml    Corrigé

    2. Écrire une DTD qui valide ce XML.

      RENDU: 2.3.dtd    Corrigé

    3. Écrire un schéma qui le valide.

      RENDU: 2.3.xsd    Corrigé

    Vérifiez votre DTD et votre schéma, et corrigez-les:
    rm 2.3.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td4/2.3.tar.gz
    tar xf 2.3.tar.gz
    ./2.3.test.sh

  4. (*) Copiez votre schema dans 2.4.xsd et modifiez-le (si nécéssaire) pour utiliser xsd:key et xsk:keyref, cf Cours.

    Vérifiez avec: ./2.4.test.sh

    RENDU: 2.4.xsd    Corrigé

  5. Quels sont les avantages et inconvénients de ces 2 representations? Ecrivez une courte explication dans un fichier 2.5.txt.
    • Pensez à des arbres immenses (plusieurs millions de noeuds).
    • Pensez à la capacité de validation -- peut-on faire un arbre invalide qui passe le schéma?

    RENDU: 2.5.txt    Corrigé