Présentation
XML-Schema
Problématique U-Portal
Comme nous l'avons vu dans la présentation
consacrée aux services-web, la connaissance d'XML-Schema est indispensable
à la lecture d'un document WSDL. En effet, WSDL utilise XML Schema pour
définir les types de données qui vont être utilisés
dans les messages des services-web.
Ce document à donc pour but de présenter les grandes lignes d'XML-Schema
mais ne constitue pas une référence sur la syntaxe de ce langage.
XML-Schema : qu'est-ce-que c'est?
- XML-Schema est une alternative XML aux DTD
(les DTD sont des documents permettant de valider la conformité d'un
document XML par rapport à sa définition). En réalité
XML Schema apparait comme le successeur des DTD car il est par nature extensible
et s'appuit sur XML.
- Ainsi XML Schema décrit (en XML) la structure d'un document XML c'est
à dire :
- les éléments qui composent un document
- les attributs
- la hierarchie entre les éléments
- l'ordre des sous-éléments
- le nombre de sous-éléments
- les types des éléments et attributs
- les valeurs par défaut, le format ou la restriction des valeurs
d'un élément ou d'un attribut
- On parle aussi de XML Schema Definition (XSD)
Les éléments
- Les types simples les plus courants sont :
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
- exemple : <xs:element name="cod_etu" type="xs:integer"/>
- déclaration d'une valeur par défaut
: <xs:element name="code_postal" type="xs:string" default="54000"/>
- déclaration d'une valeur figée
: <xs:element name="universite" type="xs:string" fixed="nancy2"/>
Les attributs
- Seuls les éléments complexes peuvent avoir des attributs
- la déclaration des attributs par défaut ou fixe est identique
aux éléments
- rendre un attribut obligatoire
: <xs:attribute name="email" type="xs:string" use="required"/>
- rendre un attribut facultatif
: <xs:attribute name="url" type="xs:string" use="optional"/>
Les restrictions
- Il est possible d'apporter des restrictions sur les attributs ou éléments
- Plage de valeur : <xs:minInclusive
value="minimum"/> et <xs:maxInclusive
value="maximum"/>
- Liste de valeur : <xs:enumeration
value="une_valeur"/>
- Conformité à un motif
: <xs:pattern value="[A-Z][A-Z][A-Z]"/>
ou <xs:pattern value="([a-z])*"/>
- Traitement des espaces :
<xs:whiteSpace value="preserve"/>
(les espaces sont laissés tels-que). Autres valeurs : replace
(remplacer les LF,CR, TAB... par des espaces) ou collapse
(remplacer les CR,LF... mais aussi supprimer les espaces avant/après
et concaténer les successions d'espace en un seul)
- sur la longueur : <xs:length
value="8"/> ou <xs:minLength
value="5"/> et <xs:maxLength
value="8"/>
- il existe aussi des restrictions sur les décimales
(fractionDigits et totalDigits)
Eléments complexes
- utilisation du tag xs:complexType
- la définition d'un élément complexe peut se faire directement
au niveau de l'élément lui-même ou par référence
au nom du type complexe (ce qui permet à plusieurs éléments
de partager le même type complexe).
- un type complexe peut enrichir un autre type complexe on non(tag <xs:extension
base="type_de_base">)
- un type complexe peut aussi en restreindre un autre (exemple <xs:restriction
base="xs:integer">)
- mélanger du texte libre avec des tags (exemple : bonjour <prenom>olivier</prenom>)
: <xs:complexType mixed="true">
Les indicateurs
- Permet de contrôler comment les éléments vont être
utilisés
- Indicateurs d'ordre :
- xs:all : les sous-éléments
apparaissent dans n'importe quel ordre
- xs:choice : indique
qu'un seul des sous-éléments peut apparaître
- xs:sequence : ordonne
les sous-éléments : ils doivent apparaître dans un
ordre précis.
- Indicateurs d'occurence (combien de fois un élément peut apparaître)
:
- maxOccurs : nombre maximum
(par défaut 1). Pour un nombre illimité, utiliser : maxOccurs="unbounded"
- minOccurs : nombre minimum
- Indicateurs de groupe :
- group : permet de regrouper
logiquement des éléments
- attributeGroup : permet
de regrouper logiquement des attributs
Extension
- le tag any permet de rajouter
n'importe que élément à la suite de ceux qui sont précisemment
définis (exemple : <xs:any minOccurs="0"/>)
- le tag anyAttribute permet
d'ajouter des attributs non spécifiés dans le schéma.
- le tag substitutionGroup
permet de définir un schéma s'appliquant à un document
xml dont les balises ne porteraient pas toujours le même nom (par exemple
<nom /> et <name />). Il est aussi possible de bloquer la substitution.
Un exemple
<?xml version="1.0" encoding="ISO-8859-1" ?>
<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>