• 20 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/09/2019

Schéma XML : les types simples

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans le chapitre précédent, nous avons vu comment décrire les éléments simples et les attributs. Nous avons également appris que les valeurs possibles sont des valeurs dites de types simples comme par exemple un nombre entier ou une chaîne de caractères.

Dans ce chapitre, nous allons voir en détails les 4 grandes catégories des types simples, à savoir les chaînes de caractères, les dates et les nombres. Il manque une catégorie, me direz-vous. Vous avez raison ! Une quatrième catégorie intitulée "divers", regroupe les autres types simples qu'il est possible d'utiliser.

Les types chaînes de caractères

Le tableau récapitulatif

Type

Description

Commentaire

string

représente une chaîne de caractères

attention aux caractères spéciaux

normalizedString

représente une chaîne de caractères normalisée

basé sur le type string

token

représente une chaîne de caractères normalisée sans espace au début et à la fin

basé sur le type normalizedString

language

représente le code d'une langue

basé sur le type token

NMTOKEN

représente une chaîne de caractères "simple"

basé sur le type token
applicable uniquement aux attributs

NMTOKENS

représente une liste de NMTOKEN

applicable uniquement aux attributs

Name

représente un nom XML

basé sur le type token

NCName

représente un nom XML sans le caractère :

basé sur le type Name

ID

représente un identifiant unique

basé sur le type NCName
applicable uniquement aux attributs

IDREF

référence à un identifiant

basé sur le type NCName
applicable uniquement aux attributs

IDREFS

référence une liste d'identifiants

applicable uniquement aux attributs

ENTITY

représente une entité d'un document DTD

basé sur le type NCName
applicable uniquement aux attributs

ENTITIES

représente une liste d'entités

applicable uniquement aux attributs

Plus en détails

Le type string

Le type string est l'un des premiers types que nous ayons vu ensemble. Il représente une chaîne de caractères et peut donc contenir un peu tout et n'importe quoi. Il est cependant important de noter que certains caractères spéciaux comme le & doivent être écrits avec leur notation HTML.

Une liste des caractères spéciaux et de leur notation HTML est disponible ici.

Bien que nous ayons déjà vu plusieurs exemples ensemble, je vous en propose un nouveau afin que ce type n'ait plus aucun secret pour vous. Soit la règle de Schéma XML suivante :

<xsd:element name="string" type="xsd:string" />

Les différentes lignes XML ci-dessous sont alors valides :

<string>France</string>

<string>Site du zéro !</string>

<string>&amp;</string>
Le type normalizedString

Le type normalizedString est basé sur le type string et représente une chaîne de caractères normalisée, c'est-à-dire, une chaîne de caractères qui peut contenir tout et n'importe quoi à l'exception de tabulations, de sauts de ligne et de retours chariot. Dans la pratique, il n'est pas interdit de les écrire, mais ils seront automatiquement remplacés par des espaces.

Puisque le type normalizedString est basé sur le type string, toutes les règles du type string s'appliquent également au type normalizedString. Ainsi, les caractères spéciaux comme le & doivent être écrits avec leur notation HTML.

Je ne le préciserai pas à chaque fois, mais cette règle est toujours vraie. Un type hérite toujours de toutes les règles du type sur lequel il se base.

Le type token

Le type token est basé sur le type normalizedString et représente une chaîne de caractères normalisée sans espace au début ni à la fin. Une nouvelle fois, dans la pratique, il n'est pas interdit de les écrire. Les espaces présents au début et à la fin seront automatiquement supprimés.

Le type language

Le type language est basé sur le type token et représente, comme son nom le laisse deviner, une langue. Cette langue doit être identifiée par 2 lettres (selon la norme ISO 639 dont la liste est disponible par sur wikipedia). Ces 2 caractères peuvent éventuellement être suivi d'un code pays (selon la norme ISO 3166 dont la liste est une nouvelle fois disponible sur wikipedia).

Considérons la règle suivante :

<xsd:element name="langue" type="xsd:language" />

Les différentes lignes XML ci-dessous sont alors valides :

<langue>fr</langue>

<langue>en</langue>

<langue>en-GB</langue>

