Cours gratuits » Cours informatique » Cours développement web » Cours XML » Introduction au Langage XML

Introduction au Langage XML

Problème à signaler:

Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Introduction à XML

Fabrice Rossi .

Université Paris-IX Dauphine

Plan du cours

1.    XML :

(a)    introduction

(b)    le langage

(c)    les DTD

(d)    les espaces de noms

2.    les schémas

3.    API de manipulation :

(a)    SAX

(b)    DOM

4.    les transformations : XSLT

Documents :

XML INTRODUCTION

XML?

XML (eXtensible Markup Language) :  norme du W3C (), datant

du 10/02/98

 XML sert à stocker des données structurées dans un fichier texte :

 données structurées = arbre

 Markup = balise ? structuration  XML 6= HTML :

 n’est pas limité au Web

doit être adapté à chaque utilisation

 pas toujours très lisible

 XML ressemble à HTML :  langages à balise  dérivés de SGML

Exemple

Exemple de fichier XML :

<?xml version="1.0" standalone="yes"?>

<conversation>

<greeting mood="polite">Hello, world!</greeting>

<response mood="angry">Leave me alone!</response>

</conversation>

1

2

3

4

5

1.    en-tête “presque” obligatoire : c’est une PI (processing instruction)

2.    balise ouvrante (ici la racine de l’arbre) : débute un nœud (un élément)

3.    mood est un attribut, polite est sa valeur

5. balise fermante correspondant à la BO de la ligne 2

Arbre de l’exemple

 

 l’inclusion textuelle traduit la relation mère/fille  les attributs précisent les nœuds

Intérêts de XML

Deux points importants :

1.    XML est un standard ouvert et accepté

2.    XML est une solution complète de stockage, manipulation, transformation, etc. de données structurées

Standard ? économie de développement. Produits disponibles :

1.    éditeur

2.    analyseur syntaxique

3.    validateur (vérification de cohérence)

4.    moteur de transformation

5.    etc.

XML comme format de fichier

Le standard et ses extensions proposent :

 support de très nombreux encodages (Unicode, ISO

Latin, etc.) ? international  inclusion et macro (très élémentaires)  contraintes de structure :

 Document Type Definition (DTD), l’ancienne solution  schéma, les nouvelles solutions

 méta-organisation : namespace  liens évolués : XPointer et Xlink  stockage :

 bases de données XML (langage de requêtes XQuery

en cours de standardisation)

 compression spécialisée

 calcul de différences (gestion de version)

XML pour le programmeur

Le standard et ses extensions proposent :

 analyse syntaxique :

 modèle objet : Document Object Model (DOM)

 modèle évènementiel : Simple API for Xml (SAX)  sérialisation

 validation (en général intégrée à l’analyseur) :

 DTD  schéma

 moteur de transformation (d’un document XML en un

autre) : XSLT

 expressions rationnelles XML : XPath Outils Open Source par le groupe apache :

 Xerces : analyse syntaxique et validation

 Xalan : transformation et expressions rationnelles (voir aussi Saxon, )


Applications

Outils et normes utiles :

 base de connaissances : Ressource Description

Framework (RDF)  transformation vers HTML et WML : XSLT  impression de qualité : XSL :FO

 dessin vectoriel : Scalable Vector Graphics (SVG)  animation : SMIL

 mathématiques : MathML

 RPC en XML : xmlrpc et SOAP  etc.

Outils Open Source par le groupe apache :

 FOP : support de XSL :FO

 Batik : support de SVG

XML LE LANGAGE XML

Données structurées

XML permet de représenter des données structurées :

 données textuelles (binaire : codage, par exemple basé

sur mime)

 organisées :

 on manipule un document constitué d’éléments  un élément peut être constitué simplement de texte ou

contenir d’autres éléments (ou un mélange des deux)

 un élément peut être associé à des informations

complémentaires, les attributs

 la structure est celle d’un arbre :  un document XML = un arbre  un élément = un nœud de l’arbre

 le standard indique comme traduire l’arbre en un texte

