TD 3: Schémas XML #2



Exercice 1: éléments et attributs de schéma pas encore vus

  1. Écrivez un document 1.1.xml qui correspond au schéma suivant (télécharger: 1.1.xsd) :
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:simpleType name="IntOrName">
        <xsd:union memberTypes="xsd:integer xsd:Name"/>
      </xsd:simpleType>
      <xsd:complexType name="MonBeauTypeMixe" mixed="true">
        <xsd:sequence>
          <xsd:element name="data" type="IntOrName" nillable="true"
                       minOccurs="3" maxOccurs="unbounded"/>
          <xsd:any processContents="skip"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="skip"/>
      </xsd:complexType>
      <xsd:element name="root" type="MonBeauTypeMixe"/>
    </xsd:schema>
    Si nécessaire, étoffez votre XML pour qu'il exerce véritablement tous les facettes du schéma donné en exemple:
    1. La mixité de contenu de <root>
    2. La dualité de types de <data>
    3. L'élément arbitraire peut contenir n'importe quoi. Faites-le contenir du contenu mixte!
    4. L'attribut arbitraire peut en fait être répété plusieurs fois. Essayez!
    5. (*) L'élément <data> est nillable. Rendez-en un vide! (cf Cours; on doit introduire une namespace)

    Vérifiez que votre XML est bien étoffé, selon les points ci-dessus:
    rm 1.tar.gz; wget --no-cache https://www.irif.fr/~stolze/xml/td3/1.tar.gz
    tar xf 1.tar.gz
    ./1.1.test.sh
    
    RENDU: 1.1.xml


Exercice 2: xsd:key, xsd:keyref et révisions

  1. Écrivez un schéma 2.xsd qui valide le XML suivant (télécharger: 2.1.xml) :
    <library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <book>
        <isbn>978-1-447-26455-2</isbn>
        <title>Gone with the wind</title>
        <language>EN</language>
        <pages>1024</pages>
        <published>1936-06-10</published>
        <author ref="mmitchell"/>
        <editor ref="warner"/>
      </book>
      <author id="mmitchell">
        <name>Margareth Mitchell</name>
        <book ref="978-1-447-26455-2"/>
      </author>
      <editor id="warner">
        <name>Warner Bros</name>
        <book ref="978-1-447-26455-2"/>
      </editor>
    </library>
    Modifiez (si besoin) 2.xsd en utilisant xsd:key et xsd:keyref pour forcer les références à être cohérentes. Cf Cours.

  2. Vérifiez et/ou corrigez votre schéma 2.xsd pour qu'il soit toujours valide avec 2.2.xml, un exemple plus etoffé.

  3. Rendez votre schéma strict par rapport aux références.

  4. Rendez votre schéma aussi strict que possible; sur chaque champ (en restant logique sur le contenu accepté).
Tout au long de cet exercice, vous pourrez utiliser le même script d'auto-test pour vérifier votre progression:
rm 2.tar.gz; wget --no-cache https://www.irif.fr/~stolze/xml/td3/2.tar.gz
tar xf 2.tar.gz
./2.test.sh
RENDU: 2.xsd


Exercice 3: espaces de noms et import de schéma

  1. Écrivez un exemple 3.1.xml validé par le schéma suivant (télécharger: 3.1.xsd) :
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://ma.namespace/perso"
        elementFormDefault="qualified">
      <xsd:element name="doc">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="hello">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="world"/>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    N'oubliez pas de vérifier à l'aide de xmllint!

    RENDU: 3.1.xml

  2. On complique un peu le schéma (en rouge, les zones modifiées ou ajoutées) (télécharger: 3.2.xsd).
    Copiez 3.1.xml dans un nouveau fichier 3.2.xml et adaptez-le:
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        targetNamespace="http://ma.namespace/perso"
        elementFormDefault="qualified">
      <xsd:import namespace="http://www.w3.org/1999/xhtml"
          schemaLocation="https://www.irif.fr/~stolze/xml/td3/xhtml1-strict.xsd"/>
      <xsd:element name="doc">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="hello">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="world"/>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
            <xsd:element ref="xhtml:p"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    Note: On utilise une version "light" du schéma XHTML, normalement disponible sur http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd, car la version réelle ralentit xmllint considérablement.

    RENDU: 3.2.xml

  3. On complique encore le schéma (télécharger: 3.3.xsd).
    Copiez 3.2.xml dans un nouveau fichier 3.3.xml et adaptez-le:
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        targetNamespace="http://ma.namespace/perso"
        elementFormDefault="qualified">
      <xsd:import namespace="http://www.w3.org/XML/1998/namespace"
        schemaLocation="https://www.irif.fr/~stolze/xml/td3/xml.xsd"/>
      <xsd:import namespace="http://www.w3.org/1999/xhtml"
        schemaLocation="https://www.irif.fr/~stolze/xml/td3/xhtml1-strict.xsd"/>
      <xsd:element name="doc">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="xhtml:html"/>
            <xsd:element name="unsorted_html_elements">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:any processContents="lax" minOccurs="3" maxOccurs="unbounded"
                          namespace="http://www.w3.org/1999/xhtml"/>
                </xsd:sequence>
                <xsd:attribute ref="xml:id" use="required"/>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    RENDU: 3.3.xml

  4. Pour finir, on va référencer les version officielles des schémas de la namespace http://www.w3.org/XML/1998/namespace et de http://www.w3.org/1999/xhtml (télécharger: 3.4.xsd).
    Vous verrez que xmllint rame.
    Copiez 3.3.xml dans un nouveau fichier 3.4.xml et adaptez-le:
    Essayez d'étoffer un peu le HTML à l'intérieur de votre XML.
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        targetNamespace="http://ma.namespace/perso"
        elementFormDefault="qualified">
      <xsd:import namespace="http://www.w3.org/XML/1998/namespace"
        schemaLocation="http://www.w3.org/2001/xml.xsd"/>
      <xsd:import namespace="http://www.w3.org/1999/xhtml"
        schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"/>
      <xsd:element name="doc">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="xhtml:html"/>
            <xsd:element name="unsorted_html_elements">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:any processContents="lax" minOccurs="3" maxOccurs="unbounded"
                          namespace="http://www.w3.org/1999/xhtml"/>
                </xsd:sequence>
                <xsd:attribute ref="xml:id" use="required"/>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    RENDU: 3.4.xml