<langue>en-US</langue>
Le type NMTOKEN

Le type NMTOKEN est basé sur le type token et représente une chaîne de caractères "simple", c'est-à-dire une chaîne de caractères sans espace qui ne contient que les symboles suivants :

  • Des lettres.

  • Des chiffres.

  • Les caractères spéciaux .-_ et :

Si la chaîne de caractères contient des espaces au début ou à la fin, ils seront automatiquement supprimés.

Afin d'assurer une compatibilité entre les Schémas XML et les DTD, il convient de n'utiliser le type NMTOKEN que pour un attribut.

Le type NMTOKENS

Le type NMTOKENS représente une liste de NMTOKEN séparés par un espace. Une nouvelle fois, afin d'assurer une compatibilité entre les Schémas XML et les DTD, il convient de n'utiliser le type NMTOKENS seulement pour un attribut.

Soit la règle suivante issue d'un Schéma XML :

<xsd:attribute name="list" type="xsd:NMTOKENS" />

Les différentes lignes XML ci-dessous sont alors valides :

<balise list="A:1_B C-2.">contenu de la balise</balise>

<balise list="AZERTY 123456 QSDFGH">contenu de la balise</balise>
Le type Name

Le type Name est basé sur le type token et représente un nom XML, c'est-à-dire une chaîne de caractères sans espace qui ne contient que les symboles suivants :

  • Des lettres.

  • Des chiffres.

  • Les caractères spéciaux .-_ et :

La différence avec le type NMTOKEN est qu'une chaîne de caractères de type Name doit obligatoirement commencer par une lettre, ou l'un des 2 caractères spéciaux suivants : _ et :

Le type NCName

Le type NCName est basé sur le type Name. Il hérite donc de toutes les règles du type Name auxquelles une nouvelle règle doit être ajoutée : le type NCName ne peut pas contenir le caractère spécial :

Le type ID

Le type ID est basé sur le type NCName, il hérite donc de toutes les règles de ce type. Comme son nom le laisse deviner, un ID représente un identifiant. Il doit donc contenir des valeurs uniques. A ce titre, il est impossible de lui définir une valeur fixe ou par défaut.

Comme pour d'autres types vu précédemment, un ID ne doit être utilisé qu'avec les attributs afin d'assurer une compatibilité entre les Schémas XML et les DTD.

Le type IDREF

Le type IDREF fait référence à un ID existant dans le document XML. Tout comme le type ID, il est basé sur le type NCName et hérite donc de toutes les règles de ce type. Puisque le type ID n'est utilisable qu'avec des attributs, il en est naturellement de même pour le type IDREF.

Le type IDREFS

Si le type NMTOKENS représente une liste de NMTOKEN séparés par un espace, le type IDREFS représente lui une liste de IDREF séparés par un espace.

Afin d'assurer une compatibilité entre les Schémas XML et les DTD, il convient de n'utiliser le type IDREFS que pour un attribut.

Illustrons son utilisation avec un exemple :

<xsd:attribute name="enfants" type="xsd:IDREFS" />
<personne num="P1">Paul</personne>
<personne num="P2">Marie</personne>

<personne enfants="P1 P2">Jeanne</personne>
Le type ENTITY

Le type ENTITY permet de faire référence à une entité le plus souvent non XML et déclaré dans des fichiers DTD. Ce type est basé sur le type NCName, il hérite donc de toutes ses règles.

Une nouvelle fois, afin d'assurer une compatibilité entre les Schémas XML et les DTD, il convient de n'utiliser le type ENTITY que pour un attribut.

Une nouvelle fois, je vous propose d'illustrer son utilisation par un exemple :

<xsd:attribute name="marque" type="xsd:ENTITY" />
<!ENTITY samsung "Samsung">
<!ENTITY apple "Apple">

<telephone marque="apple">iPhone</telephone>
<telephone marque="samsung">Galaxy SII</telephone>
Le type ENTITIES

Finalement, le dernier type que nous verrons dans cette catégorie est le type ENTITIES. Il permet de faire référence à une liste d'ENTITY séparés par un espace.