XML, pas comment organiser les données

Exemple

 but : stocker l’annuaire de Dauphine (nom, prénom,

bureau, numéro de poste, email)

 le texte du document : les informations !

 organisation : s’arranger pour que les informations restent

correctement groupées (ne pas mélanger les données !)  une possibilité :

 

Exemple (suite)

Traduction en XML de l’arbre :

<?xml version="1.0" encoding="ISO-8859-1"?>

<annuaire>

<personne>

<nom>Rossi</nom>

<prénom>Fabrice</prénom> <bureau>B520</bureau>

<poste>4823</poste>

<email></email>

</personne>

<!-- suite de l’annuaire -->

</annuaire>

1

2

3

4

5

6

7

8

9

10

11

 inclusion textuelle ? relation mère-fille dans l’arbre  balise ouvrante ou fermante ? nom d’un nœud

 texte ? feuille de l’arbre

Ne pas confondre les éléments (information) et les balises (syntaxe).

Organisation

On organise les données en décidant de la structure de l’arbre :

 le nom des éléments  l’ordre des éléments  les relations d’inclusion

 la position des données (c’est-à-dire du texte)  les contraintes sur les données (texte quelconque, valeur

numérique, etc.)

 les attributs

Une organisation particulière forme un dialecte XML, par exemple :

 MathML : pour décrire des équations  xbel : pour décrire des signets

 SVG : dessin vectoriel

 XHTML : HTML re-spécifié en XML  etc.

Autre solution pour l’annuaire

 

Traduction XML

<?xml version="1.0" encoding="ISO-8859-1"?>

<annuaire>

<personne nom="Rossi" prénom="Fabrice" bureau="B520" poste="4823" email=""/>

<!-- suite de l’annuaire -->

</annuaire>

 

1

2

3

4

5

6

7

8

9

 attributs ? annotations d’un nœud  élément vide ? feuille

Différences

Le choix de la structure n’est pas anodin :

 l’intérieur d’un attribut n’est pas structuré  au maximum un seul exemplaire d’un attribut dans un

élément  impossible de faire ce qui suit avec des attributs sans introduire lourdeurs et limitations :

<?xml version="1.0" encoding="ISO-8859-1"?>

<annuaire>

<personne>

<nom>Rossi</nom>

<prénom>Fabrice</prénom>

<prénom>Dominique</prénom> <bureau>B520</bureau>

<poste>4823</poste>

<email><nom>Fabrice.Rossi</nom><domaine></domaine></email>

<email><nom>rossi</nom><domaine></domaine></email>

</personne>

</annuaire>

1

2

3

4

5

6

7

8

9

10

11

12

Une solution (lourde!) par attributs

On peut proposer :

<?xml version="1.0" encoding="ISO-8859-1"?>

<annuaire>

<personne nom="Rossi" prénom="Fabrice" prénom2="Dominique" bureau="B520" poste="4823" email-nom="Fabrice.Rossi" email-domaine="" email-nom2="rossi" email-domaine2=""/>

</annuaire>

1

2

3

4

5

6

7

8

9

10

11

12

 très lourd

 oblige à prévoir tous les cas (redondance dans les

traitements ultérieurs) : on peut toujours structurer le contenu d’un élément a posteriori, pas celui d’un attribut

Syntaxe XML

Deux niveaux syntaxiques :

1.    bas niveau : document bien formé.

2.    haut niveau : document valide (respectant une DTD). haut niveau ? bas niveau.

Du point de vue utilisateur/concepteur :

1.    le bas niveau est obligatoire : mal formé ? pas XML.

2.    le bas niveau est fixé par la norme.

3.    le haut niveau est facultatif : bien formé ? XML.

4.    le haut niveau est entièrement de la responsabilité du concepteur : il définit les contraintes syntaxiques (noms de éléments, organisation, etc.)

