Link Search Menu Expand Document

TP - Schéma XML d’un répertoire

Souvenez vous, lorsque nous avons étudié les DTD, nous avions mis en pratique notre apprentissage à travers la définition DTD d’un répertoire.

Pour ce nouveau TP, le sujet ne change pas, il convient toujours d’écrire la définition d’un répertoire. Ce qui change c’est la technologie à utiliser. Cette fois-ci, c’est un Schéma XML que je vous demande d’écrire !

L’énoncé

Le but de ce TP est de créer le Schéma XML du répertoire que nous avons déjà vu.

Pour rappel, voici les informations que l’on souhaite connaître pour chaque personne :

  • Son sexe (homme ou femme).
  • Son nom.
  • Son prénom.
  • Son adresse.
  • Un ou plusieurs numéros de téléphone (téléphone portable, fixe, bureau, etc.).
  • Une ou plusieurs adresses e-mail (adresse personnelle, professionnelle, etc.).

Voici le document XML que nous avions construit :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<repertoire>
  <!-- John DOE -->
  <personne sexe="masculin">
    <nom>DOE</nom>
    <prenom>John</prenom>
    <adresse>
      <numero>7</numero>
      <voie type="impasse">impasse du chemin</voie>
      <codePostal>75015</codePostal>
      <ville>PARIS</ville>
      <pays>FRANCE</pays>
    </adresse>
    <telephones>
      <telephone type="fixe">01 02 03 04 05</telephone>
      <telephone type="portable">06 07 08 09 10</telephone>
    </telephones>
    <emails>
      <email type="personnel">john.doe@wanadoo.fr</email>
      <email type="professionnel">john.doe@societe.com</email>
    </emails>
  </personne>
    
  <!-- Marie POPPINS -->
  <personne sexe="feminin">
    <nom>POPPINS</nom>
    <prenom>Marie</prenom>
    <adresse>
      <numero>28</numero>
      <voie type="avenue">avenue de la république</voie>
      <codePostal>13005</codePostal>
      <ville>MARSEILLE</ville>
      <pays>FRANCE</pays>
    </adresse>
    <telephones>
      <telephone type="bureau">04 05 06 07 08</telephone>
    </telephones>
    <emails>
      <email type="professionnel">contact@poppins.fr</email>
    </emails>
  </personne>
</repertoire>

Une solution

Comme à chaque fois, je vous fais part de ma solution.

Le fichier XML avec le Schéma XML référencé :

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<repertoire xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="repertoire.xsd">
  <!-- John DOE -->
  <personne sexe="masculin">
    <nom>DOE</nom>
    <prenom>John</prenom>
    <adresse>
      <numero>7</numero>
      <voie type="impasse">impasse du chemin</voie>
      <codePostal>75015</codePostal>
      <ville>PARIS</ville>
      <pays>FRANCE</pays>
    </adresse>
    <telephones>
      <telephone type="fixe">01 02 03 04 05</telephone>
      <telephone type="portable">06 07 08 09 10</telephone>
    </telephones>
    <emails>
      <email type="personnel">john.doe@wanadoo.fr</email>
      <email type="professionnel">john.doe@societe.com</email>
    </emails>
  </personne>
    
  <!-- Marie POPPINS -->
  <personne sexe="feminin">
    <nom>POPPINS</nom>
    <prenom>Marie</prenom>
    <adresse>
      <numero>28</numero>
      <voie type="avenue">avenue de la république</voie>
      <codePostal>13005</codePostal>
      <ville>MARSEILLE</ville>
      <pays>FRANCE</pays>
    </adresse>
    <telephones>
      <telephone type="bureau">04 05 06 07 08</telephone>
    </telephones>
    <emails>
      <email type="professionnel">contact@poppins.fr</email>
    </emails>
  </personne>
</repertoire>

Le fichier XSD :

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <!-- balises isolées -->
  <xsd:element name="nom" type="xsd:string"/>
  <xsd:element name="prenom" type="xsd:string"/>
    
  <!-- balises d'une adresse -->
  <xsd:element name="numero" type="xsd:string"/>
  <xsd:element name="voie">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="type">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:enumeration value="impasse"/>
                <xsd:enumeration value="avenue"/>
                <xsd:enumeration value="rue"/>
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="codePostal">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{5}"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
  <xsd:element name="ville" type="xsd:string"/>
  <xsd:element name="pays" type="xsd:string"/>
    
  <!-- balise adresse -->
  <xsd:element name="adresse">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="numero"/>
        <xsd:element ref="voie"/>
        <xsd:element ref="codePostal"/>
        <xsd:element ref="ville"/>
        <xsd:element ref="pays"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
    
  <!-- balise telephone -->
  <xsd:element name="telephone">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="type">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:enumeration value="fixe"/>
                <xsd:enumeration value="portable"/>
                <xsd:enumeration value="bureau"/>
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
    
  <!-- balise telephones -->
  <xsd:element name="telephones">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="telephone" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
    
  <!-- balise email -->
  <xsd:element name="email">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="type">
            <xsd:simpleType>
              <xsd:restriction base="xsd:string">
                <xsd:enumeration value="personnel"/>
                <xsd:enumeration value="professionnel"/>
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:attribute>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
    
  <!-- balise emails -->
  <xsd:element name="emails">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="email" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
    
  <!--balise personne -->
  <xsd:element name="personne">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="nom"/>
        <xsd:element ref="prenom"/>
        <xsd:element ref="adresse"/>
        <xsd:element ref="telephones"/>
        <xsd:element ref="emails"/>
      </xsd:sequence>
      
      <!-- attribut sexe -->
      <xsd:attribute name="sexe">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:enumeration value="masculin"/>
            <xsd:enumeration value="feminin"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Schéma XML -->
  <xsd:element name="repertoire">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="personne" maxOccurs="unbounded" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Un bref commentaire

Dans cette solution, je suis allé au plus simple. Libre à vous de créer de nouvelles règles si vous souhaitez par exemple utiliser un pattern précis pour les numéros de téléphone ou les adresses e-mails.

Ce cours vous plait ?

Retrouvez ce cours en livre physique sur Amazon !