Puisque c'était déjà le cas pour le type ENTITY, le type ENTITIES n'échappe pas à la règle et ne doit être utilisé qu'avec un attribut.

Les types dates

Le tableau récapitulatif

Type

Description

duration

représente une durée

date

représente une date

time

représente une heure

dateTime

représente une date et un temps

gYear

représente une année

gYearMonth

représente une année et un mois

gMonth

représente un mois

gMonthDay

représente un mois et un jour

gDay

représente un jour

Plus en détails

Le type duration

Le type duration, comme son nom le laisse deviner, représente une durée. Cette durée s'exprime en nombre d'années, de mois, de jours, d'heures, de minutes et de secondes selon une expression qui n'est pas des plus simples à savoir PnYnMnDTnHnMnS.

Je vous propose de la décortiquer :

  • P marque le début de l'expression.

  • nY représente le nombre d'années (year) où n est un nombre entier.

  • nM représente le nombre de mois (month) où n est un nombre entier.

  • nD représente le nombre de jours (day) où n est un nombre entier.

  • T permet de séparer la partie date de l'expression de sa partie heure.

  • nH représente le nombre d'heures (hour) où n est un nombre entier.

  • nM représente le nombre de minutes (minute) où n est un nombre entier.

  • nS représente le nombre de secondes (second) où n est un nombre entier ou décimal.

L'expression peut être précédée du signe - dans le cas où l'on souhaite exprimer une durée négative. Bien évidemment, tous les champs ne doivent pas forcément être renseignés. Ainsi, il est possible de ne renseigner que les heures, les minutes, etc. Dans le cas où l'expression n'exprime qu'une date, le symbole T ne doit plus figurer.

Je vous accorde que toutes ces règles ne sont pas faciles à assimiler, c'est pourquoi je vous propose de voir quelques exemples :

<xsd:element name="duree" type="xsd:duration" />
<!-- 42 ans et 6 minutes -->
<duree>P42YT6M</duree>

<!-- -2 heures -->
<duree>-PT2H</duree>

<!-- 2 jours -->
<duree>P2D</duree>

<!-- 10.5 secondes -->
<duree>PT10.5S</duree>
Le type date

Le type date permet d'exprimer une date. A l'image du type duration, une date s'exprime selon une expression bien spécifique à savoir YYYY-MM-DD.

Une nouvelle fois, je vous propose de décortiquer tout ça :

  • YYYY représente l'année (year) sur 4 chiffres ou plus.

  • MM représente le mois (month) sur 2 chiffres.

  • DD représente le jour (day) également sur 2 chiffres.

Dans le cas où l'on souhaite exprimer une date avant Jésus-Christ, un signe - peut-être placé devant l'expression.

Voyons ensemble quelques exemples :

<xsd:element name="madate" type="xsd:date" />
<!-- 13 janvier 1924 -->
<madate>1924-01-13</madate>

<!-- 12 décembre 34 avant JC -->
<madate>-0034-12-12</madate>

<!-- 4 novembre 12405 -->
<madate>12405-11-04</madate>
Le type time

Le type time permet d'exprimer une heure. Encore une fois, une expression bien spécifique doit être respectée : hh:mm:ss.

Pour continuer avec nos bonnes habitudes, décortiquons ensemble cette expression :

  • hh représente les heures (hour) sur 2 chiffres.

  • mm représente les minutes (minute) sur 2 chiffres.

  • ss représente les secondes (second) sur 2 chiffres entiers ou à virgule.

Voici quelques exemples :

<xsd:element name="monheure" type="xsd:time" />
<!-- 10 heures et 24 minutes -->
<monheure>10:24:00</monheure>

<!-- 2,5 secondes -->
<monheure>00:00:02.5</monheure>
Le type dateTime

Le type dateTime peut être considéré comme un mélange entre le type date et le type time. Ce nouveau type permet donc de représenter une date ET une heure. Une nouvelle fois, une expression particulière doit être respectée : YYYY-MM-DDThh:mm:ss.

Je ne vais pas spécifiquement revenir sur cette expression. En effet, comme vous pouvez le constater, il s'agit des expressions du type date et du type time séparées par la lettre T. Je vous laisse vous référer aux types date et time pour les règles à appliquer. ;)