5.    le haut niveau peut se mettre en œuvre de différentes façons (DTD, schémas W3C, Relax NG, etc.)

Documents XML bien formés

Les éléments :

 <truc> : balise ouvrante :

1.    doit toujours correspondre à une balise fermante

(parenthèsage correct), ici </truc>

2.    le texte entre <> est le nom de l’élément : constitué de lettres, chiffres, ’.’, ’-’, ’_’ et ’ :’

 </quantité> : balise fermante (depuis une balise ouvrante jusqu’à une balise fermante : le contenu d’un élément, un nœud de l’arbre)

 <et_hop/> : balise mixte, ouvrante et fermante, pour les éléments vides Exemples :

 <a><b></a></b> : mal formé

 <p>bla, bla, bla<br>bla, bla, bla</p> : mal formé

 <:très_bien-choisit/> : bien formé

Documents XML bien formés (2)

Les attributs :

<font name="times"> : name est un attribut de l’élément font, de valeur times :

 ne peut apparaître que dans une balise ouvrante ou mixte  doit toujours avoir une valeur

 la valeur est toujours délimitée par des guillements " ou

des apostrophes ’

 dans la valeur, < est interdit

 pour le nom d’un attribut, même contrainte que pour les

éléments

 dans une même balise ouvrante ou mixte, chaque attribut ne peut apparaître qu’une fois

Exemples

Quelques fragments de documents mal formés :

 <p align=center>du texte centré</p>

 <img src="" noborder/>  <un/truc>par exemple</un/truc>

 <a>contenu de l’élément</A>  <formule valeur=’(3+4)<2’/>

 <a><b>dddd</b val=’big’></a>

 <a x=’1’ x=’2’/> Fragments bien formés :

 <pas texte=’de "problème"’></pas>

 <a :très_bien-choisit=’une valeur’/>

Remarque : contrairement à HTML, XML est case sensitive.

Documents XML bien formés (3)

Grammaire de base :

un document XML est un arbre d’éléments :

 la racine est unique  le contenu d’un élément est :

 d’autres éléments

 du texte (les character data) : < et & interdits Exemples :

 <a></a><b></b> : mal formé

 <a>3<2</a> : mal formé

 <a>3>2</a> : bien formé (déconseillé)

 <a>bla <br/>bla</a> : bien formé

Constructions utiles

 commentaires :

<!-- ce qu’on veut sauf deux - à la suite -->  CDATA (texte) :

<![CDATA[ <a>contenu<b> non interprété, non analysé, ne fait pas</a> partie de l’arbre</b> ]]>

1

2

3  entités :

 gestion de la structure physique des documents XML  mécanisme de “macro” XML :

 inclusion d’un document dans un autre  référence externe

 remplacement d’un texte par un autre  customization

Les entités

Entités de bas niveau :  syntaxe : &nom;

 “prédéfinies” pour les caractères spéciaux :

caractère

&

"

entitée

&lt;

&gt;

&amp;

&apos;

&quot;

 accès aux caractères par leur code UNICODE : &#nombre

en base 10; ou &#xnombre en base 16;. Par exemple &#39; correspond à ’. Entités de haut niveau :  à définir dans la DTD

 inclusion  remplacement  customization


Exemple complet

<?xml version="1.0" encoding="ISO-8859-1"?>

<carnet>

<fiche>

<nom>Rossi</nom><prénom>Fabrice</prénom>

<adresse>

<service>UFR MD</service>

<rue>Place du Maréchal de Lattre de Tassigny</rue>

<code>75016</code><ville>Paris</ville>

</adresse>

<téléphone>

<fixe>01 44 05 48 23</fixe>

<fax>01 44 05 40 36</fax>

<portable>06 06 06 06 06</portable>

</téléphone>

<email><nom>Fabrice.Rossi</nom><domaine></domaine></email>

</fiche>

</carnet>

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Entête

 il est conseillé de commencer un document XML par :

