Modèle
1. Expressions des modèles
Un modèle est un fomalisme qui définit des contraintes pour un ensemble de documents. Il peut s’exprimer de différentes façon.
Un modèle de document permet d’uniformiser un cadre d’expression au sein d’une communauté : documentaliste (RDF), généalogiste, journaliste (NITF, NewsML), chimiste (CML), etc.
|
On peut faire un parallèle avec la programmation objet :
De même, on voit apparaître deux types d’acteurs :
|
Le modèle fixe donc la structure des documents. Il existe différents langages pour l’exprimer :
-
la DTD,
-
XML Schema
-
RelaxNG, etc.
Le modèle d’un document permet d’en fixer :
-
le vocabulaire (c’est-à-dire les balises et attributs utilisables)
-
la grammaire (les règles d’imbrication, etc.)
Un document XML associé à un modèle est dit valide :
-
s’il est bien formé, et
-
s’il respecte les spécifications de son modèle.
2. DTD
Une DTD (Document Type Definition) est une liste de déclarations définissant la structure des documents qui s’y conforment. Elle doit être déclarée au début des documents, avant l’élément racine.
2.1. Interne ou externe
La DTD peut être définie dans le document XML :
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE personne [
<!--début de la DTD interne -->
<!ELEMENT personne (prenom, nom)>
<!ELEMENT prenom (\#PCDATA)>
<!ELEMENT nom (\#PCDATA)>
<!--fin de la DTD interne -->
] >
<!--début du document-->
<personne>
<prenom>Albert</prenom>
<nom>Camus</nom>
</personne>
<!--fin du document-->
Mais en général, la DTD est externe, car elle est partagée par un ensemble de documents :
<!ELEMENT personne (prenom, nom)>
<!ELEMENT prenom (\#PCDATA)>
<!ELEMENT nom (\#PCDATA)>
Elle est ensuite référencée dans le document XML de la façon suivante :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "./DTD/personne.dtd">
<!--début du document-->
<personne>
...
Le plus souvent, elle est même distante et accessible via une URL :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "http://serveur.domaine/DTD/personne.dtd">
<!--début du document-->
<personne>
...
2.2. Structure d’une DTD
Une DTD contient en particulier, dans un ordre indifférent :
-
des déclarations d’éléments,
-
des déclarations d’attributs,
-
des commentaires,
-
…
2.2.1. Déclaration des éléments
Les éléments se déclarent dans un ordre indifférent, si bien qu’une simple lecture ne permet pas de voir directement quel est l’élément racine (il faut chercher l’élément qui n’a pas de père).
Un élément se déclare selon la syntaxe suivante :
<!ELEMENT nom_élément modèle_contenu >
modèle_contenu décrit la structure de l’élément
au travers d’un langage emprunté aux expressions régulières.
Exemple :
<!ELEMENT personne (nom, prenom+, telephone*, adresse?)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>
<!ELEMENT adresse (#PCDATA)>
signifie que l’élément personne est composé, dans cet ordre, de :
-
un élément
nom -
un ou plusieurs éléments
prenom -
zéro, un ou plusieurs éléments
telephone -
zéro ou un élément
adresse
que les quatre éléments nom, prenom, telephone et adresse sont des éléments textuels (#PCDATA).
Le document :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "personne.dtd">
<personne>
<nom>Martin</nom>
<prenom>Flora</prenom>
<adresse>rue des oiseaux, Paris</adresse>
</personne>
est valide, alors que le suivant ne l’est pas :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "personne.dtd">
<personne>
<prenom>Flora</prenom>
<nom>Martin</nom>
<telephone>0240123456</telephone>
<telephone>0681234567</telephone>
</personne>
Autre exemple :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE para [
<!ELEMENT para (#PCDATA | note | renvoi)*>
<!ELEMENT note (#PCDATA)>
<!ELEMENT renvoi (#PCDATA)>
]>
<para>
Prendre le chemin de l'Inca <renvoi>1</renvoi> et marcher
jusqu'à la porte du Soleil <renvoi>2</renvoi>.
Ne pas oublier de prendre un foulard et de bonnes chaussures.
<note>1. en suivant le plan</note>
<note>2. voir page 2</note>
</para>
2.2.2. Déclaration des attributs
La définition d’un attribut contient, dans cet ordre :
-
le nom de l’élément auquel il appartient,
-
son nom,
-
son type,
-
son statut ou une mention de valeur par défaut.
La syntaxe est la suivante :
<!ATTLIST nom_élément nom_attribut type_attribut statut_ou_valeur_par_defaut>
<!ELEMENT image EMPTY>
<!ATTLIST image source CDATA #REQUIRED>
<!ATTLIST image hauteur CDATA #IMPLIED>
<!ATTLIST image largeur CDATA #IMPLIED>
ce qui s’écrit aussi :
<!ELEMENT image EMPTY>
<!ATTLIST image source CDATA #REQUIRED
hauteur CDATA #IMPLIED
largeur CDATA #IMPLIED>
et pour lequel les 2 éléments ci-dessous seraient conformes :
<image source="photo.jpg" hauteur="300" largeur="200"/>
<image largeur="200" hauteur="300" source="photo.jpg" />
En ce qui concerne le type de l’attribut, citons sans être exhaustif :
-
CDATA: une chaîne de caractères quelconque -
(val1 | val2 | … | valn): une énumération des valeurs autorisées
Et en ce qui concerne le statut_ou_valeur_par_defaut :
-
#IMPLIED: l’attribut est facultatif -
#REQUIRED: l’attribut est obligatoire -
#FIXED "valeur": l’attribut a cette valeur et celle-ci n’est pas modifiable -
"valeur": l’attribut a cette valeur par défaut, mais celle-ci peut être modifiée
<!ELEMENT agence (nom, periode, voyage*) >
<!ATTLIST agence niveau CDATA #REQUIRED > (1)
<!ELEMENT nom (#PCDATA)>
<!ELEMENT periode (#PCDATA) >
<!ELEMENT voyage (pays, duree, descriptif, prix) >
<!ATTLIST voyage niveau (1 | 2 | 3 | 4 | 5) #IMPLIED > (2)
<!ELEMENT descriptif (#PCDATA | remarque )* >
<!ATTLIST descriptif langue CDATA "fr" > (3)
<!ELEMENT remarque (#PCDATA) >
<!ELEMENT prix (#PCDATA) >
<!ELEMENT pays (#PCDATA) >
<!ELEMENT duree (#PCDATA) >
| 1 | L’élément agence a un attribut obligatoire nommé niveau dont la valeur est un texte quelconque. |
| 2 | L’élément voyage a un attribut facultatif nommé niveau dont la valeur doit être l’un des cinq premiers nombres entiers, |
| 3 | L’élément descriptif a un attribut nommé langue avec une valeur par défaut égale à fr. |
3. XML schéma
Les schémas XML ont le même objectif que les DTD.
Un schéma XML est lui-même un document XML (fichier XSD).
Par rapport aux DTD, les schémas apportent :
-
des types de données : les DTD ne considèrent que le type chaine de caractères
-
la spécification de cardinalité (par exemple, on peut spécifier qu’un élément de type A doit contenir de 3 à 5 éléments de type B)
Exemple de schéma XML :
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Exemple de document conforme à ce schéma :
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
Le schéma étant un document XML, il suit lui-même un modèle défini par un schéma : le schéma des schémas.
4. Dialecte XML
Un dialecte XML est une instance XML contrainte par un modèle XML Voici 3 exemples de dialectes XML.
4.1. SVG (Scalable Vector Graphics)
SVG est un dialecte XML de définition vectorielle de graphiques 2D. Il permet d’exprimer des formes (rectangle, ellipse, etc.), des chemins (ligne, courbe de Bézier, etc.), des textures de remplissages et des transformations (translation, rotation, zoom, etc.). Voici un extrait de code SVG :
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 50,80 L 170,80"
id="path2330" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 170,80 L 170,170"
id="path2332" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 170,170 L 110,170"
id="path2334" />
4.2. MathML
MathML est un dialecte XML de définition de formules mathématiques. Exemple :
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>x</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mrow>
<mo>-</mo>
<mi>b</mi>
</mrow>
<mo>±</mo>
<msqrt>
<mrow>
<msup>
<mi>b</mi>
<mn>2</mn>
</msup>
<mo>-</mo>
<mrow>
<mn>4</mn>
<mo></mo>
<mi>a</mi>
<mo></mo>
<mi>c</mi>
</mrow>
</mrow>
</msqrt>
</mrow>
<mrow>
<mn>2</mn>
<mo></mo>
<mi>a</mi>
</mrow>
</mfrac>
</mrow>
</math>
4.3. XHTML
XHTML est un dialecte XML de définition de page web. C’est HTML revisité pour être conforme à la syntaxe XML, c’est-à-dire avec quelques contraintes supplémentaires. Parmi les différences :
- les balises et attributs sont en minuscules
-
ex:
<body>et non<BODY> - les éléments vides se terminent par
/ -
ex:
<br/>et non<br> - les valeurs des attributs sont délimités
-
ex:
<image witdh="80"et non<image witdh=80> - les attributs doivent avoir une valeur
-
ex:
<input checked="true">et non<input checked>
Conformément à XML, XHTML est syntaxiquement plus strict et rigoureux que HTML : les document XHTML doivent être a minima bien-formés (à défaut d’être valides). A contrario, les navigateurs web ignorent joyeusement les erreurs dans les pages HTML, pour essayer d’afficher quelque chose coûte que coûte (et le rendu obtenu dépend alors du navigateur utilisé).
Rédiger en XHTML est donc plus contraint que de rédiger en HTML, mais offre l’avantage de disposer de documents plus inter-opérables, dont la syntaxe peut être vérifiée, et pouvant être traités avec toutes les bibliothèques et outils XML existants.