7.5 Quelques notions sur XML Schema WMK-schema est une autre façon de spécifier des données XML (une autre façon d écrire un schéma). N.B. : Un XML-schéma est lui-même un document XML! Mais il spécifie le format d autres documents XML (ceux qui sont valides par rapport à lui) 112
Preliminaires Un espace de noms XML est un standard W3C pour attribuer une signification précise à des mots qui apparaissent dans un document XML Tout type atomique pre-défini XML appartient à un espace de noms. On a : L espace de noms de XML-schema ; pour indiquer que la signification de toto doit être cherchée dans ce vocabulaire : xsd :toto. L espace de noms de XQuery ; pour indiquer que la signification de toto doit être cherchée dans ce vocabulaire : xdt :toto. 113
Un fichier Schema XML est lui-même un document XML. Il commence par un prologue, et a un élément racine. <?xml version= 1.0 encoding= ISO-8859-1?> <xsd:schema xmlns:xsd= http://ww3.w3.org/2000:10/xmlschema > <!-- declarations d elements, d attributs et de types ici --> </xsd:schema> Racine : l élément xsd :schema. Ici, on dit que l on est en tran d écrire un schéma. En fait, le mot schema a une signification précise dans l espace de noms XML (xmlns) indiqué par le vocabulaire qui se trouve à l url : http ://ww3.w3.org/2000 :10/XMLSchema 114
Déclaration d éléments Utilisation de la balise xsd :element. Par ex : <?xml version= 1.0 encoding= ISO-8859-1?> <xsd:schema xmlns:xsd= http://ww3.w3.org/2000:10/xmlschema > <xsd:element name= contacts > <xsd:complextype> <!-- declaration de type ici --> </xsd:complextype> </xsd:element> </xsd:schema> Tout élement est typé ; contacts a un type complexe : il pourra conténir des éléments enfants et/ou des attributs. Il faudra donc définir sa structure. 115
Déclaration d attributs Utilisation de la balise xsd :attribut. Tout attribut a forcement un type simple. <?xml version= 1.O encoding= ISO-8859-1?> <xsd:schema xmlns:xsd= http://ww3.w3.org/2000:10/xmlschema > <xsd:element name= contacts > <xsd:complextype> <!-- declaration du modèle de contenu,ici : les sous-éléments, etc. --> <xsd:attribute name= maj type= xsd:date /> </xsd:complextype> </xsd:element> </xsd:schema> NB : Attribut maj : date de la dernière mise à jour de la liste des contacts. xsd :date : type simple XML. 116
Un attribut peut être déclaré : obligatoire : required, optionnel : optional, ayant une valeur par défaut. Par ex. <xsd :attribute name= maj type= xsd :date use= optional defaut= 2009-03-30 /> 117
Un élément peut être de type complexe car il est constitué de plusieurs éléments, organisés sous forme de suite, par exemple. <xsd :element name="livre"> <xsd :complextype> <xsd :sequence> <xsd :element name= auteur type= xsd :string </xsd :element> <xsd :element name= pages type= xsd :positiveinteger </xsd :element> </xsd :sequence> </xsd :complextype> </xsd :element> auteur et pages ont des types simples et pre-définis. 118
Types Simples de XML Schema Il en a beaucoup. Par ex., string, booleen, positiveinteger, cdata, date, ID, IDREF, idrefs, NMTOKEN (une lettre, une chiffre, un point, un tiré, une virgule..) Les types listes sont des suites de types simples. XML Schema possède 3 types de listes integrées : 1. NMTOKENS : suites finites et non-vides de NMTOKEN separés par un espace. 2. ENTITY : notion XML un peu plus complexe que ELEMENT. Passons. 3. IDREFS (déjà vu avec les DTD) 119
Types Complexes Les sequences, déjà vues : <xsd :complextype> <xsd :sequence> <xsd :element name = nom type =sxd :string /> <xsd :element name = prenom type =xsd :string /> <xsd :element name = datenaissance type =xsd :date /> <xsd :element name = adresse type =sxd :string /> <xsd :element name = e-mail type =sxd :string /> </xsd :sequence> </xsd :complextype> NB : date, string : types atomiques de XML Schema 120
Types Complexes, Suite Modifier la déclaration de type précédente en stipulant que l on doit indiquer soit l adresse d une personne soit son adresse mail : utiliser xsd :choice <xsd :complextype> <xsd :sequence> <xsd :element name = nom type =sxd :string /> <xsd :element name = prenom type =sxd :string /> <xsd :element name = datenaissance type =sxd :date /> <xsd :choice > <xsd :element name = adresse type =sxd :string /> <xsd :element name = e-mail type =sxd :string /> </xsd :choice > </xsd :sequence> </xsd :complextype> 121
Types Complexes, Suite Vraie nouveauté par rapport aux DTD. A différence que pour les séquences, avec all on peut indiquer que des éléments composants (qui doivent apparaître une fois ou pas du tout), peuvent apparaître dans n importe quel ordre.. <xsd :complextype> <xsd :all> <xsd :element name = nom type =sxd :string /> <xsd :element name = prenom type =sxd :string /> <xsd :element name = datenaissance type =sxd :date /> <xsd :element name = adresse type =sxd :string /> <xsd :element name = e-mail type =sxd :string /> </xsd :all> </xsd :complextype> Chacun de ses éléments peut apparaître une fois ou pas de tout : comparer à? dans le DTD, mais l ordre des éléments n a pas d importance ( DTD!). 122