<?xml version="1.0"?>  si on donne l’en-tête, version="1.0" est obligatoire  l’attribut encoding permet d’indiquer la représentation

physique des caractères du fichier :

 <?xml version="1.0" encoding="UTF-16"?>

 <?xml version="1.0" encoding="UTF-8"?> par défaut

(supporte l’ASCII)

 <?xml version="1.0" encoding="ISO-8859-1"?> sous linux

 <?nom ?> : une Processing Instruction. Indique aux logiciels comment traiter le document :

 encodage

 associer une feuille de style à un document

Validation

LES DTD

Documents valides

 syntaxe de haut niveau (grammaire)  précisée par une DTD :

 existe depuis la norme XML

 outils stables  limitées : structure simple  syntaxe non XML

 précisée par un schéma :

 deux grandes technologies (d’autres existent) :  les schémas du W3C (recommandation du 2 Mai

2001)

 RELAX NG du consortium OASIS (spécification du

12 Décembre 2001)  syntaxe XML

 très puissants  assez complexes

DTD et schéma

Principes communs :  éléments autorisés

 modèle du contenu d’un élément (et donc grammaire)  attributs autorisés

 modèle de la valeur d’un attribut Différences :  syntaxe :

 DTD : issue de SGML

 Schéma : un document XML comme un autre  contraintes :

 DTD : contraintes très simples

 Schéma : très évoluées (contenu entier, date, expressions régulières, etc.)

Certains spécialistes (J. Clark par exemple) proposent l’abandon total des DTDs. Peut être pour XML 2.0

DTD

Entête :

 DTD externe (fichier ) : <!DOCTYPE carnet SYSTEM "">  DTD interne :

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE carnet [

<!-- contenu de la DTD -->

]>

<carnet>

<!-- contenu supprimé -->

</carnet>

1

2

3

4

5

6

7

 dans les deux cas : le nom qui suit DOCTYPE est celui de l’élément racine

Déclaration d’un élément