Le type gYear

Le type gYear représente une année sur 4 chiffres ou plus. Dans le cas où l'on souhaite exprimer une année avant Jésus-Christ, un signe - peut-être placé devant l'expression.

Le type gYearMonth

Le type gYearMonth représente une année et un mois. Comme pour tous les types que nous venons de voir dans ce chapitre, le type gYearMonth doit respecter une expression particulière : YYYY-MM.

Vous l'aurez compris, les règles sont toujours les mêmes. Je vous laisse donc vous reporter au paragraphe traitant du type date pour plus d'informations. ;)

Le type gMonth

Le type gMonth représente un mois sur 2 chiffres précédés du symbole --.

Non, ce n'est pas une erreur de frappe, le symbole est bien --. Voyons un exemple :

<xsd:element name="mois" type="xsd:gMonth" />
<!-- mars -->
<mois>--03</mois>

<!-- décembre -->
<mois>--12</mois>
Le type gMonthDay

Le type gMonthDay représente un mois et un jour. Une nouvelle fois, une expression particulière doit être utilisée afin d'exprimer ce nouveau type : --MM-DD.

Une nouvelle fois, les règles sont les mêmes que celles que nous avons déjà utilisé précédemment notamment pour le type date et le type gYearMonth.

Le type gDay

Finalement, nous allons terminer ce chapitre avec le type gDay qui représente un jour sur 2 chiffres précédés du symbole ---.

Afin de terminer ce chapitre en beauté, voici quelques exemples :

<xsd:element name="journee" type="xsd:gDay" />
<!-- le troisième jour du mois -->
<journee>---03</journee>

<!-- le douzième jour du mois -->
<journee>---12</journee>

Les types numériques

Le tableau récapitulatif

Type

Description

Commentaire

float

représente un nombre flottant sur 32 bits conforme à la norme IEEE 754

 

double

représente un nombre flottant sur 64 bits conforme à la norme IEEE 754

 

decimal

représente une nombre décimal

 

integer

représente un nombre entier

basé sur le type decimal

long

représente un nombre entier

basé sur le type integer

int

représente un nombre entier

basé sur le type long

short

représente un nombre entier

basé sur le type int

byte

représente un nombre entier

basé sur le type short

nonPositiveInteger

représente un nombre entier non positif

basé sur le type integer

negativeInteger

représente un nombre entier négatif

basé sur le type nonPositiveInteger

nonNegativeInteger

représente un nombre entier non négatif

basé sur le type integer

positiveInteger

représente un nombre entier positif

basé sur le type nonNegativeInteger

unsignedLong

représente un nombre entier positif

basé sur le type nonNegativeInteger

unsignedInt

représente un nombre entier positif

basé sur le type unsignedLong

unsignedShort

représente un nombre entier positif

basé sur le type unsignedInt

unsignedByte

représente un nombre entier positif

basé sur le type unsignedShort

Plus en détails

Le type float

Comme vous avez déjà pu le lire dans le tableau récapitulatif, le type float représente un nombre flottant sur 32 bits et conforme à la norme IEEE 754. Je suis parfaitement conscient que cette définition est incompréhensible pour la plupart des gens, c'est pourquoi nous allons grandement la simplifier.

Le type float a été emprunté aux langages de programmation comme le langage C et est encore aujourd'hui utilisé dans des langages plus récents comme Java ou C#. Il représente un nombre flottant, c'est-à-dire un nombre entier ou décimal, se trouvant entre les valeurs 3.4x10^-38 et 3.4x10^38.

A cette plage de valeurs, 3 autres peuvent être ajoutées :

  • -INF pour moins l'infini.

  • +INF pour plus l'infini.

  • NaN pour Not a Number, c'est-à-dire pour désigner une valeur non numérique.

Il est tout à fait possible d'écrire un nombre de type float avec des exposants. Il convient alors d'utiliser la notation E ou e.

Pour mieux comprendre toutes ces règles, je vous propose de regarder ensemble quelques exemples :

<xsd:element name="nombre" type="xsd:float" />
<nombre>42</nombre>

