Vous êtes sur la page 1sur 9

DTD et schmas e

Fabrice Rossi 26 janvier 2003

Instructions spciques au CRIO UNIX e


1. dans chaque terminal, utilisez tcsh (en tapant tcsh) 2. eectuez les rglages ncessaires au bon fonctionnement des dirents programmes utiliss, en tapant e e e e source /home/perm/ufrmd/rossi/xml/env.csh

Au dbut de chaque sance : e e

On valide un document en utilisant les commandes suivantes : validate fichier pour valider le fichier par rapport a une DTD ou un schma W3C ` e validate-ng schma fichier pour valider le fichier par rapport a un schma RELAX NG e ` e Dans les deux cas, le programme ache uniquement des messages derreur. Labsence dachage indique donc que le chier tudi est valide. e e Pour lexercice 3.3, on utilisera les commandes suivantes : validate-ng-type schma fichier jar qui valide le fichier par rapport a un schma RELAX NG e ` e en utilisant la biblioth`que de types contenue dans le jar e compile-ng fichiers qui compile un ensemble de chiers en donnant acc`s aux interfaces et classes e ncessaires a limplantation dune biblioth`que de types e ` e

DTD
On souhaite reprsenter un carnet dadresses en XML. Pour chaque entre du carnet, on veut conserver e e les informations suivantes : nom et prnom de la personne e adresse (ventuellement en dehors de France) e numro de tlphone (ventuellement plusieurs) e ee e adresse mail (ventuellement plusieurs) e date danniversaire Questions : 1. Ecrire une DTD pour le carnet dadresses. 2. Ecrire un chier valide pour cette DTD, comportant au moins deux entres et faisant appara e tre toutes les possibilits de la DTD (cest-`-dire toutes les valeurs possibles pour les attributs et tous e a les lments et attributs optionnels). ee

Exercice 2.1

Exercice 2.2 On souhaite donner une version plus professionnelle du carnet dadresses de lexercice 2.1. Pour chaque entre du carnet, on conserve les informations suivantes : e nom et prnom de la personne e numro de tlphone (ventuellement plusieurs) e ee e adresse mail (ventuellement plusieurs) e service F. Rossi 26 janvier 2003 p. 1

XML

DTD et Schmas e

entreprise (avec le site) Ladresse de chaque contact est celle de son entreprise. Le chier XML doit donc contenir, pour chaque entreprise, les informations suivantes : nom une liste de sites, avec pour chaque site : nom du site adresse du site Pour viter la redondance dans le chier, le lien entre une personne et le site de lentreprise pour laquelle e elle travaille est obtenu grce a une rfrence croise. a ` ee e Questions : 1. Ecrire une DTD pour la nouvelle version du carnet. 2. Ecrire un chier valide pour cette DTD, comportant au moins une entreprise a deux sites et au moins ` deux personnes (une pour chaque site).

Schmas RELAX NG e
On souhaite reprsenter la structure dune entreprise sous forme dun chier XML. Ce chier sera organis e e sous la forme dune liste demploys. Pour chaque employ, on indique : e e son nom et son prnom e son bureau son titre (ventuellement, comme par exemple directeur commercial) e la liste de ses subordonns e Comme dans lexercice 2.2, on souhaite au maximum viter la redondance, au moyen de rfrences croises. e ee e Questions : 1. Proposer une DTD pour la structure dentreprise. 2. Pour utiliser les types de contenu ID, IDREF et IDREFS avec RELAX NG, il faut passer par la biblioth`que de types http://relaxng.org/ns/compatibility/datatypes/1.0. Grce a cette bie a ` blioth`que, proposer un schma RELAX NG pour la structure. e e 3. Ecrire un chier dexemple valide pour le schma (avec au minimum 4 employs et une structure non e e triviale). 4. La structure hirarchique de lentreprise induit des contraintes quon ne peut pas traduire par line termdiaire du schma (ou de la DTD). En dautres termes, on peut crire un chier XML valide qui e e e na pas de sens pratique. Donner un exemple dun tel chier. 5. Proposer un nouveau schma RELAX NG nutilisant pas de rfrence croise et permettant de repre ee e e senter une structure dentreprise arborescente (i.e., chaque employ est le subordonn dun seul autre e e employ, except le PDG). Donner un exemple de structure plausible quon ne peut pas reprsenter e e e avec ce nouveau schma mais qui ne pose pas de probl`me avec lancien. e e

Exercice 3.1

