Tutoriel XML

ACCUEIL XML Introduction XML XML Comment utiliser Arbre XML Syntaxe XML Éléments XML Attributs XML Espaces de noms XML Affichage XML Requête HTTP XML Analyseur XML DOM XML XPath XML XML XSLT XQuery XML XMLXLink Validateur XML DTD XML Schéma XML Serveur XML Exemples XML XML Quiz Certificat XML

XMLAJAX

Présentation d'AJAX AJAX XMLHttp Requête AJAX Réponse AJAX Fichier XML AJAX PHP AJAX ASP AJAX Base de données AJAX Applications AJAX Exemples AJAX

DOM XML

Présentation du DOM Nœuds DOM Accès au DOM Informations sur le nœud DOM Liste des nœuds DOM Traversée du DOM Navigation DOM DOM Obtenir des valeurs Nœuds de changement DOM DOM Supprimer les nœuds DOM Remplacer les nœuds DOM Créer des nœuds DOM Ajouter des nœuds Nœuds de clonage DOM Exemples DOM

Tutoriel XPath

Présentation de XPath Nœuds XPath Syntaxe XPath Axes XPath Opérateurs XPath Exemples XPath

Tutoriel XSLT

Présentation de XSLT Langages XSL Transformation XSLT XSLT <modèle> XSLT <valeur-de> XSLT <pour-chaque> XSLT <sort> XSLT <si> XSLT <choisir> Appliquer XSLT XSLT sur le client XSLT sur le serveur XSLT Éditer XML Exemples XSLT

Tutoriel XQuery

Présentation de XQuery Exemple XQuery XQuery FLWOR XQuery HTML Termes XQuery Syntaxe XQuery Ajouter XQuery Sélection XQuery Fonctions XQuery

DTD XML

Présentation de la DTD Blocs de construction DTD Éléments DTD Attributs DTD Éléments DTD vs Attr Entités DTD Exemples de DTD

Schéma XSD

Présentation XSD Comment XSD XSD <schéma> Éléments XSD Attributs XSD Restrictions XSD

Complexe XSD

Éléments XSD XSD vide Éléments XSD uniquement Texte XSD uniquement XSD Mixte Indicateurs XSD XSD <tout> XSD <anyAttribute> Remplacement XSD Exemple XSD

Données XSD

Chaîne XSD Date XSD Numérique XSD Divers XSD Référence XSD

Services Web

Services XML XMLWSDL SAVON XML XML RDF XML RSS

Les références

Types de nœuds DOM Nœud DOM Liste de nœuds DOM DOM NamedNodeMap Documents DOM Élément DOM Attribut DOM Texte DOM DOM CDATA DOM Comment DOM XMLHttpRequest Analyseur DOM Éléments XSLT Fonctions XSLT/XPath

Un exemple XSD


Ce chapitre montrera comment écrire un schéma XML. Vous apprendrez également qu'un schéma peut être écrit de différentes manières.


Un document XML

Jetons un coup d'œil à 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". L'élément "shiporder" contient trois éléments enfants différents : "orderperson", "shipto" et "item". L'élément "item" apparaît deux fois et contient un élément "title", un élément facultatif "note", un élément "quantity" et un élément "price".

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 (ici il est dans le même dossier que "shiporder.xml").



Créer un schéma XML

Nous voulons maintenant créer un schéma pour le document XML ci-dessus.

Nous commençons par ouvrir un nouveau fichier que nous appellerons "shiporder.xsd". Pour créer le schéma, nous pourrions simplement suivre la structure du document XML et définir chaque élément tel que nous le trouvons. Nous commencerons par la déclaration XML standard suivie de l'élément xs:schema 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 standard (xs), et l'URI associé à cet espace de noms est la définition du langage Schema, qui a la valeur standard de http://www.w3.org/2001/XMLSchema.

Ensuite, nous devons définir l'élément "shiporder". Cet élément a un attribut et il contient d'autres éléments, nous le considérons donc comme un type complexe. Les éléments enfants de l'élément "shiporder" sont entourés d'un élément xs:sequence 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 l'élément "orderperson" comme un type simple (car il ne contient aucun attribut ou autre élément). Le type (xs:string) est précédé du préfixe d'espace de noms associé au 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 de type complexe : "shipto" et "item". Nous commençons par définir l'élément "shipto":

<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 les schémas, nous pouvons définir le nombre d'occurrences possibles pour un élément avec les attributs maxOccurs et minOccurs. maxOccurs spécifie le nombre maximum d'occurrences pour un élément et minOccurs spécifie le nombre minimum d'occurrences pour un élément. La valeur par défaut pour maxOccurs et minOccurs est 1 !

Nous pouvons maintenant définir l'élément "item". Cet élément peut apparaître plusieurs fois dans un élément "shiporder". Ceci est spécifié en définissant l'attribut maxOccurs de l'élément "item" sur "unbounded", ce qui signifie qu'il peut y avoir autant d'occurrences de l'élément "item" que l'auteur le souhaite. Notez que l'élément "note" est facultatif. Nous l'avons spécifié en définissant l'attribut minOccurs sur 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 l'élément "shiporder". Puisqu'il s'agit d'un attribut obligatoire, nous spécifions use="required".

Remarque : Les déclarations d'attribut 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 consiste à définir d'abord tous les éléments et attributs, puis à s'y référer à l'aide de l'attribut ref.

Voici le nouveau design 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 de types nommés

La troisième méthode de conception définit des classes ou des types, ce qui nous permet de réutiliser les définitions d'éléments. Cela se fait en nommant les éléments simpleTypes et complexTypes, puis en pointant vers eux via l'attribut type 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 type de données d'espace de noms W3C XML Schema. 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, qu'elle doit contenir exactement six caractères d'affilée et que ces caractères doivent être un nombre compris entre 0 et 9.