<nombre>-42.25</nombre>

<nombre>3E4</nombre>

<nombre>10e-5</nombre>
Le type double

Le type double est très proche du type float, si ce n'est qu'il représente un nombre flottant sur 64 bits et conforme à la norme IEEE 754 au lieu des 32 bits du type float. Concrètement, cette différence se traduit par le fait qu'un nombre de type double se trouve entre les valeurs 1.7x10^-308 et 1.7x10^308.

Comme pour le type float, les 3 valeurs suivantes peuvent être ajoutées à la liste :

  • -INF pour moins l'infini.

  • +INF pour plus l'infini.

  • NaN pour Not a Number, c'est-à-dire pour désigner une valeur non numérique.

On retrouve également la règle de l'exposant. Je vous laisse vous référer à la définition du type float pour plus de détails.

Le type decimal

Comme son nom le laisse deviner, le type decimal représente un nombre décimal, c'est-à-dire un nombre qui peut-être entier ou à virgule. Ce nombre peut-être positif ou négatif et donc être précédé du symbole + ou -. Dans le cas d'un nombre où la partie entière est égale à zéro, il n'est pas obligatoire de l'écrire.

Voyons tout de suite quelques exemples afin d'illustrer cette définition :

<xsd:element name="nombre" type="xsd:decimal" />
<nombre>42</nombre>

<nombre>-42.25</nombre>

<nombre>+.42</nombre>

<nombre>00042.420000</nombre>
Le type integer

Le type integer est basé sur le type decimal et représente un nombre entier, c'est-à-dire un nombre sans virgule. Comme pour le type décimal, un nombre de type integer peut être précédé par le symbole + ou -.

Le type long

Le type long est basé sur le type integer si ce n'est qu'un nombre de type long doit forcément être compris entre les valeurs -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807.

Le type int

Le type int est basé sur le type long si ce n'est qu'un nombre de type int doit forcément être compris entre les valeurs -2 147 483 648 et 2 147 483 647.

Le type short

Le type short est basé sur le type int si ce n'est qu'un nombre de type short doit forcément être compris entre les valeurs -32 768 et 32 768.

Le type byte

Le type byte est basé sur le type short si ce n'est qu'un nombre de type byte doit forcément être compris entre les valeurs -128 et 127.

Le type nonPositiveInteger

Basé sur le type integer, le type nonPositiveInteger représente un nombre entier qui n'est pas positif. Concrètement, cela correspond à un nombre négatif ou au nombre zéro.

Voyons ensemble un exemple :

<xsd:element name="nombre" type="xsd:nonPositiveInteger" />
<nombre>-42</nombre>

<nombre>0</nombre>

<nombre>-00042</nombre>
Le type negativeInteger

Basé sur le type nonPositiveInteger, le type negativeInteger représente un nombre entier strictement négatif, c'est-à-dire strictement inférieur à zéro.

Le type nonNegativeInteger

Basé sur le type integer, le type nonNegativeInteger représente un nombre entier qui n'est pas négatif, c'est-à-dire un nombre supérieur ou égal à zéro.

Soit l'exemple suivant :

<xsd:element name="nombre" type="xsd:nonNegativeInteger" />
<nombre>42</nombre>

<nombre>0</nombre>

<nombre>+00042</nombre>
Le type positiveInteger

Basé sur le type nonNegativeInteger, le type positive Integer représente un nombre entier strictement positif, c'est-à-dire strictement supérieur à zéro.

Le type unsignedLong

Le type unsignedLong est basé sur le type nonNegativeInteger et représente un entier compris entre les valeurs 0 et 18 446 744 073 709 551 615.

Le type unsignedInt

Le type unsignedInt est basé sur le type unsignedLong et représente un entier compris entre les valeurs 0 et 4 294 967 295.

Le type unsignedShort

Le type unsignedShort est basé sur le type unsignedInt et représente un entier compris entre les valeurs 0 et 65 535.

Le type unsignedByte

Le type unsignedByte est basé sur le type unsignedShort et représente un entier compris entre les valeurs 0 et 255.

Les autres types

Le tableau récapitulatif

Type