Exercice 3.2 On souhaite reprsenter des expressions mathmatiques simples dans un format XML proche de celui de e e MathML (un standard du W3C). Les principes du format propos sont les suivants : e on reprsente une valeur numrique comme le contenu dun lment cn. Par exemple <cn>15.2</cn> e e ee une opration est reprsente par un lment apply. En gnral llment contient trois sous-lments. e e e ee e e ee ee Le premier sous-lment est vide et reprsente lopration a raliser. Les deux autres lments sont les ee e e ` e ee oprandes de lopration. Par exemple, 2+3 scrit : <apply><plus/><cn>2</cn><cn>3</cn></apply>. e e e La gure 1 reprsente larbre correspondant. e on propose les oprateurs suivants : e plus : addition

F. Rossi 26 janvier 2003

p. 2

XML

DTD et Schmas e

apply

plus

cn

cn

Fig. 1 Arbre XML de lexpression 2 + 3 reprsente en MathML e e times : multiplication divide : division minus : soustraction quotient : division enti`re e rem : reste de la division euclidienne power : exponentiation Tous les oprateurs sont binaires sauf la soustraction qui peut aussi tre unaire et reprsenter alors le e e e changement de signe. un lment apply peut contenir un ou deux lments apply comme oprande(s). Cette inclusion joue ee ee e le rle de parenth`ses. Par exemple, pour reprsenter (2 + 3) 4, on crit : o e e e equation1.xml 1 <apply> 2 <times/> 3 <apply> 4 <plus/> 5 <cn>2</cn> 6 <cn>3</cn> 7 </apply> 8 <cn>4</cn> 9 </apply>

apply

times

apply

cn

plus

cn

cn

Fig. 2 Arbre XML de lexpression (2 + 3) 4 reprsente en MathML e e

F. Rossi 26 janvier 2003

p. 3

XML

DTD et Schmas e

La gure 2 reprsente la structure logique correspondant a cette deuxi`mte expression. Malgr la relative e ` e e complexit de larbre obtenu, celui-ci reste assez proche de larbre quon peut dduire naturellement de e e lexpression mathmatique, reprsent par la gure 3. e e e

Fig. 3 Arbre mathmatique de lexpression (2 + 3) 4 e

Questions : 1. Ecrire un schma RELAX NG pour le dialecte XML propos. e e 2. Modier le schma obtenu en utilisant les types des schmas W3C pour introduire une contrainte e e supplmentaire sur le contenu des lments. e ee Exercice 3.3 Le validateur RELAX NG Jing permet au concepteur dun schma dajouter des contraintes sur le contenu e dun document grce a des classes de validation crites en Java. Pour ce faire, le concepteur doit produire a ` e un chier jar contenant : les chiers class qui implantent les interfaces suivantes : DatatypeLibraryFactory : assure la cration dune biblioth`que de types (` partir dun URI) e e a DatatypeLibrary : reprsente la biblioth`que de types e e DatatypeBuilder : assure la cration dun type (en tenant compte des param`tres associs) e e e Datatype : reprsente un type. Cest linterface la plus importante qui est utilise pour valider la e e conformit contenu du lment ou dun attribut. e ee un dossier META-INF contenant un dossier services contenant lui-mme un chier e org.relaxng.datatype.DatatypeLibraryFactory dont la premi`re ligne contient le nom de la e classe qui implante DatatypeLibraryFactory. Voici un exemple de programmation dun nouveau type. On commence par implanter lusine qui se contente de crer une DatatypeLibrary si lURI quon lui propose correspond bien a lURI associe a la e ` e ` biblioth`que programme : e e
1 2 3 4 5 6 7 8 9 10 11 12

