1 Cours 5 Introduction aux schémas XML Éric Laporte Institut Gaspard-Monge Université Paris-Est...

Preview:

Citation preview

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>

Recommended