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

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 une seule sorte d'élément noeud (disons, sans utiliser d'attribut) ?
    É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
  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 à représenter un noeud absent (permettant donc de représenter des arbres ou le fils gauche, ou droit, ou les deux, peuvent être absents).

    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

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

      RENDU: 2.2.dtd

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

      RENDU: 2.2.xsd

    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

    2. Écrire une DTD qui valide ce XML.

      RENDU: 2.3.dtd

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

      RENDU: 2.3.xsd

    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

  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