Cours Définir la grammaire pour une instance de document XML
Site: | PLATEFORME DE MUTUALISATION DES ENSEIGNEMENTS TRANSVERSAUX |
Cours: | L3 D2A : Technologies XML |
Livre: | Cours Définir la grammaire pour une instance de document XML |
Imprimé par: | Visiteur anonyme |
Date: | jeudi 30 janvier 2025, 21:04 |
Description
Descriptif
Table des matières
- 1. Document XML bien formé
- 2. Structure logique et Structure physique
- 3. Validation d’un document XML avec les DTD ou XMLSchéma
- 3.1. Présentation des DTD
- 3.2. Déclaration d’attributs avec les DTD
- 3.3. Déclaration d’éléments avec les DTD
- 3.4. Lier un document XML avec sa DTD
- 3.5. Exemple pratique
- 3.6. Présentation de XMLSchéma
- 3.7. Déclaration d’éléments simples avec les XMLSchéma
- 3.8. Déclaration d'éléments complexes avec XMLSchéma
- 3.9. Déclaration d’attributs avec les XMLSchéma
- 3.10. Exemples
1. Document XML bien formé
Toute instance de document XML doit obligatoirement être bien formée, c'est à dire:
-
Le document doit avoir un seul élément (balise ou tag) racine. En d'autres termes, une balise qui doit contenir l'ensembles des autres balises.
-
Toute balise ouvrante doit avoir une balise de fermeture correspondante. Faites attention avec les balises vides qui, elles s'écrivent comme suit: <nom_de_la_balise />.
-
Les balises doivent être correctement imbriquées.
-
les noms des balises ne doivent pas commencer par "xml".
-
Les noms des balises doivent commencer par une lettre ou le caractère "_" et le reste peut être constitué de lettre, et/ou de chiffres, et/ou du caractère "_", et/ou du caractère "-" et/ou du caractère ".".
-
Les valeurs associées aux attributs doivent être encadrées par des simples quotes ou des des doubles quotes. <etudiant numero="2016O4FTG"></etudiant>
Remarque: Il faut faire la différence entre un document XLM bien formé d'un document XML valide que nous verrons dans le prochain chapitre.
2. Structure logique et Structure physique
Pour bien comprendre et exploiter un document XML, nous pouvons le représenter sous forme de deux structures: une structure physique et une structure logique.
Ces deux structures décrivent le document en montrant les relations qui existent entre les différents éléments qui composent le vocabulaire du document XML.
2.1. Structure logique d'un document XML
La structure logique d’un document XML est une arborescence d’informations obtenue par un processeur XML à partir d’un contenu physique constitué d’une simple suite linéaire de caractères Unicode.
Elle est hiérarchique et ordonnée et permet de bien comprendre comment les éléments qui constituent le vocabulaire du document sont liés.
2.2. Structure physique d'un document XML
Physiquement, un document XML est un fichier sur disque et peut être constitué d'un seul bloc d'informations et/ou de l'assemblage de plusieurs unités physiques existant séparément et appelé entité.
Exemple:
<?xml version="1.0" encoding="ISO-8859-1"?>
<etudiant>
<nom>GAYE</nom>
<prenom>Moussa</prenom>
<adresse>Bambey</adresse>
<age>18</age>
</etudiant>
3. Validation d’un document XML avec les DTD ou XMLSchéma
XML est un langage extensible et qui permet à chacun de créer ses propres balises. Ces documents pouvant être partagés entre applications doivent être normés fixant les noms d'éléments et d'attributs utilisables ainsi que les relations (degrés d'imbrication) qui existent entre eux.
La technologie DTD et la technologie XMLSchéma seront utilisées pour définir et valider une instance de document XML.
Il faut faire la différence entre un document XML valide d'un document bien formé. La validité est toujours définie en fonction de la DTD ou du document XMLSchéma auquel l'instance est liée.
3.1. Présentation des DTD
Les DTD pour Document Type Definition ou Document Type Declaration sont un ensemble de règles qui régissent le comportement d'une instance de document XML auquel ils sont liés.
Les DTD permettent de définir l'ensemble des noms d'élément et d'attributs utilisables dans une instance de document XML et les liens qui existent entre ces différents élément et/ou attributs.
Elles peuvent être définies en interne, c'est à dire à l'intérieur de l'instance XML, on parle dans ce cas de DTD interne ou dans un fichier séparé auquel cas, on parle de DTD externe.
3.2. Déclaration d’attributs avec les DTD
Tout comme en HTML où les balises peuvent avoir des attributs (comme par exemple la balise BODY avec ses attributs bgcolor, background etc.), il est possible avec les DTD de définir des attributs pour les éléments en XML.
La syntaxe pour définir un attribut est la suivante:
<!ATTLIST NOM_ELEMENT NOM_ATTRIBUT type_attribut défaut>
NOM_ELEMENT désigne le nom de l'élément contenant l'attribut.
NOM_ATTRIBUT: désigne le nom de l'attribut à déclarer.
Type d'attributs peut prendre les valeurs suivantes:
- CDATA : chaîne de caractères prise telle quelle
- ID : Les valeurs de l'attribut sont uniques
- IDREF : l'attribut fait référence à un attribut de type ID
- NMTOKEN : noms symboliques formés de caractères alphanumériques sans espace
Valeur par défaut des attributs:
- #REQUIRED : l'attribut est obligatoirement présent et la valeur spécifiée par le créateur de l'instance
- #IMPLIED : la présence de l'attribut est facultative
- #FIXED "Valeur" : l'attribut prend toujours cette valeur
Exemple:
Pour déclarer un attribut numero pour un élément personne de type ID et obligatoire, on fait:
<!ATTLIST personne numero ID #REQUIRED>
Pour déclarer les attributs nom de type chaîne de caractère et obligatoire et prenom de type chaîne de caractère optionel d'un élément personne, on fait:
<!ATTLIST personne nom CDATA #REQUIRED prenom CDATA #IMPLIED>
3.3. Déclaration d’éléments avec les DTD
La déclaration d'un élément avec les DTD se fait grâce à la syntaxe suivante:
<!ELEMENT balise valeur>
En fonction de la nature de l'élément (simple ou complexe), valeur peut être une combinaison d'éléments ou simplement une chaîne de caractère.
Pour un élément simple, c'est-à-dire un élément ne pouvant pas contenir de sous-éléments, valeur est égale à (#PCDATA).
Exemple: pour déclarer un élément NOM de type chaîne de caractère, on fait:
<!ELEMENT NOM (#PCDATA)>
Pour un élément complexe, c'est-à-dire un élément pouvant contenir des sous-éléments, nous pouvons avoir plusieurs cas en fonction de la disposition des sous-éléments.
<!ELEMENT balise (sous_balise1, sous_balise2, sous_balise3)>: dans une telle disposition, l'élément balise est constitué d'une seule séquence d'éléments sous_balise1, sous_balise2 et sous_balise3, tous obligatoires et dans l'ordre spécifié.
<!ELEMENT balise (sous_balise1|sous_balise2|sous_balise3)>: dans cette disposition, l'élément balise est constitué exclusivement d'un élément sous_balise1 ou d'un élément sous_balise2 ou d'un élément sous_balise3.
Il existe également des indicateurs d'occurrence, que sont:
? : placé devant un élément ou une séquence d'éléments, le (la) rend optionnel (le)
* : placé devant un élément ou une séquence d'éléments, le(la) rend optionnel (le), mais aussi, l'élément ou la séquence peut être répété(e) plusieurs fois.
+ : placé devant un élément ou une séquence d'éléments, le(la) rend obligatoire et en même temps autorise la répétition de l'élément ou de la séquence plusieurs fois.
Si par contre, le (* ou +) est placé après une liste de choix comme par exemple <!ELEMENT balise (sous_balise1|sous_balise2|sous_balise3)+>, cela signifie que les sous-éléments peuvent tous apparaître dans l'élément balise dans n'importe quel ordre et peuvent tous être répéter.
3.4. Lier un document XML avec sa DTD
Il existe deux manières de lier une DTD à une instance de document XML.
DTD interne: la déclaration de la DTD est faite dans DOCTYPE et est placée après la déclaration XML. L'attribut standalone prendra la valeur "yes", ce qui veut dire que le document s'auto-suffit pour sa validation.
La syntaxe pour lier une DTD avec une instance est la suivante:
<!DOCTYPE elt_racine [déclarations]>
<elt_racine>
<!-- le contenu du documen XML -->
</elt_racine>
où elt_racine représente l'élément racine et dans les crochets entourant "déclaration", on mettra l'ensemble des déclaration d'éléments et attributs.
DTD externe: dans ce cas, les déclarations sont placées dans un fichier séparé et l'attribut standalone prendra la valeur "no", ce qui veut dire que la validité de l'instance dépend d'un autre fichier.
La syntaxe pour lier une DTD externe à une instance de document est la suivante:
<!DOCTYPE elt_racine SYSTEM "uri">
où elt_racine désigne l'élément racine et "uri" représente l'adresse (chemin) du fichier DTD. cette ligne est placée juste après la déclaration XML.
3.5. Exemple pratique
Enoncé: Soit une base de données contenant la liste des clients d'une entreprise et des commandes. On suppose que chaque client est caractérisé par un numero unique et dans l'ordre par un nom, un prénom et une adresse. L'adresse est composée d'une séquence de ville et de rue. Une commande est caractérisée par un numéro unique, une date et le numéro du client qui l'a passée. Les clients et les commandes peuvent être stockés dans n'importe quel ordre.
Proposition de DTD: (fichier bd_ent.dtd)
<!ELEMENT bd_entreprise (client | commande)*>
<!ELEMENT client (nom, prenom, adresse)>
<!ELEMENT commande (date)>
<!ELEMENT adresse (ville, rue)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT ville (#PCDATA)>
<!ELEMENT rue (#PCDATA)>
<!ATTLIST client numero_client ID #REQUIRED>
<!ATTLIST commande numero_com ID #REQUIRED numero_client IDREF #REQUIRED>
Exemple d'instance:
<?xml version="1.0" encoding="UTF-8"? standalone="no">
<!DOCTYPE bd_entreprise SYSTEM "bd_ent.dtd">
<bd_entreprise>
<client numero="RF2003">
<nom>Dieye</nom>
<prenom>Ndiogou</prenom>
<adresse>
<ville>Médina</ville>
<rue>25</rue>
</adresse>
</client>
<commande numero_com="COM20" numero_client="RF2003">20/03/2015</commande>
</bd_entreprise>
3.6. Présentation de XMLSchéma
Tout comme les DTD, XMLSchéma est une technologie permettant de définir le comportement d'une instance de document XML. Ainsi, XMLSchéma définit les éléments et les attributs utilisables dans une instance de document XML, mais aussi les relations qui existent entre ces différents éléments.
Mais contrairement aux DTD, qui utilisent leurs propres technologies pour définir le "vocabulaire" et la "grammaire" d'une instance, XMLSchéma est tout d'abords un document XML. Par conséquent, on aura un document XML qui valide un autre document XML, on parle dans ce cas, de méta-données pour les éléments constituant un document XMLSchéma.
Comme tout document XML, un Schema XML commence par un prologue, et a un élément racine.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
<!-- déclarations d'éléments, d'attributs et de types ici -->
</xsd:schema>
3.7. Déclaration d’éléments simples avec les XMLSchéma
La déclaration d'un élément en XMLSchéma se fait avec la balise <xsd:element>. La syntaxe de déclaration d'un élément est la suivante:
<xsd:element name="NOM_ELEMENT" type="TYPE_ELEMENT" />.
En fonction de la nature de l'élément (simple ou complexe), nous pouvons avoir plusieurs cas.
1. Pour un élément simple sans restrection:
<xsd:element name="remarque" type="xsd:string" />: ici, on déclare un élément qui a pour nom remarque et dont le type est "chaîne de caractère".
2. Pour un élément simple avec restriction, nous pouvons avoir plusieurs cas:
2. a): élément dont les valeurs sont fixées sur une intervalle.
Exemple: si on veut déclarer un élément "note" dont les valeurs sont comprises entre 0 et 20, on fait:
<xsd:element name="note">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="20"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
2.b) Type énuméré: élément dont les valeurs possibles sont précisées
Exemple: si on veut déclarer un élément "réponse" dont les seules valeurs possibles sont "vrai" ou "faux"
<xsd:element name="reponse">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="vrai"/>
<xsd:enumeration value="faux"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
2.c) Type énuméré avec patern
Exemple: pour déclarer un élément "année" dont les valeurs possibles sont 1999, 2000, 2001 ou 2002
<xsd:element name="annee">
<xsd:simpleType >
<xsd:restriction base="xs:integer">
<xsd:pattern value="1999"/>
<xsd:pattern value="2000"/>
<xsd:pattern value="2001"/>
<xsd:pattern value="2002"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
On peut aussi:
<xsd:element name="annee">
<xsd:simpleType >
<xsd:restriction base="xs:integer">
<xsd:pattern value="1999|2000|2001|2002"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
On peut aussi:
<xsd:element name="annee">
<xsd:simpleType >
<xsd:restriction base="xs:integer">
<xsd:pattern value="1999|200[0-2]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
2. d) On peut aussi faire des restrictions sur la longueur des éléments. Par exemple si on veut fixer la taille d'un élément "password" à 5, on peut:
<xsd:element name="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:length value="5"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
2. e) On peut fixer la longueur d'un élément entre deux valeurs. Par exemple, si on veut que la longueur de l'élément "password" soit comprise entre 5 et 12, on peut:
<xsd:elementname="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="5"/>
<xsd:maxLength value="12"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
3.8. Déclaration d'éléments complexes avec XMLSchéma
INous avons principalement quatre types d'éléments complexes
-
Elément vide (généralement avec un attribut): Pour déclarer un tel type d'élément avec son attibut, on utilise la syntaxe suivante:
<xsd:element name="NOM_ELEMENT">
<xsd:complexType>
<xsd:attribute name="NOM_ATTRIBUT" type="xsd:ID"/>
</xsd:complexType>
</xsd:element>
-
Element contenant uniquement des sous-éléments: Pour un tel type d'élément, nous utilisons la syntaxe suivante:
<xsd:element name="NOM_ELEMENT">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PREM_SOUS_ELT" type="xsd:string"/>
<xsd:element name="DEUX_SOUS_ELT" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
-
Element pouvant contenir du texte et des attributs: pour un tel type d'élément, nous utilisons la syntaxe suivante:
<xsd:element name="NOM_ELEMENT">
<xsd:complexType mixed="true">
<xsd:attribute name="NOM_ATTRIBUT" use="required" type="xsd:ID"/>
</xsd:complexType>
</xsd:element>
- Element pouvant contenir n'importe quel type d'informations:C'est un élément pour lequel, le type est égal à ANY.
Indicateurs d'occurrences: On peut indiquer pour un élément, le nombre minimum ou maximum de fois qu'on peut l'avoir avec les indicateurs d'occurrences minOccurs et maxOccurs.
Exemple, si on veut pour un élément livre, imposer un élément titre et obligatoirement au moins un chapitre avec possibilité d'en avoir plusieurs.
<xsd:element name="livre">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="titre" type="xsd:string"/>
<xsd:element name="chapitre" type="xsd:string" maxOccurs="unbounded" minOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Indicateur d'ordre: On peut fixer pour un élément complexe, l'ordre dans lequel ses sous-éléments doivent apparaître avec ALL, SEQUENCE ou CHOICE.
ALL: Cet indicateur spécifie que les sous-élément peuvent apparaître dans n'importe quel ordre, et se produisent une seule fois dans l'élément qui les contient.
Exemple: si nous avons un élément personne caractérisé par son nom et son prénom et que tous les deux sont obligatoires et peuvent apparaître dans n'importe quel ordre, nous obtenons la description suivante:
<xsd:element name="personne">
<xsd:complexType>
<xsd:all>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="prenom" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
SEQUENCE: Cet indicateur spécifie que les sous-éléments doivent apparaître dans l'ordre spécifié.
Exemple: Si la personne est caractérisée par son nom et son prénom et qu'on veuille imposer l'ordre dans lequel le nom et le prénom doivent apparaître, on fera:
<xsd:element name="personne">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="prenom" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element
CHOICE: Il indique qu’on ne peut avoir qu’un élément fils parmi les éléments fils qui peuvent être produits.
Exemple: dans le cas où nous avons un élément matière ne pouvant prendre que trois états: liquide, solide ou gaz, on peut le représenter par:
<xsd:element name="matiere">
<xsd:complexType>
<xsd:choice>
<xsd:element name="liquide" type="xsd:string"/>
<xsd:element name="solide" type="xsd:string"/>
<xsd:element name="gaz" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
</xsd:element
Remarque: Les indicateurs d'ordre SEQUENCE et CHOICE peuvent avoir des attributs minOccurs et maxOccurs. Lorsque l'indicateur d'occurrence SEQUENCE dispose de ces deux attributs, cela signifie que la séquence peut être répétée au minimum le nombre de fois que minOccurs aura comme valeur et au maximum le nombre de fois que maxOccurs prendra comme valeur.
Lorsque ces indicateurs sont mis mis dans un élément CHOICE avec au moins un minOccurs prenant la valeur 2, cela indique que les sous éléments peuvent apparaître autant fois et dans n'importe quel ordre.
3.9. Déclaration d’attributs avec les XMLSchéma
Contrairement aux éléments, un attribut ne peut être que de type simple. De plus, les déclarations d'attributs doivent être placées après les définitions des types complexes.
Un exemple de déclaration d'attribut "identifiant" pour un élément "personne" peut être illustré comme suit:
<xsd:element name="personne">
<xsd:complexType>
<xsd:attribute name="identifiant" type="xsd:ID" />
</xsd:complexType>
</xsd:element>
Les attributs peuvent être de type chaîne de caractères (xsd:string), entier(xsd:integer), de trype ID (xsd:ID), de type IDREF (xsd:IDREF) etc.
3.10. Exemples
Contenu correspondant