TD 2: Schémas XML et révisions de DTD


Exercice 1: Schema → DTD

  1. Écrivez un document XML 1.1.xml valide pour le schéma suivant (télécharger 1.1.xsd):
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="list">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="a" type="xsd:integer"/>
            <xsd:element name="b" type="xsd:integer" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    Écrivez également une DTD 1.1.dtd équivalente à ce schéma (ou, du moins, aussi équivalente que possible).

    Vérifiez votre XML et votre DTD:
    rm 1.tar.gz; wget --no-cache https://www.irif.fr/~stolze/xml/td2/1.tar.gz
    tar xf 1.tar.gz
    ./1.1.test.sh
    RENDUS: 1.1.xml et 1.1.dtd.

  2. Écrivez un document XML 1.2.xml valide pour le schéma suivant (télécharger 1.2.xsd), mais pas pour le précédent:
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="list">
        <xsd:complexType>
          <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="a" type="xsd:integer"/>
            <xsd:element name="b" type="xsd:integer"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    Écrivez une DTD "équivalente" à ce schéma

    Vérifiez votre XML et votre DTD avec ./1.2.test.sh.

    RENDUS: 1.2.xml et 1.2.dtd.

  3. Écrivez un document XML 1.3.xml valide pour le schéma suivant (télécharger 1.3.xsd), mais pour aucun des 2 précédents:
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="a" type="xsd:integer"/>
      <xsd:element name="b" type="xsd:integer" substitutionGroup="a"/>
      <xsd:element name="list">
        <xsd:complexType>
          <xsd:sequence maxOccurs="unbounded">
            <xsd:element ref="a"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    Écrivez une DTD 1.3.dtd "équivalente" au troisième schéma.

    Vérifiez votre XML et votre DTD avec ./1.3.test.sh.

    RENDUS: 1.3.xml et 1.3.dtd.

  4. Écrivez un document XML 1.4.xml avec un élément racine <list> et valide pour les trois DTD écrites, mais pour aucun des 3 schémas.

    Vérifiez à l'aide de xmllint.

    RENDU: 1.4.xml.


Exercice 2: DTD → Schema, Attributs

  1. Écrivez un schéma 2.1.xsd équivalent à cette DTD (télécharger 2.1.dtd):
    <!ELEMENT sac (objet*, portefeuille, cahier)>
    <!ELEMENT objet (#PCDATA)>
    <!ELEMENT portefeuille EMPTY>
    <!ELEMENT cahier (#PCDATA)>
    Vérifiez par vous mêmes (attention, nos tests sont stricts!). Par exemple vous pourriez créer vos propre tests 2.1.valid.xml et 2.1.invalid.xml, et les bidouiller pour vérifier que la DTD et votre schéma se comportent pareil.

    RENDU: 2.1.xsd.

  2. Ajoutez les 2 lignes suivantes à la DTD; et adaptez le schéma.
    <!ATTLIST sac type (main|dos|valise) #REQUIRED>
    <!ATTLIST portefeuille type (cuir|plastique) #REQUIRED>
    La section 5.7 du cours peut être utile.

    Vérifiez et corrigez votre schéma avec:
    rm 2.2.tar.gz; wget --no-cache https://www.irif.fr/~stolze/xml/td2/2.2.tar.gz
    tar -zxf 2.2.tar.gz
    ./2.2.test.sh
    RENDU: 2.2.xsd.


Exercice 3: Schema plus complexes

  1. Écrivez un document XML 3.1.xml correspondant au schéma suivant (télécharger 3.1.xsd). N'oubliez pas de vérifier!
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:simpleType name="Color">
        <xsd:restriction base="xsd:token">
          <!-- Couleur, en hexadecimal RGB -->
          <xsd:pattern value="[0-9A-Fa-f]{6}"/>
        </xsd:restriction>
      </xsd:simpleType>
    
      <xsd:complexType name="Coordinate">
        <xsd:sequence>
          <xsd:element name="x" type="xsd:double"/>
          <xsd:element name="y" type="xsd:double"/>
        </xsd:sequence>
      </xsd:complexType>
    
      <xsd:element name="polygon">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="color" minOccurs="0" maxOccurs="1" type="Color"/>
            <xsd:element name="point" type="Coordinate" minOccurs="3" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    RENDU: 3.1.xml.

  2. Écrivez un document XML 3.2.xml correspondant au schéma suivant (comme avant, mais plus étoffé) (télécharger 3.2.xsd):
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:simpleType name="Color">
        <xsd:restriction base="xsd:token">
          <!-- Couleur, en hexadecimal RGB -->
          <xsd:pattern value="[0-9A-Fa-f]{6}"/>
        </xsd:restriction>
      </xsd:simpleType>
    
      <xsd:complexType name="AlphaColor">
        <xsd:simpleContent>
          <xsd:extension base="Color">
            <xsd:attribute name="transparency" use="required">
              <xsd:simpleType>
                <xsd:restriction base="xsd:float">
                  <xsd:minInclusive value="0.0"/>
                  <xsd:maxInclusive value="1.0"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:attribute>
          </xsd:extension>
        </xsd:simpleContent>
      </xsd:complexType>
    
      <xsd:complexType name="Coordinate">
        <xsd:sequence>
          <xsd:element name="x" type="xsd:double"/>
          <xsd:element name="y" type="xsd:double"/>
        </xsd:sequence>
      </xsd:complexType>
    
      <xsd:complexType name="Polygon">
        <xsd:sequence>
          <xsd:element name="color" minOccurs="0" maxOccurs="1" type="AlphaColor"/>
          <xsd:element name="point" type="Coordinate" minOccurs="3" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    
      <xsd:complexType name="NamedPolygon">
        <xsd:complexContent>
          <xsd:extension base="Polygon">
            <xsd:sequence>
              <xsd:element name="name" type="xsd:NMTOKEN"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    
      <xsd:element name="drawing">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="point" type="Coordinate" minOccurs="1" maxOccurs="unbounded"/>
            <xsd:element name="polygon" type="NamedPolygon" minOccurs="1" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    RENDU: 3.2.xml.