Description

boolean

représente l'état vrai ou faux

QName

représente un nom qualifié

NOTATION

représente une notation

anyURI

représente une URI

base64Binary

représente une donnée binaire au format Base64

hexBinary

représente une donnée binaire au format hexadecimal

Plus en détails

Le type boolean

Le type boolean, comme son nom le laisse deviner, représente un booléen. Pour ceux qui ignorent de quoi il s'agit, un booléen permet d'indiquer l'un des 2 états suivant : vrai ou faux.

Si 2 états sont possibles, 4 valeurs sont en réalités acceptées :

  • true qui représente l'état vrai.

  • false qui représente l'état faux.

  • 1 qui représente l'état vrai.

  • 0 qui représente l'état faux.

Conscient que cette notion n'est pas forcément facile à comprendre lorsque c’est la première fois qu'on la rencontre, je vais tenter de l'illustrer avec un exemple. Notre exemple va nous permettre, via un attribut, de savoir si une personne est un animal ou pas.

<xsd:attribute name="animal" type="xsd:boolean" />
<!-- Victor Hugo n'est pas un animal -->
<personne animal="false">Victor Hugo</personne>

<!-- Zozor est bien un animal -->
<personne animal="true">Zozor</personne>
Le type QName

Le type QName représente un nom qualifié. C'est un concept qui s'appuie sur l'utilisation des espaces de nom.

Le type NOTATION

Le type NOTATION permet d'identifier et décrire du contenu XML ou non comme par exemple une image.

Le type anyURI

Comme son nom l'indique, le type anyURI représente une URI (Uniform Resource Identifier). Une URI est une chaîne de caractères qui permet d'identifier une ressource.

On distingue généralement 2 types d'URI :

  • Les URL (Uniform Resource Locator) est probablement la forme d'URI la plus connue et je suis sûr que ce nom vous parle. En effet, les URL sont utilisés pour décrire l'adresse d'une ressource sur un réseau. 

  • Les URN (Uniform Resource Name) sont quant à eux utilisés pour identifier une ressource dans un espace de noms. Je ne vais pas m'attarder sur les URN car nous reviendrons plus tard dans ce cours sur la notion des espaces de nom.

Une URI permet d'identifier une ressource de manière relative ou absolue.

Voyons ensemble quelques exemples :

<xsd:attribute name="adresse" type="xsd:anyURI"/>
<!-- URI absolu -->
<image adresse="http://www.siteduzero.com/bundles/common/images/spreadsheetV32.png" />

<!-- URI relatif -->
<image adresse="../bundles/common/images/spreadsheetV32.png"/>
Le type base64Binary

Le type base64Binary représente une donnée binaire au format Base64. Vous trouverez plus d'informations à ce sujet sur Wikipedia.

Comme de nombreux types que nous avons vu, le type base64Binary impose le respect de plusieurs règles :

  • Seules les lettres (majuscules ou minuscules), les chiffres et les symboles + / et = sont autorisés.

  • Le nombre de caractères qui composent la chaîne doit être un multiple de 4.

Dans le cas où le symbole = est utilisé, de nouvelles règles doivent être respectées :

  • Il ne peut apparaître qu'en fin de chaîne, une fois ou deux.

  • Dans le cas où il est utilisé qu'une seule fois, il doit forcément être précédé des caractères A Q g ou w.

  • Dans le cas où il est utilisé 2 fois, il doit forcément être précédé des caractères A E I M Q U Y c g k o s w 0 (zéro) 4 ou 8.

Le type hexBinary

Le type hexBinary représente une donnée binaire au format hexadecimal.

Si comme pour le type base64Binary quelques règles sont à respecter, elles sont bien plus simples dans le cas du type hexBinary. Ainsi, seuls les lettres entre A et F (majuscules ou minuscules), ainsi que les chiffres sont autorisés.
A noter : le nombre de caractères composant la chaîne doit forcément être un multiple de 2.

En résumé

  • Il existe 4 grandes familles de types simples.

  • Ces familles permettent d'être très précis quant à la description des éléments simples et des attributs.

Exemple de certificat de réussite
Exemple de certificat de réussite