iup/app/IupDLF package iup.app; import org.relaxng.datatype.DatatypeLibraryFactory; import org.relaxng.datatype.DatatypeLibrary; public class IupDLF implements DatatypeLibraryFactory { public DatatypeLibrary createDatatypeLibrary(String namespaceURI) { // on reconna^t un ou plusieurs URI if(namespaceURI.equals("http://apiacoa.org/teaching/xml/RelaxDataTypes")) { return new IupDL(); } return null; } }

F. Rossi 26 janvier 2003

p. 4

XML

DTD et Schmas e

La biblioth`que est implante de faon basique car on ne g`re quun seul type qui de surcro nutilise pas e e c e t de param`tres : e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

iup/app/IupDL package iup.app; import org.relaxng.datatype.*; import org.relaxng.datatype.helpers.ParameterlessDatatypeBuilder; public class IupDL implements DatatypeLibrary { public DatatypeBuilder createDatatypeBuilder(String baseTypeLocalName) throws DatatypeException { // pour linstant, on fabrique des types qui nutilisent pas de // param`tres e return new ParameterlessDatatypeBuilder(createDatatype(baseTypeLocalName)); } public Datatype createDatatype(String baseTypeLocalName) throws DatatypeException { // on ne g`re quun seul type dans cette biblioth`que dexemple e e if(baseTypeLocalName.equals("telephone")) { return new TypeTelephone(); } else { throw new DatatypeException(); } } } Le seul type propos correspond a un mod`le de contenu tr`s strict : un numro de tlphone a dix chires e ` e e e ee ` reprsent sous forme de 5 blocs de deux chires spars par un espace : e e e e

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

iup/app/TypeTelephone package iup.app; import org.relaxng.datatype.*; import org.relaxng.datatype.helpers.StreamingValidatorImpl; public class TypeTelephone implements Datatype { public boolean isValid(String literal, ValidationContext context) { // la mthode principale e // 66 66 66 66 66 if(literal.length()!=14) return false; for(int i=0;i<5;i++) { int j=3*i; if(!Character.isDigit(literal.charAt(j))) return false; if(!Character.isDigit(literal.charAt(j+1))) return false; if(i>=4) break; if(literal.charAt(j+2)!= ) return false; } return true; } // mthodes assez techniques sans intr^t en premi`re approche e e e e public DatatypeStreamingValidator createStreamingValidator(ValidationContext context) { return new StreamingValidatorImpl(this, context); } public Object createValue(String literal, ValidationContext context) { if (!isValid(literal, context)) return null; return literal;

F. Rossi 26 janvier 2003

p. 5

XML } public boolean sameValue(Object obj1, Object obj2) { return obj1.equals(obj2); } public int valueHashCode(Object obj) { return obj.hashCode(); } public int getIdType() { return ID_TYPE_NULL; } public boolean isContextDependent() { return false; } public void checkValid(String literal, ValidationContext context) throws DatatypeException { if (!isValid(literal, context)) throw new DatatypeException(); } }

DTD et Schmas e

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

Le chier org.relaxng.datatype.DatatypeLibraryFactory contient lunique ligne iup.app.IupDLF. Voici maintenant un exemple dutilisation du type propos dans un schma RELAX NG : e e
1 2 3 4 5 6 7 8 9 10

telephone.rng <?xml version="1.0" encoding="ISO-8859-1"?> <element name="root" xmlns="http://relaxng.org/ns/structure/1.0"> <oneOrMore> <element name="tel" datatypeLibrary="http://apiacoa.org/teaching/xml/RelaxDataTypes"> <data type="telephone"/> </element> </oneOrMore> </element> Voici un chier non valide (` cause du deuxi`me numro de tlphone) : a e e ee

1 2 3 4 5

telephone.xml <?xml version="1.0" encoding="ISO-8859-1"?> <root> <tel>01 02 03 04 05</tel> <tel>01-02-03-04-05</tel> </root> Questions : Pour chaque question, on testera le rsultat sur au moins un couple schma/chier XML. e e 1. Modier TypeTelephone.java an de proposer une validation plus souple, cest-`-dire autoriser un a nombre arbitraire despaces entre les chires dun numro (ainsi quavant et apr`s le numro). e e e 2. Ajouter a la biblioth`que de types donne en exemple un type TypeCodePostal qui correspond aux ` e e codes postaux franais (on ne demande pas bien entendu un type parfait, mais au moins une validation c des dpartements). e 3. Ajouter a la biblioth`que de types un type TypeSalleDauphine qui correspond aux numros des ` e e salles a Dauphine. Pour mmoire, il y a 7 tages et 5 zones (A, B, C, D et P), avec seulement 6 ` e e tages pour toutes les zones sauf A. Comme dans la question prcdente, on veut obtenir une base e e e de validation, pas une validation parfaite. F. Rossi 26 janvier 2003 p. 6

XML

DTD et Schmas e

4. Pour prendre en compte des param`tres pour les types, on passe par lintermdiaire dune implane e tation dun DatatypeBuilder. Par exemple, on modie lexemple du tlphone pour autoriser un ee nombre quelconque de blocs de 2 chires. On commence par modier TypeTelephone an de prendre en compte un nombre de blocs (on ne donne ici que le dbut de la classe, le reste ntant pas modi) : e e e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

iup/app/TypeTelephone package iup.app; import org.relaxng.datatype.*; import org.relaxng.datatype.helpers.StreamingValidatorImpl; public class TypeTelephone implements Datatype { private int nbBlocs; public TypeTelephone(int nb) { nbBlocs=nb; } public boolean isValid(String literal, ValidationContext context) { if(literal.length()!=3*nbBlocs-1) return false; for(int i=0;i<nbBlocs;i++) { int j=3*i; if(!Character.isDigit(literal.charAt(j))) return false; if(!Character.isDigit(literal.charAt(j+1))) return false; if(i>=nbBlocs-1) break; if(literal.charAt(j+2)!= ) return false; } return true; } // suite identique Ensuite, on construit un DatatypeBuilder :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

iup/app/TypeTelephoneBuilder package iup.app; import org.relaxng.datatype.*; public class TypeTelephoneBuilder implements DatatypeBuilder { private int nb=5; public void addParameter(String name,String strValue, ValidationContext context) throws DatatypeException { // name -> nom du param`tre e // strValue -> valeur du param`tre e if(name.equals("nbBlocs")) { try { nb=Integer.parseInt(strValue); if (nb<=0) throw new DatatypeException(); } catch (NumberFormatException e) { throw new DatatypeException(); } } else { throw new DatatypeException(); } } public Datatype createDatatype() throws DatatypeException { return new TypeTelephone(nb); } } On termine en modiant la DatatypeLibrary :

F. Rossi 26 janvier 2003

p. 7

XML

DTD et Schmas e

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

iup/app/IupDL package iup.app; import org.relaxng.datatype.*; import org.relaxng.datatype.helpers.ParameterlessDatatypeBuilder; public class IupDL implements DatatypeLibrary { public DatatypeBuilder createDatatypeBuilder(String baseTypeLocalName) throws DatatypeException { if(baseTypeLocalName.equals("telephone")) { return new TypeTelephoneBuilder(); } else { throw new DatatypeException(); } } public Datatype createDatatype(String baseTypeLocalName) throws DatatypeException { return createDatatypeBuilder(baseTypeLocalName).createDatatype(); } } Voici maintenant un exemple dutilisation du type propos dans un schma RELAX NG : e e

1 2 3 4 5 6 7 8 9 10 11 12

telephone2.rng <?xml version="1.0" encoding="ISO-8859-1"?> <element name="root" xmlns="http://relaxng.org/ns/structure/1.0"> <oneOrMore> <element name="tel" datatypeLibrary="http://apiacoa.org/teaching/xml/RelaxDataTypes"> <data type="telephone"> <param name="nbBlocs">4</param> </data> </element> </oneOrMore> </element> Voici un chier non valide (` cause du deuxi`me numro de tlphone) : a e e ee

1 2 3 4 5

telephone2.xml <?xml version="1.0" encoding="ISO-8859-1"?> <root> <tel>01 02 03 04</tel> <tel>01 02 03 04 05</tel> </root> En utilisant le mcanisme propos, modier le type TypeTelephone pour permettre le choix du e e nombre de chires ainsi que celui des sparateurs autoriss entre les chires (en plus de lespace). La e e validation se fera de faon souple, cest-`-dire comme a la question 1. c a `

5. Ajouter a la biblioth`que de types un type TypeEntier qui correspond a un contenu entier. On ` e ` proposera deux param`tres facultatifs permettant de rduire lintervalle autoris pour les valeurs e e e enti`res (un param`tre min et un param`tre max). e e e 6. Ajouter a la biblioth`que de types un type ListeFichier qui correspond a un texte choisi dans ` e ` une liste de textes contenue dans un chier. Plus prcisment, le type est associ a un param`tre e e e` e obligatoire (file) qui donne le nom dun chier. Le validateur doit lire le chier (qui contient un texte autoris par ligne) et vrier que le contenu de llment ou de lattribut est bien dans la liste e e ee des textes autoriss. Il est tr`s vivement conseill de faire la lecture une seule fois au moment de la e e e cration du type (des stratgies plus volues de cache sont dailleurs possibles). e e e e

F. Rossi 26 janvier 2003

p. 8

XML

DTD et Schmas e

Schmas W3C e
On souhaite reprsenter un emploi du temps sous forme de chier XML. Pour chaque plage de temps e occupe, on souhaite conserver les informations suivantes : e description date et horaires lieu catgorie e De plus, on souhaite grer les rptitions sans redondance dans le chier, cest-`-dire en associant a un e e e a ` v`nement une liste de dates au lieu dune seule date. Pour compresser une telle liste, on souhaite pouvoir e e indiquer quun v`nement se rp`te un certain nombre de fois, dune date a une autre, etc., en tenant e e e e ` compte aussi dexceptions a une r`gle simple (par exemple tous les jeudis de telle date a telle autre, sauf ` e ` le jeudi tant). Questions : 1. Donner un schma W3C pour le format propos. e e 2. Donner un chier XML qui illustre toutes les possibilits du dialecte propos. e e

Exercice 4.1

F. Rossi 26 janvier 2003

p. 9

Vous aimerez peut-être aussi