coursXML

publicité
Introduction à XML
Généralités
Introduction
XML (Extensible Markup Language) : standard W3C pour le balisage de
données.
Son origine date des années 80. Il est issu comme le HTML d’un langage
très général appelé SGML (Standard Generalized Markup Language)
dont il a hérité des principales caractéristiques tout en étant plus simple
à mettre en œuvre.
Quelques aspects de XML
• Le contenu du document et sa mise en forme sont séparés
(contrairement à HTML). Pratique : on peut associer plusieurs mises en
forme alternatives pour un même contenu.
• Chaque document XML peut avoir une DTD (document Type
Definition) ou un schéma associé qui définissent sa structure.
• Les balises n’ont pas de sémantique prédéfinies (contrairement à
HTML où chaque balise a un sens et un effet sur la mise en forme qui
est connu).
XML - Exemple
La structure d’un document XML est arborescente.
<livre>
<titre>Les Misérables</titre>
<auteur>
<prénom>Victor</prénom>
<nom>Hugo</nom>
</auteur>
<nb_tomes>3</nb_tomes>
</livre>
A chaque balise ouverte,
correspond une balise fermée (ex.
<livre> et </livre>).
Chaque élément peut être vu
comme un nœud d’un arbre. livre
a pour sous-élément (pour
« enfants ») auteur, titre et
nb_tomes. Auteur a pour enfant
prénom et nom.
XML - Exemple
Arbre XML (pour exemple précédent) :
livre
titre
Les misérables
auteur
Nb_tomes
prénom
nom
Victor
Hugo
3
XML exemple
L’exemple suivant montre l’utilisation d’XML dans un texte narratif:
<biographie><auteur>Victor Hugo</auteur> est un écrivain français né à
Besançon en <date>1802</date>. Il a écrit un grand nombre de livres,
beaucoup considérés comme des <emphase>chef d’œuvres</emphase>
de la littérature française. Parmi ses romans : <titre>Les
misérables</titre>, <titre>Notre Dame de Paris</titre>.</biographie>
Dans cet exemple, XML est utilisé sous forme assez libre. Biographie
comprend un certain nombre de sous éléments (auteur, date,…) mais
aussi des données textuelles non structurées.
XML – Mise en oeuvre
Pour l’utilisation d’XML comme langage de présentation de données sur le
web, deux documents au moins sont nécessaires.
• Le premier contient les données proprement dites.
• Le deuxième va contenir les informations nécessaires à sa mise en
forme. En pratique, cela revient à définir des feuilles de styles (CSS,
XSLT ou XSL-FO ou….) pour transformer les données en un format
présentable (HTML voire PDF).
Un fichier supplémentaire peut être ajouté pour définir les balises que le
document peut utiliser et les relations entre celles-ci. Il prend la forme
d’une DTD ou d’un Schéma.
Structure d’un document XML - Prologue
En dehors des données présentées sous une forme arborescente (comme
dans l’exemple précédent). Chaque document XML contient un
prologue.
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
Les informations fournies dans cette déclaration sont de trois sortes :
1.
version : version du XML utilisée dans le document, 1.0 ici.
2.
encoding : jeu de codage de caractères utilisé. Le jeu de caractère
standard pour la France est le ISO-8859-1. Par défaut, sa valeur est
UTF-8;
3.
standalone : la valeur yes, indique que le processeur de l'application
n'attend aucune déclaration de type de document extérieure au
document. Sinon, le processeur attend une référence de déclaration
de type de document.
Structure d’un document XML
On peut aussi trouver des instructions de traitement au début du document.
Par exemple: <?xml-stylesheet type="text/xsl" href="biblio.xsl"?>
L’instruction ne sert pas pour le document proprement dit mais sera
interprétée par l’application à laquelle elle est destinée (ici xmlstylesheet le processeur de feuilles de style du XML).
L’attribut type indique de quel type de feuille de style il s’agit (XSL ou
CSS).
L’attribut href donne l’URL (« l’emplacement ») du fichier de feuille de
style.
Exemple
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="Film.xsl" type="text/xsl"?>
<FILMS>
<FILM Annee='1979'>
<TITRE>Alien</TITRE>
<GENRE>Science-fiction</GENRE><PAYS>USA</PAYS>
<ROLES><ROLE><PRENOM>Sigourney</PRENOM><NOM>Weaver
</NOM><INTITULE>Ripley</INTITULE></ROLE></ROLES>
<RESUME> Près d'un vaisseau spatial échoué sur une lointaine planète, des
Terriens en mission découvrent de bien étranges "oeufs". Ils en ramènent un
à bord, ignorant qu'ils viennent d'introduire parmi eux un huitième passager
particulièrement féroce et meurtrier.</RESUME>
</FILM></FILMS>
XML - Structure
Tout document XML se présente sous la forme d’un arbre d’éléments. Il
contient une racine, des nœuds et des feuilles (appelés éléments).
La racine : chaque document contient une unique racine (document
element). Elle englobe tous les autres : <FILMS> dans l’exemple
précédent.
Les éléments : Ils peuvent contenir du texte ou d’autres éléments (ses
enfants).
<ROLE>
<PRENOM>Sigourney</PRENOM><NOM>Weaver
</NOM><INTITULE>Ripley</INTITULE>
</ROLE>
XML - Structure
Les attributs: tout élément peut contenir un ou plusieurs attributs. Chaque
attribut se compose d’un nom et d’une valeur.
Par exemple : <FILM Annee='1997‘/>
Les entités : elles peuvent être prédéfinies ou définies par l’utilisateur dans
la DTD (et seront utilisables dans le fichier XML ou la DTD).
Les entités prédéfinies sont : & (pour &), < (pour <), > (pour
>), " (pour « ), &aquot; (pour ‘).
Elles permettent de ne pas interpréter les caractères spéciaux et réservés
d’XML.
XML - Structure
Les sections CDATA: une section CDATA peut contenir toute sorte de suite
de caractères. Sert à définir des blocs de parties qui ne devront pas
être analysés par le processeur XML. Elle est mise en œuvre par
<![CDATA[ et ]]> . Ce qui est entre ces deux balises ne sera pas
interprété (pratique pour mettre du code XML en exemple et
« échapper » un texte contenant pleins de caractères spéciaux
réservés).
Par exemple : <Introduction à <![CDATA[<XML>]]>>
Les commentaires : comme en HTML.
Par exemple : <!-- Ce qui suit ne sera pas affiché
par le processeur XML -->
XML - Structure
Les règles de base à respecter sont :
1.
Toutes les balises portant un contenu non vide doivent être fermées;
2.
Les balises n'ayant pas de contenu doivent se terminer par />;
3.
Les noms d'attributs sont en minuscules;
4.
Les valeurs d'attributs doivent être entre guillemets;
5.
La casse (majuscules/minuscules) doit être respectée pour toutes les
occurrences de noms de balises. XML est sensible à la casse!
Un document respectant ces critères est dit bien formé (well formed).
D’autres règles peuvent être ajoutées à l’aide d’un DTD.
Introduction à XML
Les DTD (Document Type
Definition)
Introduction
Bien que XML soit un langage très flexible, il est nécessaire parfois de
préciser la structure d’un document.
•
•
•
Garantir qu’un document suit bien les règles d’une application
spécifique (format d’échange de données dans un protocole, par
exemple).
Dire ce qu’il est possible ou pas possible de trouver dans un
document. Ex : tel élément peut être suivi de tel autre.
Spécifier que certains éléments doivent avoir des attributs
obligatoires. Ex : tout élément employé doit avoir un attribut no_secu.
C’est grâce aux DTD que l’on peut spécifier la structure du document.
Introduction
Une DTD devra donner la liste de tous les éléments, attributs et entités
qu’utilise le document (ainsi que leur contexte).
Un document XML sera dit valide, s’il obéit à sa DTD.
Le principe général est que tout ce qui n’est pas interdit est autorisé.
Une DTD peut déclarer plein de choses sur la structure du document mais a
des limites.
Elle ne peut rien dire sur : la longueur du document, le nombre
d’occurrences des éléments, le détails des données textuelles, quel est
le sens d’un élément, …
Type de DTD
Les DTD peuvent être de deux sortes : interne ou externe.
Une DTD est interne lorsqu’elle se trouve à l’intérieur du document XML
qu’elle décrit. Elle est externe lorsqu’elle se trouve dans un autre
fichier. Dans ce dernier cas, le document XML contient une référence
à ce fichier.
Dans tous les cas, une déclaration de type de document est de la forme :
<!DOCTYPE élt.racine déclarations>
élt.racine : nom de l’élément racine du document XML.
déclarations : donne la liste des déclarations de la DTD si elle est interne ou
l’adresse de fichier la contenant si elle est externe.
Type de DTD - Exemple
Soit le (détail de) document XML suivant :
<liste.cd>
<cd>
<interprete>Keith Jarret</interprete>
<titre>The Köln Concert</titre>
<specif type="Live" nb_cd="1"/> </cd>
<cd>
<interprete>Pink Floyd</interprete>
<titre>The Wall</titre>
<specif type="Live" nb_cd="2"/> </cd>
</liste.cd>
Type de DTD - Exemple
Une DTD interne pourrait avoir la forme suivante :
<!DOCTYPE liste.cd[
<!ELEMENT liste.cd (cd)*>
<!ELEMENT cd (interprete, titre, specif)>
<!ELEMENT interprete (#PCDATA)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT specif (#PCDATA)>
<!ATTLIST specif
type (B.O.F.|Live|Compilation) #IMPLIED
nbcd CDATA "1"
>
]>
Type de DTD - Exemple
Une DTD externe prendrait la forme suivante :
<!DOCTYPE liste.cd SYSTEM "listecd.dtd">
Où le fichier listecd.dtd (qui ici doit être dans le même répertoire)
contiendrait :
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT liste.cd (cd+)>
<!ELEMENT cd (interprete, titre, specif)>
<!ELEMENT interprete (#PCDATA)>
<!ELEMENT titre (#PCDATA)>
<!ELEMENT specif (#PCDATA)>
<!ATTLIST specif
type (B.O.F.|Live|Compilation) #IMPLIED
nbcd CDATA "1"
>
Type de DTD – remarque
Dans la déclaration de DTD, on peut trouver les mots clés SYSTEM ou
PUBLIC.
SYSTEM : indique que la DTD est à usage privé et se trouve (la plupart du
temps) sur le serveur. Elle peut être exprimée sous la forme d’une
adresse http, d’une adresse relative ou du nom du fichier dtd si celui
ci est dans le même répertoire.
PUBLIC : fait référence à une DTD publique accessible à tous. Exemples :
une DTD pour HTML ou SVG (Scalable Vector Graphics) sur le site
du W3C. Dans ce cas, l’adresse fournie est une URL (ou URI).
Déclaration d’éléments
Elle est de la forme : <!ELEMENT nom modèle_contenu>
Nom : peut être n’importe quelle nom XML autorisé.
Modèle_contenu : décrit quels sous éléments (et dans quels ordre) l’élément
peut avoir.
Le modèle de contenu le plus simple est #PCDATA qui indique que
l’élément ne contient que des données textuelles.
Exemple : <!ELEMENT titre (#PCDATA)>
Déclaration d’éléments - séquence
On indique la présence de sous éléments par le parenthèsage. Cela
permettra aussi de combiner les différents types de déclarations sans
ambiguïté.
Exemple : <!ELEMENT coordonnées (numéro_portable)> indique que
l’élément coordonnées ne contient qu’un seul sous élément
numéro_portable (qui devra être défini aussi).
Pour indiquer que l’on peut trouver une liste ordonnée (séquence) de souséléments, on utilise la virgule comme séparateur.
Exemple : <!ELEMENT nom (prénom, nom_famille)>. Dans ce cas, la
présence du prénom et du nom de famille dans cet ordre doit être
nécessaire pour que l’élément nom soit bien formé.
Déclaration d’éléments - nombre
Le nombre de sous-éléments peut être contrôlé à l’aide des trois caractères
spéciaux suivant :
?
Autorise zéro ou un élément
*
Autorise zéro ou plusieurs éléments
+
Autorise un ou plusieurs éléments
Exemple : <!ELEMENT nom (prénom, deuxième_prénom?,
nom_famille+)>. Un prénom, éventuellement un deuxième prénom,
au moins un (voire plusieurs) noms de famille.
Exemple : <!ELEMENT nom (prénom+, surnom*, nom_famille)>. Au
moins un prénom, éventuellement (zéro ou) plusieurs surnoms, un
nom de famille.
Déclaration d’éléments - choix
On peut avoir des alternatives dans la liste des sous-éléments d’un élément
donné. On exprime les choix par une barrre verticale « | ».
Exemple : <!ELEMENT petit_chiffre (un | deux | trois | quatre | cinq)>.
L’élément petit_chiffre peut avoir comme sous-élément soit un, soit
deux, etc…, soit cinq (ces éléments restent à définir).
Exemple : <!ELEMENT nom ((prénom+, surnom*, nom_famille) |
(prénom, deuxième_prénom?, nom_famille+)) >.
Cette déclaration présente la structure de nom comme un choix entre les
deux possibilités définies au transparent précédent.
Déclaration d’éléments - Mixte
Dans certains documents, notamment les document narratif, le contenu peut
être mixte, mélangeant élément structuré et texte.
Exemple : <biographie><auteur>Victor Hugo</auteur> est un écrivain
français né à Besançon en <date>1802</date>. Il a écrit un grand
nombre de livres, beaucoup considérés comme des <emphase>chef
d’œuvres</emphase> de la littérature française. </biographie>
L’élément biographie pourrait se définir comme suit :
<!ELEMENT biographie (#PCDATA | auteur | emphase | date )* >
Il contient n’importe quel nombre d’éléments auteur, emphase, date dans
n’importe quel ordre, entrecoupé éventuellement de données
textuelles.
Déclaration d’éléments – vide, ANY
On peut spécifier que certains éléments ne contiennent aucun contenu. Ils
auront éventuellement, par contre, des attributs (voir après). On
utilise le mot clé EMPTY.
Exemple : <!ELEMENT specif EMPTY>
A contrario, on peut aussi vouloir dire qu’un élément existe, qu’il peut avoir
du contenu sans vouloir spécifier la nature de ce qu’il contient. On
utilise le mot clé ANY.
Exemple : <!ELEMENT qquechose ANY>
Peut-être utile au début de la conception d’une DTD, lorsqu’on ne connaît
pas forcement la nature de l’élément mais que l’on souhaite pouvoir
valider le document quand même.
Déclaration d’attributs
Une DTD doit déclarer aussi tous les attributs autorisés dans un document
XML à valider.
Principalement, il faut renseigner le type de l’attribut et une déclaration par
défaut qui indique son caractère obligatoire ou pas.
On peut décrire tous les attributs d’un élément donné dans la même
déclaration.
Déclaration d'un attribut « attr » (de l’élément « elt ») avec une valeur par
défaut :
<!ATTLIST elt attr CDATA "valeur">
Si la valeur est omise dans le document XML, il n’y aura pas d’erreur, car
l'attribut est ajouté par le processeur avec la valeur par défaut.
Déclaration d’attributs - défauts
Déclaration d'un attribut requis :
<!ATTLIST elt attr CDATA #REQUIRED>
Cette fois, l’attribut requis doit être présent dans le document XML sous
peine de provoquer une erreur.
Déclaration d'un attribut optionnel :
<!ATTLIST elt attr CDATA #IMPLIED>
Déclaration d'un attribut avec une valeur fixe :
<!ATTLIST elt attr CDATA #FIXED "valeur">
Déclaration d’attributs – Types possibles
Les types d’attributs possibles sont au nombre de 10 : CDATA,
ENUMERATION, NMTOKEN, NMTOKENS, ENTITY, ENTITYS,
ID, IDREF, IDREFS, NOTATION.
CDATA : peut contenir n’importe quelle chaîne de caractère comme valeur
de l’attribut.
Exemple : <!ATTLIST nom email CDATA #IMPLIED>
ENUMERATION : indique que l’attribut prend sa valeur dans une liste
donnée in extenso. Il n’y a pas de mots clés.
Exemple : <!ATTLIST cd type (live | studio | best_of) >
Dans ce cas, le nœud XML suivant sera valide : <cd type = ‘‘live’’>
Déclaration d’attributs – Types possibles
NMTOKEN (resp. NMTOKENS) : unité lexicale nominale (resp. liste de
… ) suite de caractères numériques, alphanumériques et de
ponctuation (voir doc du langage pour détails).
ID : doit contenir un nom XML qui est unique dans le document. Aucun
autre attribut de type ID ne peut avoir la même valeur dans le
document (analogie avec les « clés » du modèle relationnel).
IDREF (resp. IDREFS) : fait référence à un attribut de type ID (resp. liste
d’attributs) d’un élément du document. Sert à établir des relations
plusieurs-à-plusieurs entre élément dans le document.
ENTITY, ENTITIES (référence à des entités non analysés), NOTATION
(contient le nom d’une notation déclarée). Cf doc du langage.
Déclaration d’entités
On l’a vu, XML possède 5 types d’entités prédéfinies : & (pour &),
< (pour <), > (pour >), " (pour « ), &aquot; (pour ‘).
On peut en définir d’autre dans une DTD.
Pourquoi ? Principalement pour éviter de réécrire des parties revenant
souvent (mot particulier, morceaux de code, …).
Se fait par la commande : <!ENTITY mot définition>
Exemple : <!ENTITY super ‘‘superexatrordinairemegatop’’>
L’appel dans le fichier se fait par : &super;
Les entités peuvent aussi contenir des balises.
Exemple : <!ENTITY super ‘<a href=‘‘index.html’’> accueil </a>’>
Déclaration d’entités
Pour éviter des déclarations trop compliquées et illisibles, on peut utiliser
des entités générales externes analysées.
Principe : on stocke dans un fichier externe la partie à insérer (la définition
de l’entité). C’est le client qui se chargera de l’inclusion.
Exemple : <!ENTITY super SYSTEM ‘‘http://www.toto.org/toto.xml’’>
Chaque occurrence de &super; sera remplacé par le contenu du fichier dont
l’adresse est donnée.
Noter l’utilisation du mot clé SYSTEM.
Notations
Sur l’exemple suivant :
<!ENTITY super SYSTEM ‘‘http://www.toto.org/toto.jpg’’ NDATA jpeg>
qui fait référence à un fichier qui n’est pas en XML, la déclaration NDATA
indique le type de la donnée.
Toutefois, cette indication n’a pas de valeur en soi, elle identifie une
notation que l’on doit trouver dans le document :
<!NOTATION jpeg SYSTEM ‘‘image/jpeg’’>
Le type MIME image/jpeg est associé au mot « jpeg ».
Il est possible de définir des entités paramètres (cf. doc du langage).
Exemple
<!NOTATION jpeg SYSTEM ‘image/jpeg' >
<!ENTITY moi
SYSTEM "http://www.toto.org/mesimages/moi.jpg" NDATA jpeg >
<!ELEMENT LETTRE (DATE, ADRESSE, SALUTATION, CONTENU) >
<!ATTLIST LETTRE moi ENTITY #IMPLIED>
<!ELEMENT DATE (#PCDATA) >
<!ELEMENT ADRESSE (#PCDATA|BR)* >
<!ELEMENT SALUTATION (#PCDATA) >
<!ELEMENT CONTENU (#PCDATA) >
<!ELEMENT BR (EMPTY) >
Téléchargement