Pour déclarer un élément :

 <!ELEMENT carnet modèle du contenu >  modèles possibles :

 ANY : quelconque

 EMPTY : élément vide  (#PCDATA) : du texte  modèle basé sur les expressions régulières :  séquence : ,, alternative : |

 1 au moins : +, nombre libre : *, 1 au plus : ?

 combinaison grâce aux parenthèses

 mixte : texte plus éléments :

 seulement une alternative entre le texte et des

éléments

 1 occurrence ou un nombre quelconque (i.e., par de

+ ni de ?)  un seul modèle pour un nom donné

Exemples

 <!ELEMENT carnet (fiche*)>

L’élément carnet peut contenir un nombre arbitraire d’éléments fiche.

 <!ELEMENT fiche (nom, prénom, téléphone, email*)> L’élément fiche contient exactement un nom, un prénom, un téléphone et autant d’email qu’on le souhaite (le tout dans cet ordre).

 <!ELEMENT fixe (#PCDATA)>

L’élément fixe contient exclusivement du texte.

 <!ELEMENT téléphone (fixe|fax|portable)*> L’élément téléphone contient dans n’importe quel ordre et en n’importe quelle quantité des éléments fixe, fax et portable.

Contenu mixte

Utile, mais pas assez de contraintes. Exemple :

<?xml version="1.0" encoding="ISO-8859-1"?>

<texte>

Un exemple de <code>XML</code> qui mélange <bf>éléments</bf> et <emph>texte classique</emph>, ce qui peut poser des <bf><underline>problèmes</underline></bf> <underline>délicats</underline>.

</texte>

1

2

3

4

5

6

7

Modèle (une partie) :

<!ELEMENT texte (#PCDATA|code|bf|emph|underline)*>

<!ELEMENT code (#PCDATA|code|bf|emph|underline)*>

1

2

Problème : on peut s’éloigner du texte d’exemple.

Déclaration d’attributs

Pour déclarer un attribut :

 <!ATTLIST élément attribut définition de l’attribut >  plusieurs attributs :

<!ATTLIST bookmark

href    CDATA #REQUIRED visited CDATA #IMPLIED modified CDATA #IMPLIED >

1

2

3

4

 il est conseillé de n’avoir qu’une ATTLIST par élément  définition d’attribut : type et valeur par défaut  types possibles (il en existe d’autres plus complexes et

moins utiles) :

 CDATA : texte

 ID : label ; IDREF et IDREFS : référence à un label  énuméré : valeurs possibles séparées par des | et encadrées par des parenthèses

Collisions de noms

 chaque élément a son propre espace de noms pour ses

attributs : un même nom d’attribut peut être utilisé différemment dans deux éléments distincts

 l’espace de noms des attributs est distinct de celui des

éléments : un attribut et un élément peuvent avoir le même nom  exemple (fragment correct) :

<!ATTLIST groupe nom ID #REQUIRED>

<!ELEMENT nom (#PCDATA) >

<!ATTLIST interprète nom IDREF #REQUIRED>

1

2

3

Valeurs par défaut pour les attributs

Pour la partie “valeur par défaut”, on peut indiquer :

 #REQUIRED : attribut obligatoire et pas de valeur par défaut.

 #IMPLIED : attribut facultatif et pas de valeur par défaut.  une valeur : c’est la valeur par défaut

 #FIXED suivi d’une valeur : valeur obligatoire pour l’attribut Exemples :

<!ATTLIST xbel version CDATA #FIXED "1.0" >

<!ATTLIST metadata owner CDATA #REQUIRED >

<!ATTLIST folder id ID #IMPLIED folded (yes|no) ’yes’ >

1

2

3

4

5

Les références croisées

Les types ID, IDREF et IDREFS permettent des références croisées au sein d’un document :

 ID :  pour associer un label à un élément  un seul attribut ID par élément  #REQUIRED ou #IMPLIED  contenu unique dans un document  IDREF et IDREFS :

 pour faire une référence à un label

 doit obligatoirement faire référence à un label existant  IDREFS : plusieurs labels séparés par des espaces

Exemple (XML)

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE disques SYSTEM "">

<disques>

<groupe nom="muse">

<nom>MUSE</nom>

<membre>Matthew Bellamy</membre>

<membre>Dominic Howard</membre>

<membre>Chris Wolstenholme</membre>

</groupe>

<disque>

<interprète nom="muse"/>

<titre>Showbiz</titre>

</disque>

<disque>

<interprète nom="muse"/>

<titre>Origin of symmetry</titre>

</disque>

</disques>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


Exemple (DTD)

<?xml vers

<!ELEMENT

ion="1.0" encoding="ISO-8859-1"?> disques (groupe*, disque*) >

 

<!ELEMENT

groupe (nom,membre+) >

 

<!ATTLIST

groupe nom ID #REQUIRED>

 

<!ELEMENT

nom (#PCDATA) >

 

<!ELEMENT

membre (#PCDATA) >

   

<!ELEMENT

disque (interprète,

titre)>

 

<!ELEMENT

interprète EMPTY >

   

<!ATTLIST

interprète nom IDREF

#REQUIRED>

 

<!ELEMENT

titre (#PCDATA) >

   

1

2

3

4

5

6

7

8

9

10

 le validateur vérifie les références croisées  permet (entre autres) d’éviter la redondance dans un fichier XML

Entités

Une entité est une storage unit d’un document XML :

 entité analysée (parsed entity) : un morceau du texte d’un

document XML

 entité non analysée (unparsed entity) : une ressource

externe référencée par un document XML (par exemple une image)

 entité générale : utilisée dans le corps d’un document XML (cf exemples précédents : référence à un caractère, caractères spéciaux)  entité paramètre : utilisée seulement dans la DTD Partie la plus lourde de XML !

Entités comme macros

générale :

 définition : <!ENTITY nom "texte de remplacement">  utilisation : &nom;  utilisation interdite dans la DTD (sauf dans le texte de

remplacement d’une autre entité)

 remplacement récursif au moment de l’utilisation (sauf

pour les références à des caractères, remplacées à la définition)

Exemple :

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE texte [

<!ELEMENT texte (#PCDATA)>

<!ENTITY auteur "Fabrice Rossi">

]>

<texte>&auteur;</texte>

1

2

3

4

5

6


Entités comme macro dans les DTD

paramètre :  définition : <!ENTITY % nom "texte de remplacement">  utilisation : %nom;

 utilisable seulement dans la DTD  remplacement récursif immédiat Exemple :

<!ENTITY %                           "href         CDATA #REQUIRED visited CDATA #IMPLIED modified CDATA #IMPLIED"

<!ELEMENT bookmark (title?, info?, desc?)> <!ATTLIST bookmark

;

1

2

3

4

5

6

7

8

Entités pour l’inclusion

externe (paramètre ou générale) :

 définition : <!ENTITY nom SYSTEM "URI">

 utilisation : &nom;  principe : le fichier référencé par l’URI est inclus dans le fichier référençant en cas de validation

<?xml version="1.0" encoding="ISO-8859-1"?>

<texte>et hop</texte>

1

2

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE recueil [

<!ELEMENT recueil (texte)*>

<!ELEMENT texte (#PCDATA)>

<!ENTITY contenu SYSTEM "">

]>

<recueil>&contenu;</recueil>

1

2

3

4

5

6

7

Les espaces de noms

LES ESPACES DE NOMS


Les namespaces

Un document XML peut contenir des éléments et des attributs qui correspondent à plusieurs domaines distincts (i.e., à plusieurs dialectes).

Problème : comment gérer les collisions ? Solution ? Les namespaces :  recommandation du 14/01/99

 permet d’introduire des collections de noms utilisables

pour les éléments et les attributs d’un document XML

 principes :

 chaque collection est identifiée par un URI  une construction (un attribut) permet d’associer un URI

à un préfixe  pas de réel support des namespaces par les DTDs

Exemple

<?xml version="1.0" encoding="ISO-8859-1"?>

<html:html xmlns:html=";>

<html:head>

<html:title>Démonstration</html:title>

</html:head>

<html:body>Un contenu</html:body>

</html:html>

 

1

2

3

4

5

6

7

 l’attribut xmlns:html associe le préfixe html à l’URI

"http ;  l’association n’est valable que dans les descendants (au

sens large) de l’élément qui contient xmlns:html

 l’association s’applique aux éléments et aux attributs

Cas général

 

Déclaration d’un namespace :

 xmlns:préfixe="URI" : association du préfixe à l’URI  xmlns="URI" : définition de l’URI associé à l’espace de

noms par défaut (sans préfixe) Nom qualifié :

 préfixe:nom local  peut être utilisé pour les attributs et les éléments  le préfixe doit être déclaré par un ascendant Remarques :

 c’est l’URI qui assure l’absence d’ambiguïté, pas le préfixe  le dernier qui parle a raison

Les attributs

 

Une subtilité :

 les attributs avec un nom qualifié sont traités comme les

éléments, i.e., globalement

 les attributs sans préfixe sont dans un espace de noms

local propre à l’élément dans lequel ils apparaissent (c’est le cas classique sans namespace)

Dans un élément donné, les attributs doivent être disctints, c’est-à-dire :

 ou bien être des attributs qualifiés qui se distinguent par

leur partie locale ou par leur URI

 ou bien être des attributs sans préfixe distincts

Exemples

<?xml version="1.0" encoding="ISO-8859-1"?>

<html xmlns=";>

<head>

<title>Démonstration</title>

</head>

<body>Un contenu</body>

</html>

 

1

2

3

4

5

6

7

<x xmlns:n1="" xmlns="" >

<good a="1"                      b="2" />

<good a="1"                              n1:a="2" />

</x>

1

2

3

4

5


135