1
Cours 5Introduction aux schémas XML
Éric Laporte
Institut Gaspard-Monge
Université Paris-Est Marne-la-Vallée
2
Sommaire
Grammaires pour les documents XML 4
Schéma pour une collection d'entrées 8
Validateurs 17
Attributs 18
Types simples 25
Référence à un schéma 41
Inclure des éléments spécifiés dans d'autres schémas 45
Schémas pour documents sans espaces de noms 56
Documents à structure complexe 61
3
• Des grammaires en XML• Une DTD• Un schéma XML• DTD ou schéma XML ?• Un premier schéma (1/4)• Un premier schéma (2/4)• Un premier schéma (3/4)• Un premier schéma (4/4)• Espaces de noms (1/2)• Espaces de noms (2/2)• Déclaration et référence• Types (1/2)• Types (2/2)• Validateurs• Déclarer un attribut (1/3)• Déclarer un attribut (2/3)• Déclarer un attribut (3/3)• Attribut sur un type simple (1/4)• Attribut sur un type simple (2/4)• Attribut sur un type simple (3/4)• Attribut sur un type simple (4/4)• Types simples• Types simples prédéfinis (1/5)• Types simples prédéfinis (2/5)• Types simples prédéfinis (3/5)• Types simples prédéfinis (4/5)• Types simples prédéfinis (5/5)• Liste balisée• Types simples dérivés : restriction• Restriction par <s:pattern>• Restriction par énumération• Restriction par <s:whitespace>• Autres restrictions de types simples
37. Types simples dérivés : liste
38. Types simples dérivés : union (1/)
39. Types simples dérivés : union (2/)
40. Dérivations de types
41. Référence à un schéma XML (1/2)
42. Référence à un schéma XML (2/2)
43. Référence à plusieurs schémas XML
44. Annoter un schéma
45. Inclure des éléments spécifiés dans d'autres schémas
46. Solution avec s:import (1/2)
47. Solution avec s:import (2/2)
48. Solution avec s:any (1/2)
49. Solution avec s:any (2/2)
50. Variantes
51. <s:anyAttribute>
52. Schémas partiels (1/2)
53. Schémas partiels (2/2)
54. Inclure des noeuds texte (1/2)
55. Inclure des noeuds texte (2/2)
56. Schéma d'un document cible sans espace de noms (1/2)
57. Schéma d'un document cible sans espace de noms (2/2)
58. Document cible partiel (1/2)
59. Document cible partiel (2/2)
60. Schéma pour plusieurs types de documents
61. Types complexes (1/3)
62. Types complexes (2/3)
63. Types complexes (3/3)
64. <s:choice>
65. <s:all> (1/6)
66. <s:all> (2/6)
67. <s:all> (3/6)
68. <s:all> (4/6)
69. <s:all> (5/6)
70. <s:all> (6/6)
4
Des grammaires en XML
Chaque type de document XML a sa syntaxe
XHTML, XSLFO, XSLT, CML... et on peut en définir de nouveaux
Grammaire
Définit la syntaxe d'un type de document
Exemple : DTD
Grammaire en XML : schéma XML
Un document est valide par rapport à une grammaire s'il respecte les contraintes en plus d'être bien formé
5
Une DTD
<!ENTITY % Text "(#PCDATA|i|citation|liste)*"><!ELEMENT i (#PCDATA|i)*><!ELEMENT p %Text;><!ELEMENT liste (entree*)><!ELEMENT entree %Text;><!ELEMENT filmographie (resumes, aliases, perso, roles) ><!ELEMENT resumes (resume*)><!ELEMENT resume %Text;><!ATTLIST resume filmref ID #REQUIRED realisateur CDATA #REQUIRED img CDATA #IMPLIED pdf CDATA #IMPLIED><!ELEMENT aliases (alias*)>(...)
6
Un schéma XML
<?xml version="1.0" encoding="ISO-8859-1" ?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:simpleType name="stringtype"> <xs:restriction base="xs:string"/></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:element name="shiporder" type="shipordertype"/></xs:schema>
7
DTD ou schéma XML ?
DTDFormat très utiliséRelativement lisibleGrammaire en SGML (ancien concurrent de XML)Compatible avec XML
Schéma XMLGrammaire en XMLPermet d'engendrer du code JavaVersion simplifiée : Relax NGPossibilités de contrôle strict (ex. : entier entre 1 et 10)
8
Un premier schéma (1/4)
Une collection d'entrées avec des champs simples
<?xml version="1.0" encoding="utf-8"?><Tracks xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album> <Kind>MPEG audio file</Kind> <Size>3948579</Size> <Total_Time>197407</Total_Time> <Date_Modified>2004-07-19T15:24:23Z</Date_Modified> <Date_Added>2004-07-20T14:09:55Z</Date_Added> <Bit_Rate>160</Bit_Rate> <Sample_Rate>44100</Sample_Rate>
9
Un premier schéma (2/4)
Schéma correspondant
<?xml version="1.0" encoding="UTF-8"?><!-- collectionEntrees.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Tracks"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="aud:Track"/> </s:sequence> </s:complexType> </s:element>
10
Un premier schéma (3/4)
<s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/> <s:element ref="aud:Name"/> <s:element ref="aud:Artist"/> <s:element minOccurs="0" ref="aud:Composer"/>(...) <s:element ref="aud:File_Folder_Count"/> <s:element ref="aud:Library_Folder_Count"/> </s:sequence> </s:complexType> </s:element>
11
Un premier schéma (4/4)
<s:element name="Track_ID" type="s:integer"/> <s:element name="Name" type="s:string"/> <s:element name="Artist" type="s:string"/> <s:element name="Composer" type="s:string"/>(...) <s:element name="Date_Modified" type="s:dateTime"/> <s:element name="Date_Added" type="s:dateTime"/>(...) <s:element name="File_Folder_Count" type="s:integer"/> <s:element name="Library_Folder_Count" type="s:integer"/></s:schema>
12
Espaces de noms (1/2)
- du schéma XML déclaré ici avec le préfixe s- du document XML cible : c'est l'espace de noms des éléments
du document cible décrits par le schémaOn l'appelle l'espace de noms cible du schéma XMLOn le déclarer dans le schéma XML deux fois : avec
targetNameSpace et avec xmlns et un préfixe
<!-- collectionEntrees.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Tracks">
13
Espaces de noms (2/2)
Les éléments déclarés par <s:element name="..."> fils de <s:schema> appartiennent automatiquement à l'espace de noms cible : pas de préfixe dans la déclaration
En cas de référence à une déclaration, utiliser le préfixeIl faut donc déclarer l'espace de noms cible avec un préfixe
<!-- collectionEntrees.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Tracks"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="aud:Track"/> </s:sequence>
14
Déclaration et référence
On peut faire référence à un nom d'élément avant de le déclarer
<s:element name="Tracks"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="aud:Track"/> </s:sequence> </s:complexType> </s:element> <s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/> <s:element ref="aud:Name"/>
15
Types (1/2)
Décrivent les contenus possibles d'un élément ou d'un attribut<s:complexType> <s:sequence>
séquence d'éléments dans un ordre fixePar défaut, minOccurs et maxOccurs valent 1
<s:element name="Tracks"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="aud:Track"/> </s:sequence> </s:complexType> </s:element>
16
Types (2/2)
type="s:integer" un noeud texte contenant un entiertype="s:string" un noeud texte quelconquetype="s:dateTime" date et heure au format ISO
<s:element name="Track_ID" type="s:integer"/> <s:element name="Name" type="s:string"/>(...) <s:element name="Date_Modified" type="s:dateTime"/>
<Track> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name>(...) <Date_Modified>2004-07-19T15:24:23Z</Date_Modified>
17
Validateurs
Validateur du W3Chttp://www.w3.org/2001/03/webdata/xsvSi l'élément racine du document cible ne correspond à aucune
déclaration globale (fille de s:schema), le validateur ne vérifie pas la syntaxe et produit le message :
No declaration for document root found, validation was laxExemple : le nom de l'élément racine correspond, mais pas
l'espace de noms
Autres validateursPas toujours aussi fiables que celui du W3CAltova : message moins trompeur
The element declaration was not found for root element
18
Déclarer un attribut (1/3)
On veut que l'élément Track puisse avoir un attribut (sans espace de noms)
<?xml version="1.0" encoding="ISO-8859-1"?><Tracks xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track large="false"> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album> <Kind>MPEG audio file</Kind> <Size>3948579</Size> <Total_Time>197407</Total_Time>
19
Déclarer un attribut (2/3)Le nom est déclaré sans préfixeDéclaration localeLes attributs doivent être déclarés après le contenu
<s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/> <s:element ref="aud:Name"/>(...) <s:element ref="aud:Library_Folder_Count"/> </s:sequence> <s:attribute name="large" type="s:boolean"/> </s:complexType> </s:element>
20
Déclarer un attribut (3/3)
type="s:boolean" true, false, 1, 0
Pour que l'attribut soit obligatoire<s:attribute name="large" type="s:boolean" use="required"/>Par défaut, use="optional"
Pour imposer une valeur<s:attribute name="unit" type="s:string" fixed="euro"/>Si l'attribut est présent, sa valeur doit être "euro"Même possibilité pour les éléments :<s:element name="jr:unit" type="s:string" fixed="euro"/>
21
Attribut sur un type simple (1/4)
<?xml version="1.0" encoding="ISO-8859-1"?><!-- plantCatalogNS.xml --><CATALOG xmlns="http://igm.univ-mlv.fr/~laporte/jardinerie">
<PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</BOTANICAL> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE unit="euro">2.44</PRICE> <AVAILABILITY>031599</AVAILABILITY>
</PLANT> <PLANT>
<COMMON>Columbine</COMMON>
22
Attribut sur un type simple (2/4)
<s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/> <s:element ref="jr:BOTANICAL"/> <s:element ref="jr:ZONE"/> <s:element ref="jr:LIGHT"/> <s:element ref="jr:PRICE"/> <s:element ref="jr:AVAILABILITY"/> </s:sequence> </s:complexType> </s:element> <s:element name="COMMON" type="s:string"/>
23
Attribut sur un type simple (3/4)
<s:element name="BOTANICAL" type="s:string"/> <s:element name="ZONE" type="s:string"/> <s:element name="LIGHT" type="s:string"/> <s:element name="PRICE"> <s:complexType> <s:simpleContent> <s:extension base="s:decimal"> <s:attribute name="unit" type="s:string" use="required"/> </s:extension> </s:simpleContent> </s:complexType> </s:element> <s:element name="AVAILABILITY" type="s:integer"/></s:schema>
24
Attribut sur un type simple (4/4)
type="s:decimal" un noeud texte contenant un nombre en notation décimale (avec point : 2.44)
<s:extension base="s:decimal"> : décrit les valeurs du noeud texte sous l'élément PRICE
<s:element name="PRICE"> <s:complexType> <s:simpleContent> <s:extension base="s:decimal"> <s:attribute name="unit" type="s:string"
use="required"/>
25
Types simples
Pour les noeuds qui contiennent du texte sans balises- un noeud de type texte- une valeur d'attribut
type="s:string" un noeud texte quelconque <s:element name="Name" type="s:string"/> <Name>American Beauty - Theme</Name>
26
Types simples prédéfinis (1/5)
type="s:boolean" true, false, 1, 0type="s:integer" 0, 15, -4, +15type="s:decimal" 2.44, 15, -2.4, +3.1416type="s:float" 6.02214199E23Autres types numériques : double, long, short, int, byte...
type="s:dateTime" 2004-07-19T11:34:46Ztype="s:date" 2004-07-19type="s:time" 11:34:46Ztype="s:gYear" 2008 (dans le calendrier grégorien)type="s:gMonthDay" --09-26 (tous les 26 septembre)
27
Types simples prédéfinis (2/5)
Normalisation<s:attribute name="unit" type="s:string" fixed="euro"/><s:element name="jr:unit" type="s:string" fixed="euro"/>Les validateurs comparent la valeur trouvée dans le document
avec la valeur imposée par le schémaLes validateurs normalisent certains types avant comparaison
Exemple : s:token <Kind unit=" MPEG audio file "> <s:attribute name="Kind" type="s:token" fixed="MPEG audio file"/>Le document est valide
28
Types simples prédéfinis (3/5)
Normalisation
type="s:string" pas de normalisationtype="s:token" normalisation : remplacer toute suite de
caractères blancs par 1 espace, et supprimer les espaces au début et à la fin
type="s:boolean" true = 1, false = 0type="s:integer" 15 = +15type="s:decimal" 2.44 = +02.40
29
Types simples prédéfinis (4/5)
Autres types texte normalisés
type="s:NMTOKEN" Lettres, chiffres, [-_.:], mais pas d'espaces blancs
type="s:Name" Même chose mais commence par une lettre ou [_:]
type="s:QName" Comme Name avec au plus un [:]type="s:NCName" Comme Name mais sans [:]type="s:ID" Comme NCName mais unique
dans le documentLe validateur supprime les espaces au début et à la fin avant de
comparer
30
Types simples prédéfinis (5/5)
Types listes prédéfinis : NMTOKENS...
Les chaînes de caractères sont séparées par des espaces
<genres>Eschscholzia Papaver Sanguinaria</genres>
<s:element name="genres" type="s:NMTOKENS"/>
Les types listes prédéfinis font concurrence à des listes balisées
31
Liste balisée
<genres><genre>Eschscholzia</genre><genre>Papaver</genre><genre>Sanguinaria</genre>
</genres>
<s:element name="genres"> <s:complexType> <s:sequence> <s:element maxOccurs="unbounded" ref="jr:genre"/> </s:sequence> </s:complexType></s:element><s:element name="genre" type="s:NMTOKEN"/>
32
Types simples dérivés : restriction
<s:element name="AVAILABILITY"> <s:simpleType> <s:restriction base="s:integer"> <s:pattern value="[01][0-9][0-3][0-9][0-9][0-9]"/> <s:minInclusive value="010100"/> <s:maxInclusive value="123199"/> </s:restriction> </s:simpleType> </s:element>
<PRICE unit="euro">2.44</PRICE> <AVAILABILITY>031599</AVAILABILITY>
</PLANT>
Restriction : le type dérivé est inclus dans le type de base
33
Restriction par <s:pattern>
<s:pattern value=".*0"> <!-- multiples de 10 -->Caractères spéciaux \ | . - ^ ? * + { } ( ) [ ]Classes de caractères Unicode\p{L} lettres \P{L} tout sauf les lettres\p{Lu} lettres majuscules \P{Lu}\p{IsBasicLatin} alphabet latin de baseCes codes sont utilisables à l'intérieur des [ ]Classes de caractères Perl\s espace, tabulation, fin de ligne \S autres car.\d chiffres de tous les alphabets \D autres car.
34
Restriction par énumération
<Track> <Track_ID>38</Track_ID> <Name>All I Need</Name> <Artist>Air</Artist> <Album>Moon Safari</Album> <Genre>Pop</Genre>
<s:element name="Genre"> <s:simpleType> <s:restriction base="s:token"> <s:enumeration value="Pop"/> <s:enumeration value="Rock"/> <s:enumeration value="Rap"/>(...) </s:restriction> </s:simpleType> </s:element>
35
Restriction par <s:whitespace>
Spécifie le traitement des caractères blancs à effectuer pour normaliser avant comparaison
<s:whitespace value="replace">chaque caractère blanc est remplacé par un espace
<s:whitespace value="preserve">pas de traitement avant validation
<s:whitespace value="collapse">comme la normalisation en XSLT
36
Autres restrictions de types simples
minExclusivemaxExclusivelengthmaxLengthminLengthtotalDigits (évalué sur la valeur logique)...
37
Types simples dérivés : liste
<genres>Eschscholzia Papaver Sanguinaria</genres>
<s:element name="genres"> <s:simpleType> <s:list itemType="s:NCName"/> </s:simpleType> </s:element>
Les chaînes de caractères sont séparées par des espaces
38
Types simples dérivés : union (1/)
Les éléments ZONE dans le catalogue de plantes contiennent des chaînes de types divers
<ZONE>Annual</ZONE>(...)
<ZONE>4</ZONE>(...)
<ZONE>3 - 5</ZONE>
<s:element name="ZONE"> <s:simpleType> <s:union> <s:simpleType> <s:restriction base="s:NCName"/> <!-- ex. : "Annual" --
> </s:simpleType>
39
Types simples dérivés : union (2/)
<s:simpleType> <s:restriction base="s:integer"/> </s:simpleType> <!-- en fait, pas de restriction --> <s:simpleType> <s:restriction base="s:token"> <s:pattern value="[0-9]+ [-] [0-9]+"/> <!-- ex : "3 - 5" --
> </s:restriction> </s:simpleType> </s:union> </s:simpleType> </s:element>
La seule façon d'inclure un type simple prédéfini dans une union est d'utiliser <s:simpleType> et <s:restriction base="..."/>
40
Dérivations de types
extension (attributs)
restriction,
liste, union
s:simpleType
s:complexTypes:simpleContent
41
Référence à un schéma XML (1/2)
Les applications qui traitent le document cible doivent pouvoir le valider par rapport à un schéma
Exemple : le validateur du W3C
<?xml version="1.0" encoding="utf-8"?><Tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/audio http://igm.univ-mlv.fr/~laporte/xml/schema/collectionGenres.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album> <Kind> MPEG audio file </Kind> <Size>3948579</Size>
42
Référence à un schéma XML (2/2)
L'espace de noms xsi spécifie des attributs utilisables dans les documents cibles
La référence au schéma se fait par une valeur d'attribut qui contient d'abord l'espace de noms cible, puis l'URL du schéma séparée par un espace
<?xml version="1.0" encoding="utf-8"?><Tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/audio http://igm.univ-mlv.fr/~laporte/xml/schema/collectionGenres.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track>
43
Référence à plusieurs schémas XML
On peut faire référence à n schémas indépendantsLa valeur d'attribut contient 2n chaînes séparées par des
espacesLe document cible doit être valide par rapport à chaque
schéma indépendamment
xsi:schemaLocation="espace-de-noms-1 URL-1.xsdespace-de-noms-2URL-2.xsd"
xmlns="espace-de-noms-1" xmlns:en2="espace-de-noms-2">
44
Annoter un schéma
Inclure un commentaire structuré
<?xml version="1.0" encoding="UTF-8"?><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:annotation> <s:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2>pistes.xsd</h2> <p>Schema XML pour liste de pistes audio</p> </s:documentation> </s:annotation> <s:element name="Tracks"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="aud:Track"/>
45
Inclure des élémentsspécifiés dans d'autres schémas
Insérer des parties en XHTML dans le catalogue de plantes
<PLANT family="Ranunculaceae">
<COMMON>Anemone</COMMON>
...
<AVAILABILITY>122698</AVAILABILITY>
<xh:div>
<xh:img src="http://.../images/chargimages/121.jpg"
alt="Anemone blanda"/>
Bulbe rustique de la famille des renonculacées<xh:br/><xh:br/>
FEUILLAGE : Feuilles très lobées vert foncé semi érigées<xh:br/>
Le document a deux espaces de noms et deux schémas
46
Solution avec s:import (1/2)
L'espace de noms principal du document est celui de l'élément racine
Le schéma principal est le schéma correspondantIl importe les autres schémas
<?xml version="1.0" encoding="UTF-8"?><!-- plusieursEN.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:jr="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:xh="http://www.w3.org/1999/xhtml"> <s:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"/> <s:element name="CATALOG"> <s:complexType>
47
Solution avec s:import (2/2)
<s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/>(...) <s:element ref="jr:AVAILABILITY"/> <s:element ref="xh:div" minOccurs="0"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType> </s:element>
Déclarer des préfixes pour les espaces de nomsException : l'espace de noms xml, inutile de le déclarer
<s:attribute ref="xml:lang"/>
48
Solution avec s:any (1/2)
Le document cible fait référence aux deux schémasCelui qui correspond à l'élément racine et à son espace de noms
s'applique en premier
<?xml version="1.0" encoding="ISO-8859-1"?><!-- plantCatalogTextAny.xml --><CATALOG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/jardinerie http://igm.univ-mlv.fr/~laporte/xml/schema/plusieursEN-any.xsd http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:xh="http://www.w3.org/1999/xhtml">
<PLANT family="Papaveraceae">
49
Solution avec s:any (2/2)
Le schéma qui s'applique en premier appelle l'autre par s:anys:any ne spécifie pas quel élément peut apparaître
<s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/>(...) <s:element ref="jr:AVAILABILITY"/> <s:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType> </s:element>
50
Variantes
<s:any namespace="##other"/>Le validateur accepte tout espace de noms autre que l'espace de
noms cible, et valide par rapport au schéma correspondant
<s:any namespace="##any"/> ou <s:any/>Le validateur accepte n'importe quel espace de noms (défaut)
<s:any namespace="http://www.w3.org/1999/xhtml" process-contents="lax"/>Le validateur valide seulement si le schéma correspondant à
l'espace de noms est disponible
<s:any process-contents="skip"/>Le validateur saute cette partie
51
<s:anyAttribute>
Permettre n'importe quels attributs
<s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/>(...) <s:element ref="jr:AVAILABILITY"/> </s:sequence> <s:anyAttribute processContents="skip"/> </s:complexType> </s:element>
52
Schémas partiels (1/2)
Laisser des parties non spécifiées
<PLANT family="Ranunculaceae">
<COMMON>Anemone</COMMON>
...
<AVAILABILITY>122698</AVAILABILITY>
<PRESENTATION>
<xh:div>
<xh:img src="http://.../images/chargimages/121.jpg"
alt="Anemone blanda"/>
Bulbe rustique de la famille des renonculacées<xh:br/><xh:br/>
FEUILLAGE : Feuilles très lobées vert foncé semi érigées<xh:br/>
53
Schémas partiels (2/2)
Déclarer un élément sans typeLe validateur saute le contenu de cet élément
<s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/>(...) <s:element ref="jr:AVAILABILITY"/> <s:element ref="jr:PRESENTATION" minOccurs="0"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType>(...) <s:element name="PRESENTATION"/>
54
Inclure des noeuds texte (1/2)
Les plantes contiennent du texte de présentation non structuré
<PLANT family="Ranunculaceae"> <COMMON>Anemone</COMMON> <BOTANICAL>Anemone blanda</BOTANICAL> <ZONE>6</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE unit="dollar">8.86</PRICE> <AVAILABILITY>122698</AVAILABILITY>
Bulbe rustique de la famille des renonculacées. FEUILLAGE : Feuilles très lobées vert foncé semi érigées HAUTEUR : 10 cm FLORAISON : Solitaire, dressée , en coupe aplatie au printemps SOL : Ordinaire bien drainé
55
Inclure des noeuds texte (2/2)
Les plantes contiennent du texte de présentation non structuré
<s:element name="PLANT"> <s:complexType mixed="true"> <s:sequence> <s:element ref="jr:COMMON"/>(...) <s:element ref="jr:AVAILABILITY"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType> </s:element>
Inconvénients : ces noeuds texte peuvent apparaître n'importe où et on ne peut pas contrôler le contenu par des types simples
56
Schéma d'un document ciblesans espace de noms (1/2)
L'élément racine du document cible n'a pas d'espace de noms
Le schéma ne peut valider que des documents sans espace de noms ("schéma caméléon")
Ce n'est pas une bonne pratique<?xml version="1.0" encoding="ISO-8859-1"?><Tracks>
<Track>
<?xml version="1.0" encoding="UTF-8"?><!-- collection-chameleon.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"> <s:element name="Tracks"> <s:complexType>
57
Schéma d'un document ciblesans espace de noms (2/2)
Le document cible peut faire référence au schéma
<?xml version="1.0" encoding="utf-8"?><Tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://igm.univ-mlv.fr/~laporte/xml/schema/collection-chameleon.xsd"> <Track>
58
Document cible partiel (1/2)
On peut valider un document contenant seulement un sous-arbre des documents cibles habituels
Il suffit que l'élément racine ait été déclaré en global
<?xml version="1.0" encoding="utf-8"?><Track xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/audio http://igm.univ-mlv.fr/~laporte/xml/schema/collectionGenres.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album>
59
Document cible partiel (2/2)
L'élément Track a été déclaré en global
<?xml version="1.0" encoding="UTF-8"?><!-- collectionGenres.xsd --><s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Tracks">(...) </s:element> <s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/>
60
Schéma pour plusieurs types de documents
Un schéma unique pour plusieurs types de documents
<s:element name="CATALOG"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:PLANT"/> </s:sequence> </s:complexType> </s:element> <s:element name="INVOICE"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:ITEM"/> </s:sequence> </s:complexType> </s:element>(...)
61
Types complexes (1/3)
s:complexType et s:sequence permettent de spécifier des documents plus complexes que des collections d'entrées
<?xml version="1.0" encoding="utf-8"?><iTunes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/audio http://igm.univ-mlv.fr/~laporte/xml/schema/audio.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Major_Version>1</Major_Version> <Minor_Version>1</Minor_Version> <Application_Version>4.6</Application_Version> <Music_Folder>file://localhost/C:/My%20Music/</Music_Folder> <Library_Persistent_ID>B2BF2C09D305D49C</Library_Persistent_ID> <Tracks> <Track> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name>
62
Types complexes (2/3)
s:complexType et s:sequence peuvent être utilisés récursivement
<s:element name="iTunes"> <s:complexType> <s:sequence> <s:element ref="aud:Major_Version"/>(...) <s:element ref="aud:Tracks"/> </s:sequence> </s:complexType> </s:element> <s:element name="Major_Version" type="s:integer"/>(...) <s:element name="Tracks"> <s:complexType>
63
Types complexes (3/3)
s:sequence représente la concaténation dans un ordre fixe
s:attribute ajoute un attribut
Autres constructeurs de types complexes
s:choice un seul élément pris parmi plusieurs
s:all chaque élément une seule fois, dans
n'importe quel ordre
64
<s:choice>
<s:complexType name="typePLANT"> <s:sequence> <s:element ref="jrd:COMMON"/> <s:element ref="jrd:BOTANICAL"/> <s:element ref="jrd:ZONE"/> <s:element ref="jrd:LIGHT"/> <s:element ref="jrd:PRICE"/> <s:choice> <!-- un parmi les trois --> <s:element ref="jrd:AVAILABILITY"/> <s:element ref="jrd:LATEST-YEAR"/> <s:element ref="jrd:SUGGESTION"/> </s:choice> </s:sequence> </s:complexType>
65
<s:all> (1/6)
<s:complexType name="typePLANT"> <s:all> <!-- les champs dans n'importe quel ordre --> <s:element ref="jrd:COMMON"/> <s:element ref="jrd:BOTANICAL"/> <s:element ref="jrd:ZONE"/> <s:element ref="jrd:LIGHT"/> <s:element ref="jrd:PRICE"/> <s:element ref="jrd:AVAILABILITY"/> </s:all> </s:complexType>
66
<s:all> (2/6)
Restrictions syntaxiques pas de récursivité possible
<s:all> ne peut contenir que des <s:element>
<s:all> ne peut pas apparaître dans un <s:sequence>, <s:choice>, <s:all>
Exemple : on veut que les champs ZONE et LIGHT puissent apparaître dans n'importe quel ordre
67
<s:all> (3/6)
<s:complexType name="typePLANT"> <s:sequence> <s:element ref="jrd:COMMON"/> <s:element ref="jrd:BOTANICAL"/> <s:all> <!-- NE MARCHE PAS --> <s:element ref="jrd:ZONE"/> <s:element ref="jrd:LIGHT"/> </s:all> <s:element ref="jrd:PRICE"/> <s:element ref="jrd:AVAILABILITY"/> </s:sequence> </s:complexType>
68
<s:all> (4/6) <s:complexType name="typePLANT"> <s:sequence> <s:element ref="jrd:COMMON"/> <s:element ref="jrd:BOTANICAL"/> <s:choice> <!-- marche, mais pas très lisible --> <s:sequence> <s:element ref="jrd:ZONE"/> <s:element ref="jrd:LIGHT"/> </s:sequence> <s:sequence> <s:element ref="jrd:LIGHT"/> <s:element ref="jrd:ZONE"/> </s:sequence> </s:choice> <s:element ref="jrd:PRICE"/> <s:element ref="jrd:AVAILABILITY"/> </s:sequence> </s:complexType>
69
<s:all> (5/6)
Si on veut que ZONE, LIGHT et PRICE apparaissent dans n'importe quel ordre, <s:choice> ne marche pas
- Choix entre 6 séquences de 3 éléments
Illisible !
- Trop difficile pour le validateur
Message d'erreur du validateur :
non-deterministic content model
Contrainte sur l'écriture des schémas XML :
lors de l'analyse syntaxique d'un document cible, la correspondance avec le schéma doit pouvoir se faire de façon déterministe sans connaître les éléments qui suivent celui en train d'être analysé
70
<s:all> (6/6)
Solution : modifier la conception des documents ciblesExemple : insérer un élément conteneur
<PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</BOTANICAL> <PRACTICAL>
<ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE unit="euro">2.44</PRICE>
</PRACTICAL><AVAILABILITY>031599</AVAILABILITY>
</PLANT>