Derniers tutoriels de développement web
 

Un exemple XSD


Ce chapitre vous montrera comment écrire un schéma XML. Vous apprendrez également que le schéma peut être écrit de différentes façons.


Un document XML

Jetons un coup d' oeil à ce document XML appelé "shiporder.xml" :

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

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

Le document XML ci - dessus se compose d'un élément racine, "shiporder" , qui contient un attribut obligatoire appelé "orderid" . Le "shiporder" élément contient trois éléments enfants différents: "orderperson" , "shipto" et "item" . Le "item" élément apparaît deux fois, et il contient un "title" , une option "note" élément, une "quantity" , et un "price" élément.

La ligne ci-dessus: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" indique à l'analyseur XML que ce document doit être validé par rapport à un schéma. La ligne: xsi: noNamespaceSchemaLocation = "shiporder.xsd" spécifie où réside le schéma (here it is in the same folder as "shiporder.xml") , (here it is in the same folder as "shiporder.xml") .


Créer un schéma XML

Maintenant, nous voulons créer un schéma pour le document XML ci-dessus.

Nous commençons par l' ouverture d' un nouveau fichier que nous appellerons "shiporder.xsd" . Pour créer le schéma que nous pourrions simplement suivre la structure dans le document XML et définir chaque élément que nous trouvons. Nous allons commencer par la déclaration XML standard suivie par l'élément xs: schéma qui définit un schéma:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

Dans le schéma ci - dessus , nous utilisons l'espace de noms norme (xs) , et l'URI associé à cet espace de noms est la définition du langage de schéma, qui a la valeur standard de http://www.w3.org/2001/XMLSchema.

Ensuite, nous devons définir le "shiporder" élément. Cet élément a un attribut et il contient d'autres éléments, par conséquent, nous considérons comme un type complexe. Les éléments de l'enfant "shiporder" élément est entouré par un élément xs: séquence qui définit une séquence ordonnée de sous - éléments:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

Ensuite , nous devons définir le "orderperson" élément comme un type simple (car il ne contient pas d'attributs ou d' autres éléments). Le type (xs:string) est préfixé par le préfixe d'espace de noms associé à un schéma XML qui indique un type de données de schéma prédéfini:

<xs:element name="orderperson" type="xs:string"/>

Ensuite, nous devons définir deux éléments qui sont du type complexe: "shipto" et "item" . Nous commençons par définir le "shipto" élément:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Avec des schémas, nous pouvons définir le nombre d'occurrences possibles pour un élément avec les maxOccurs et minOccurs attribue. maxOccurs spécifie le nombre maximum d'occurrences pour un élément minOccurs et spécifie le nombre minimal d'occurrences d'un élément. La valeur par défaut pour les deux maxOccurs et minOccurs est 1!

Maintenant , nous pouvons définir le "item" élément. Cet élément peut apparaître plusieurs fois dans un "shiporder" élément. Ceci est spécifié en définissant le maxOccurs attribut du "item" élément "unbounded" ce qui signifie qu'il peut y avoir autant d'occurrences de la "item" élément que l'auteur souhaite. Notez que la "note" élément est facultatif. Nous avons spécifié en réglant les minOccurs attribuent à zéro:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Nous pouvons maintenant déclarer l'attribut de la "shiporder" élément. Comme cela est un attribut obligatoire, nous spécifions l'utilisation = "nécessaire".

Note: Les déclarations d'attributs doivent toujours venir en dernier:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Voici la liste complète du fichier de schéma appelé "shiporder.xsd" :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Diviser le schéma

La méthode de conception précédente est très simple, mais peut être difficile à lire et à maintenir lorsque les documents sont complexes.

La méthode de conception suivante est basée sur la définition de tous les éléments et attributs d' abord, puis se référant à eux en utilisant le ref attribut.

Voici la nouvelle conception du fichier de schéma ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Utilisation des types nommés

La troisième méthode de conception définit les classes ou types, qui nous permet de réutiliser les définitions d'éléments. Cela se fait en nommant les éléments simpleTypes et complexTypes, puis pointez sur eux par le type de l' attribut de l'élément.

Voici la troisième conception du fichier de schéma ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

L'élément de restriction indique que le type de données est dérivé d'un espace de nommage type de données XML Schema du W3C. Ainsi, le fragment suivant signifie que la valeur de l'élément ou de l'attribut doit être une valeur de chaîne:

<xs:restriction base="xs:string">

L'élément de restriction est plus souvent utilisé pour appliquer des restrictions aux éléments. Regardez les lignes suivantes du schéma ci-dessus:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

Cela indique que la valeur de l'élément ou de l'attribut doit être une chaîne, il doit être exactement six caractères dans une rangée, et ces caractères doit être un nombre de 0 à 9.