Introduction au XML
II XML : Une premi` ere d´ efinition JJ
XML (eXtensible Markup Language) permet de repr´ esenter des donn´ ees semi-structur´ ees sous la forme d’un arbre en m´ emoire et d’un document.
<doc>
<personne>
<nom>A</nom>
<adresse>...</adresse>
</personne>
<ville>...</ville>
<pays>....</pays>
</doc>
<doc>
<personne>
<nom>A</nom>
<adresse>...</adresse>
</personne>
<ville>...</ville>
<pays>....</pays>
</doc>
Sérialisation
Analyse
II Historique d’XML JJ
I SGML J
1986 - SGML (Standard Generalized Markup Language). Un format texte enrichi de balises qui apportent une s´ emantique :
<!doctype linuxdoc system>
<article>
<title>SGML-Tools User’s Guide
<date>1.0 ($Revision: 1.14 $), 10 November 1997
<abstract>This document is a user’s guide</abstract>
<sect>Installation
<p>You can get <tt>sgml-tools-1.0.x.tar.gz</tt>
• Les r´ edacteurs travaillent sur le sens et pas la forme.
• Description de la structure d’un document (d´ efinition d’un jeu de balises).
• V´ erification de la validit´ e des documents.
• Portabilit´ e des documents.
•
I HTML J
1990 - HTML (Hyper Text Markup Language) :
• D´ evelopp´ e et normalis´ e par le W3C (World Wide Web Consortium) ( http://www.w3c.org ).
• Choix ` a priori d’un ensemble de balises : <body> , <table> , etc.
• Avantages : format texte portable et simple.
Discussion critique :
• Demandes continuelles de modifications (versions 3.0, 4.01, 5, etc.).
• M´ elange de balises s´ emantiques ( <address> , <title> , <h1> ) et de balises de mise en forme ( <b> , <i> , <font> ).
Une premi` ere r´ eponse : Feuille de style (CSS1 en 1996 et CSS2 en
1998 normalis´ es par le W3C, puis CSS3, ...).
II XML : eXtensible Markup Language JJ
• 1997 : L’adaptation de SGML aux besoins du WWW donne XML.
• Objectif 1 : S´ eparer la structure, les donn´ ees et la mise en forme.
XML
XSL CSS
de style
DTD Document
Type Definition
Informations
Feuilles
• Objectif 2 : Assurer la portabilit´ e des donn´ ees et faire en sorte d’utiliser
XML pour tous les ´ echanges.
II Un exemple XML complet JJ
Description simplifi´ ee d’un ensenble de produits :
produits.xml
<!DOCTYPE stock SYSTEM "produits.dtd">
<stock>
<produit>
<nom> Livre </nom>
<prix> 50 </prix>
</produit>
<produit>
<nom> CD </nom>
</produit>
</stock>
produits.dtd
<!ELEMENT stock (produit+) >
<!ELEMENT produit (nom,prix?)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prix (#PCDATA)>
La feuille de style XSL (eXtensible Style Language) :
produits.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="stock">
<html><body>
<h1>Mes produits</h1>
<xsl:apply-templates/><!-- traiter les fils -->
</body></html>
</xsl:template>
<xsl:template match="produit">
<p><xsl:value-of select="nom"/></p>
</xsl:template>
</xsl:stylesheet>
le traitement des fichiers produits.xml , produits.dtd , produits.xsl donne le r´ esultat suivant :
produits.html
<html>
<body>
<h1>Mes produits</h1>
<p>Produit Livre </p>
<p>Produit CD </p>
</body>
</html>
II Utilisation du XML JJ
• XML pour communiquer :
application 1 application 2
XML
• Quelques exemples :
. protocole de transmission (XML-RPC, SOAP, Restful), . d´ efinition de normes (XHTML, SMIL, XML-FO, SVG), . Bases de donn´ ees semi-structur´ ee,
. Fichiers de configuration (JSP, EJB, ...),
• Avantages : portabilit´ e, extensibilit´ e, r´ eutilisation d’outils,
I XML pour v´ erifier un document J
• XML pour v´ erifier la conformit´ e :
DTD
XML
Validation
Oui
Non
• Avantages :
. Validit´ e assur´ ee
. Int´ egration facilit´ ee
. Aide ` a la r´ edaction
. Normalisation
I Production de documents ´ electroniques J
• Production de documents XML :
XML
HTML
FO
Text
PS
DVI XML
DTD
XSL
XSL Processeur
• On peut ajouter des sorties WML, XHTML ou des langages normalis´ es
d´ efinis ` a partir d’XML.
I Chaˆ ıne de traitement J
• Int´ egration de plusieurs sources de donn´ ees dans une chaˆ ıne de traitement XML :
S.G.B.D.R.
B.D. XML
XML
Production Extraction
Filtre XML
Publication HTML, WML, XML XSL
Pr´ esentation d’XML
II Introduction ` a XML JJ
• D´ efinition : XML est un langage de description de documents semi- structur´ es ( http://www.w3.org/XML/ ).
• Contenu d’un document XML :
. un prologue optionnel (encodage et DTD) . un et un seul ´ el´ ement
<message> Hello </message>
• Un document XML qui respecte les r` egles syntaxiques est dit bien form´ e.
Il est utilisable sans DTD.
II El´ ´ ements XML JJ
• El´ ´ ement sans contenu
• El´ ´ ement avec contenu textuel
• El´ ´ ement avec sous-´ el´ ements
• El´ ´ ement m´ elang´ e
I El´ ´ ement XML sans contenu J Le document XML le plus simple
est compos´ e d’un seul ´ el´ ement sans contenu. Deux exemples :
<message></message>
<message/>
Arbre en m´ emoire :
/ noeud racine
|
message noeud ´el´ement
DTD :
<!ELEMENT message EMPTY>
La partie fermante est obligatoire. Les noms (appel´ es des identificateurs en XML) sont libres mais ob´ eissent ` a quelques r` egles :
• 1er caract` ere dans { alphab´ etique, - (tiret), (soulign´ e) } ,
• les autres caract` eres dans { alphab´ etique, chiffre, - , } ,
• xml: au d´ ebut est interdit,
I El´ ´ ement avec un contenu textuel J
El´ ´ ement contenant du texte :
<message> Hello </message>
DTD :
<!ELEMENT message (#PCDATA)>
Arbre en m´ emoire :
/ noeud racine
|
message noeud ´el´ement
|
" Hello " noeud texte
Les deux syst` emes de codage des ruptures de lignes sont pris en charge.
L’encodage par d´ efaut est UTF-8 (caract` eres sur 1, 2, 3 ou 4 octets) ou UTF-16 (caract` eres sur deux ou quatre octets). L’arbre en m´ emoire est cod´ e la plupart du temps en UTF-8.
Les caract` eres sp´ eciaux < et & ne sont pas utilisables.
I El´ ´ ement avec sous-´ el´ ements J
Le contenu d’un ´ el´ ement peut ˆ etre compos´ e de plusieurs sous-´ el´ ements com- plets :
Un exemple :
<message>
<pour>Jean</pour>
<texte>Salut</texte>
</message>
DTD :
<!ELEMENT message (pour,texte)>
<!ELEMENT pour (#PCDATA)>
<!ELEMENT texte (#PCDATA)>
Arbre (4 fils pour message ) :
/ racine
|
message ´el´ement
|
+----+--+--+----+
| | | |
"\n__" | "\n__" | textes
| |
pour texte ´el´ements
| |
"Jean" "Salut" textes
I El´ ´ ement avec un contenu m´ elang´ e J
Le contenu d’un ´ el´ ement peut ˆ etre compos´ e d’une r´ ep´ etition de textes et de sous-´ el´ ements :
Exemple XHTML :
<div><i>Cours</i> le <b>lundi</b>.</div>
DTD :
<!ELEMENT div (#PCDATA|b|i)* >
<!ELEMENT b (#PCDATA)>
<!ELEMENT i (#PCDATA)>
Arbre en m´ emoire :
/ racine
|
div ´el´ement
|
+---+---+--+----+
| | | |
| " le " | "." textes
| |
i b ´el´ement
| |
"Cours" "lundi" texte
I Les attributs J
La partie ouvrante d’un ´ el´ ement peut ˆ etre enrichie par des couples attribut / valeur .
Exemple :
<message type="urgent">
Hello
</message>
DTD :
<!ELEMENT message (#PCDATA)>
<!ATTLIST message type CDATA #REQUIRED>
Arbre :
/ racine
|
message ´el´ement
|
+---+---+
| |
type="urgent" | attribut
|
"\n Hello\n" texte
• La valeur est entour´ ee d’apostrophes ( ’ ) ou de guillemets ( " ).
• Le nom d’un attribut est un identificateur XML.
I Utilisation des attributs J
Attributs ou sous-´ el´ ements ?
<produit nature="Blu-ray" prix=’20’> Star wars </produit>
ou
<produit>
<nature>Blu-ray</nature>
<prix>20</prix>
<nom>Star wars</nom>
</produit>
R` egle : L’attribut doit changer l’interpr´ etation des donn´ ees :
<prix monnaie="Euros"> 150 </prix>
I Les attributs r´ eserv´ es J
• xml:lang=’langue’ permet de d´ efinir la langue utilis´ ee dans l’´ el´ ement et tous les sous-´ el´ ements.
La langue suit la norme ISO 3166 d´ efinie par la RFC 1766 (Request For Comment). Par exemple fr ou en-US ou fr-FR .
• xml:space=’preserve’ pr´ eserve les espaces dans l’´ el´ ement et tous les sous-
´ el´ ements.
• xml:space=’default’ applique la politique par d´ efaut pour l’interpr´ etation des espaces dans l’´ el´ ement et tous les sous-´ el´ ements.
• xml:id="identificateur" permet d’associer une et une seule clef ` a un
´ el´ ement (peu utilis´ e)
<article xml:id="intro">
<titre>introduction `a XML</titre>
<paragraphe> ... </paragraphe>
</article>
II Les r´ ef´ erences d’entit´ es JJ
Les entit´ es sont des fragments de document XML d´ efinis dans la DTD et utilis´ es par &nom de l entit´ e; dans les documents XML. Il existe des entit´ es pr´ ed´ efinis :
Entit´ e Texte Alternative
&#nnn; caract` ere de code d´ ecimal nnn
&#xnnn; caract` ere de code hexad´ ecimal nnn
" " "
& & &
' ’ '
< < <
> > >
Un exemple d’utilisation des entit´ es
<texte commentaire=’Utilisation d'entit´es’>
En HTML, la balise <p> est tr`es utile !
© J.-L. Massat
</texte>
II Les commentaires JJ
Un exemple :
<!-- d´eb -->
<message>Bye<!-- M --></message>
<!-- fin -->
Arbre :
/ racine
|
+---+---+
| | |
<!-- d´eb --> | <!-- fin --> commentaires
|
message ´el´ement
| +---+---+
| |
"Bye" | texte
|
<!-- M --> commentaire
• Il ne doit pas y avoir de double tirets ( -- ) dans le texte,
• Les commentaires sont pr´ esents dans l’arbre en m´ emoire.
II Les instructions de traitement JJ
Les instructions de traitement introduisent un aspect proc´ edural.
Un exemple :
<?cible att1=’val1’ att2=’val2’ ?>
<message> Bye </message>
/ racine
|
+---+---+
| |
<?cible att1=’val1’ | inst. trait.
att2=’val2’ ?> |
|
message ´el´ement
|
"Bye" texte
• Cette instruction revient ` a appeler l’application cible en lui passant la valeur des attributs. Le sens des instructions de traitement d´ epend de l’application qui traite les documents XML.
• Voila un exemple : liaison entre XML et une feuille CSS.
<?xml-stylesheet
href="monStyle.css" media="screen"
II Types de noeud JJ
Dans un arbre XML (aussi appel´ e un arbre DOM), il existe six types de noeuds :
Type Nom Valeur Fils
racine non non oui
´ el´ ement oui non oui
attribut oui oui non
texte non oui non
commentaire non oui non
inst. de traitement non oui non
II Section litt´ erale JJ
Avec une section litt´ erale il est possible de stopper l’interpr´ etation des ca- ract` eres sp´ eciaux. La syntaxe est la suivante :
<![CDATA[ texte non soumi `a l’analyse ]]>
L’exemple pr´ ec´ edent devient
<texte>
<![CDATA[en HTML, la balise
<p> est tr`es utile !]]>
© J.-L. Massat
</texte>
II Prologue : version et encodage JJ
Le prologue (optionnel) doit ˆ etre plac´ e au d´ ebut du document :
<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<message> Hello </message>
• L’encodage est bas´ e sur la norme ISO 10646 (Unicode). L’encodage par d´ efaut est UTF-8 ou UTF-16.
. UCS-4 : Universal Character Set, . UCS-2 : 2
16possibilit´ es (BMP),
. UTF-16 : c’est UCS-2 plus une partie de UCS-4 (2
16moins 2
10plus 2
20possibilit´ es).
. UTF-8 : codage de UTF-16 sur 8 bits.
• La version est 1.0 (Unicode 2.0) ou 1.1 (Unicode 4.0). La version par
d´ efaut est 1.0.
II Les espaces de noms JJ
Un probl` eme apparait si on m´ elange deux documents XML dont les ´ el´ ements ont le mˆ eme nom mais pas la mˆ eme d´ efinition. Par exemple
<produit>
<nom> ... </nom>
<description>
<taille> ... </taille>
<poids> ... </poids>
</description>
</produit>
<fournisseur>
<nom> ... </nom>
<description>
<adresse> ... </adresse>
<telephone> ... </telephone>
</description>
</fournisseur>
I Enrichir le nom des ´ el´ ements J
• Pour supprimer ces ambigu¨ ıt´ es, nous allons enrichir le nom des ´ el´ ements.
Il est maintenant compos´ e d’une partie locale et d’un espace de noms (qui est une URL).
<produit xmlns=’http://www.dil.univ-mrs.fr’>
<nom>...</nom>
<description>...</description>
</produit>
• Chaque r´ edacteur de document XML choisi l’espace de nom dans lequel il va cr´ eer ses ´ el´ ements.
• L’attribut xmlns (XML namespace ) fixe l’espace de nom par d´ efaut de l’´ el´ ement et de tous les sous ´ el´ ements (sauf indication contraire).
• Les espaces de noms doivent ˆ etre utilis´ es si un document XML est destin´ e
`
a ˆ etre m´ elang´ e ` a d’autres sources.
I Utiliser plusieurs espaces de noms J
• Pour faciliter plusieurs utilisations d’un espace de noms nous allons lui associer un surnom appel´ e le pr´ efixe.
<com:produit xmlns:com=’http://www.biz.com/commercial’>
<com:nom> ... </com:nom>
<com:description> ... </com:description>
<achat:fournisseur xmlns:achat=’http://www.biz.com/achat’>
<achat:nom> ... </achat:nom>
<achat:description> ... </achat:description>
</achat:fournisseur>
</com:produit>
Il est possible de rassembler la d´ efinition des pr´ efixes dans la racine et de les utiliser ensuite.
• Attention, le pr´ efixe n’est qu’une macro. C’est l’espace de nom qui
compte.
I Espace de noms, attributs et identificateurs J
Les attributs et les identificateurs peuvent b´ en´ eficier des espaces de noms.
Dans ce cas, l’utilisation d’un pr´ efixe est obligatoire.
<com:produit xmlns:com="http://www.biz.com/commercial" >
<com:prix com:monnaie = "com:Euro" >
100
</com:prix>
</com:produit>
II Style XML JJ
• Il faut coder les ´ el´ ements qui structurent le texte :
<paragraphe> texte du paragraphe </paragraphe>
mais ´ eviter
<paragraphe>
<ligne> Premi`ere ligne. </ligne>
<ligne> Deuxi`eme ligne. </ligne>
</paragraphe>
• Il faut remplacer le marquage typographique par un marquage s´ emantique. Le code
<p> Notre adresse <tt>www.dil.univ-mrs.fr</tt> appartient au <it>Departement Informatique</it>. </p>
devient
<texte>
Notre adresse <url>www.dil.univ-mrs.fr</url> appartient au <definition>Departement Informatique</definition>.
</texte>
• Eviter les ´ commentaires structur´ es et pr´ ef´ erer les m´ eta-informations.
Par exemple, le code
<personne>
<!-- mise `a jour le 10/11/18 -->
<nom>...</nom>
...
</personne>
doit ˆ etre ´ evit´ e au profit de
<personne>
<comment> mis `a jour le 10/11/18 </comment>
<nom>...</nom>
...
</personne>
• Soigner le choix entre attribut et sous-´ el´ ement. Les donn´ ees doivent ˆ etre plac´ es dans des ´ el´ ements.
Attention : seuls les ´ el´ ements sont exploitables par des feuilles de style
Pr´ esentation des DTD ( Do-
cument Type Definition )
II Introduction JJ
I Composantes d’une DTD J
• Les DTD viennent de SGML.
• La version XML est une simplification de la version SGML.
• Dans une DTD on trouve :
• des d´ eclarations d’´ el´ ements,
• des d´ eclarations d’attributs,
• des d´ eclarations d’entit´ es : . internes XML,
. externes XML ou non XML.
I Lien entre XML et DTD J
• La r´ ef´ erence ` a la DTD doit ˆ etre plac´ ee au d´ ebut du fichier :
hello.dtd
<!ELEMENT hello (#PCDATA) >
Fichier hello.xml valide
<!DOCTYPE hello SYSTEM "http://monserveur.fr/dtds/hello.dtd" >
<hello>Hello</hello>
• On peut enrichir la DTD avec des d´ eclarations locales plac´ ees le document XML :
<!DOCTYPE bye SYSTEM "http://monserveur.fr/dtds/hello.dtd" [
<!ELEMENT bye EMPTY >
]>
• On peut mˆ eme se passer de la DTD :
<!DOCTYPE bye [
<!ELEMENT bye EMPTY >
]>
<bye />
• Un document XML bien form´ e qui respecte sa DTD est dit valide. Il est plus facile d’´ ecrire des feuilles de style pour les documents valides !
• Les URL de DTD relatives sont interpr´ et´ ees ` a partir de la position du do-
cument XML.
II D´ efinition des ´ el´ ements JJ
I Contenu libre J
Dans ce cadre il n’y a aucune contrainte sur le contenu d’un ´ el´ ement :
<!ELEMENT doc ANY>
Exemples :
El´ ´ ements XML valides
<doc> Ceci est une <i>documentation</i> tr`es simple. </doc>
<doc> Un simple texte </doc>
<doc />
I Contenu vide J
C’est la contrainte la plus forte, le contenu doit ˆ etre vide :
<!ELEMENT ´el´ement-vide EMPTY>
Exemples :
El´ ´ ements XML valides
<´el´ement-vide></´el´ement-vide>
<´el´ement-vide/>
<´el´ement-vide />
I Contenu textuel J
L’´ el´ ement doit contenir du texte (´ eventuellement vide) analysable dans l’en- codage du document (Parsed Character Data) :
<!ELEMENT comment (#PCDATA)>
Exemples :
El´ ´ ements XML valides
<comment>
Un commentaire sur
la balise <![CDATA[<p>]]> et <i>
</comment>
<comment><!-- no comment --></comment>
<comment/>
I Contenu compos´ e J
Le contenu est compos´ e de plusieurs parties ordonn´ ees :
<!ELEMENT produit (nom,prix)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prix (#PCDATA)>
Exemple :
El´ ´ ement XML valide
<produit>
<nom>XML par la pratique</nom>
<prix>20</prix>
</produit>
I Contenu alternatif J
Plusieurs choix sont possibles pour construire le contenu :
<!ELEMENT reponse (oui|non)>
<!ELEMENT oui EMPTY>
<!ELEMENT non EMPTY>
El´ ´ ements XML valides
<reponse> <oui/> </reponse>
<reponse> <non></non> </reponse>
I Contenu combin´ e J
L’utilisation des parenth` eses permet de combiner les contenus compos´ es et alternatifs :
<!ELEMENT personne (nom,((adr,ville)|(email,web))) >
El´ ´ ements XML valides
<personne>
<nom>Pierre</nom>
<adr>49 Bd de la R´evolution</adr>
<ville>Marseille</ville>
</personne>
<personne>
<nom>Paul</nom>
<email> [email protected] </email>
<web> http://monsite.fr </web>
</personne>
I R´ ep´ etition de contenu J
Les caract` eres ? , + , * ajout´ es ` a un contenu permettent de le r´ ep´ eter res- pectivement de 0 ` a 1 fois ( ? ), de 1 ` a n fois ( + ) ou de 0 ` a n fois ( * ).
<!ELEMENT chapitre (
nom, date?, auteur*, intro?,
(nom-de-section,corps-de-section)+ )>
Document XML valide
<chapitre>
<nom>Utiliser les DTD</nom>
<date>10/11/2002</date> <!-- optionnel -->
<!-- 0 `a n fois -->
<auteur>...</auteur><auteur>...</auteur>
<!-- optionnel -->
<intro>...</intro>
<!-- 1 `a n fois -->
<nom-de-section>Pr´eambule</nom-de-section>
<corps-de-section>...</corps-de-section>
</chapitre>
Cette version est pr´ ef´ erable :
<chapitre>
...
<section>
<nom-de-section>Pr´eambule</nom-de-section>
<corps-de-section>...</corps-de-section>
</section>
</chapitre>
voir mˆ eme
<chapitre>
...
<section>
<nom>Pr´eambule</nom>
<corps>...</corps>
</section>
</chapitre>
I Contenu mixte J
Le contenu mixte d´ enote un m´ elange entre texte et ´ el´ ements XML (l’´ etoile * est obligatoire) :
<!ELEMENT p (#PCDATA|b|i|tt)* >
El´ ´ ement XML valide
<p>Un <i>exemple</i> <b>important</b> de paragraphe <tt>HTML</tt></p>
On peut noter sur cet exemple les six noeuds fils de l’´ el´ ement p (trois de type
texte et trois de type ´ el´ ement).
II D´ efinition des attributs JJ
I D´ eclaration d’attribut J
• Syntaxe :
<!ATTLIST nom_´el´ement
nom_attribut_1 type_attribut_1 d´eclaration_de_d´efaut_1 nom_attribut_2 type_attribut_2 d´eclaration_de_d´efaut_2 ...
>
• Les d´ eclarations de d´ efaut :
’valeur’ valeur par d´ efaut,
#REQUIRED l’attribut doit ˆ etre renseign´ e,
#IMPLIED l’attribut est facultatif,
#FIXED ’valeur’ l’attribut a toujours la mˆ eme valeur
I Contenu textuel (CDATA) J
Les attributs de type CDATA contiennent des chaˆ ınes de caract` eres (les ca- ract` eres < et & ne sont pas autoris´ es).
<!ELEMENT a ANY>
<!ATTLIST a b CDATA #IMPLIED c CDATA ’Hello’
>
Exemples :
El´ ´ ements XML valides
<a b="coucou" c="10"> ... </a>
<a b="coucou & salut" />
<a/>
I Identificateurs XML (NMTOKEN) J
Un attribut de type NMTOKEN ou NMTOKENS contient un ou plusieurs identifica- teurs XML s´ epar´ es par des blancs (espace, tabulation et/ou retour chariot) :
<!ELEMENT exercice (#PCDATA)>
<!ATTLIST exercice niveau NMTOKENS #IMPLIED>
Documents XML valides :
<exercice niveau="facile"> ... </exercice>
<exercice niveau="difficile facultatif"> ... </exercice>
I Liste d’identificateurs J
Exemple :
<!ELEMENT prix (#PCDATA)>
<!ATTLIST prix monnaie (euros|dollars) #REQUIRED>
Document XML valide :
<prix monnaie="euros"> 10 </prix>
Les valeurs possibles doivent ˆ etre des identificateurs (tokens) XML. Les listes
de valeurs n’existent que pour les attributs.
I Identifiant (ID) et r´ ef´ erence (IDREF ou IDREFS) J
Un attribut de type ID contient un identificateur XML qui doit ˆ etre unique dans le document (unicit´ e des clefs).
Un attribut de type IDREF contient un identificateur XML (ou plusieurs pour IDREFS ) qui doit ˆ etre pr´ esent dans un attribut typ´ e ID du document (contrainte de r´ ef´ erence).
Exemple de DTD
<!ELEMENT p (#PCDATA)>
<!ATTLIST p clef ID #IMPLIED>
<!ELEMENT lien (#PCDATA)>
<!ATTLIST lien ref IDREF #REQUIRED>
Document XML valide
<p clef=’intro’> Ceci est une intro... </p>
Ce d´etail est expliqu´e dans
II D´ efinition des entit´ es JJ
I Les entit´ es internes J
Les entit´ es internes sont des macros qui permettent de factoriser et de param´ etrer les documents XML.
<!ENTITY nom_entit´e "valeur">
Caract´ eristiques :
• les r´ ef´ erences se font par &nom entit´ e;
• les d´ efinitions circulaires sont interdites,
• le d´ eveloppement se fait ` a la demande,
• ils sont utilisables dans les documents XML.
Exemple :
<!ENTITY dom.luminy "univ-mrs.fr" >
<!ENTITY dom.dil "dil.&dom.luminy;" >
Fragment de document XML valide :
<email> massat@&dom.dil; </email>
<a href="http://www.&dom.dil;">...</a>
I Les entit´ es externes XML J
Les entit´ es externes XML permettent d’inclure des documents XML iden- tifi´ es par une URL.
<!DOCTYPE livre SYSTEM "livre.dtd"
[
<!ENTITY chap1 SYSTEM "chapitre1.xml.inc">
<!ENTITY chap2 SYSTEM "chapitre2.xml.inc">
]
>
<livre> &chap1; &chap2; </livre>
Contraintes sur le document XML inclu :
• il peut contenir un prologue (encodage),
• pas de r´ ef´ erence ` a une DTD,
• il doit ˆ etre bien form´ e, c’est ` a dire contenir un ´ el´ ement complet,
I Les entit´ es externes non XML J
Une entit´ e externe non XML peut contenir n’importe quoi (image, son, donn´ ees, etc.). Nous devons donc, au pr´ ealable, d´ efinir un type :
<!NOTATION nom_du_type SYSTEM "url_associ´e_au_type">
Par exemple :
<!NOTATION JPEG SYSTEM "JPG">
<!NOTATION JPG SYSTEM "JPG">
<!NOTATION PNG SYSTEM "http://www.w3.org/TR/REC-png">
<!NOTATION SWF SYSTEM "http://www.macromedia.com/software/flash">
I Les entit´ es externes non XML (suite) J
On peut ensuite d´ efinir l’entit´ e externe non XML :
<!ENTITY maison SYSTEM "maison.jpg" NDATA jpeg>
La r´ ef´ erence &maison; est impossible (ce n’est pas du XML). Son utilisation doit passer par un attribut typ´ e entit´ e externe non XML :
DTD : | <!ELEMENT image EMPTY>
| <!ATTLIST image src ENTITY #REQUIRED>
XML : | <image src="maison"/> <!-- pas de &..; -->
L’attribut peut ´ egalement ˆ etre typ´ e ENTITIES , on peut dans ce cas lui associer
plusieurs entit´ es externes non XML.
II Les clauses INCLUDE et IGNORE JJ
Deux exemples :
<![IGNORE[
... partie de la DTD `a ignorer ...
]]>
et
<![INCLUDE[
... partie de la DTD `a traiter ...
]]>
II Les entit´ es param` etres JJ
I Les entit´ es param` etres internes J
Les entit´ es param` etres sont des macros qui permettent de factoriser et de param´ etrer les DTD. Syntaxe :
<!ENTITY % nom_entit´e "valeur">
Le r´ ef´ erencement se note %nom entit´ e;
<!ENTITY % statut
"statut (public|priv´e) #IMPLIED">
<!ELEMENT article (#PCDATA)>
<!ATTLIST article date CDATA #IMPLIED
%statut;
>
I Les entit´ es param` etres externes J
Les entit´ es param` etres externes permettent d’inclure des DTD externes.
<!ENTITY % chapitre
SYSTEM "chapitre.mod">
<!ENTITY % tableau
SYSTEM "http://monserveur.fr/dtd/tableau.mod">
%chapitre;
%tableau;
II Partie interne / externe JJ
<!DOCTYPE livre SYSTEM "livre.dtd"
[
... partie interne ...
]
>
• La partie interne est trait´ ee avant la partie externe.
• Il est donc possible de faire varier la DTD ` a partir des d´ eclarations internes.
• Les clauses IGNORE et INCLUDE ne sont pas utilisables dans la partie interne.
II Les sections conditionnelles JJ
texte.dtd
<!ENTITY % attr.date ’IGNORE’>
<!ELEMENT para ANY>
<!ELEMENT titre ANY>
<![%attr.date;[
<!ATTLIST para date CDATA #IMPLIED>
<!ATTLIST titre date CDATA #IMPLIED>
]]>
Document XML valide
<!DOCTYPE para SYSTEM "texte.dtd" [
<!ENTITY % attr.date ’INCLUDE’>
]>
<para date="10/01/2015" >Un message</para>
II La DTD DocBook JJ
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" >
<article>
<title>foo</title>
<section>
<title>sect1</title>
<para>This is a paragraph.</para>
<blockquote><para>This is a block quote.</para></blockquote>
<section>
<title>section 1.1</title>
<para>This is a paragraph with a <citetitle>title
citation</citetitle>, a <command>hello</command>, and some
<computeroutput>computer output</computeroutput>. </para>
<itemizedlist>
<listitem><para>this is a list item.</para></listitem>
</itemizedlist>
</section>
</section>
I Les d´ eclarations de caract` eres J
...
<!ENTITY aacute "á"> <!ENTITY Aacute "Á">
<!ENTITY acirc "â"> <!ENTITY Acirc "Â">
<!ENTITY agrave "à"> <!ENTITY Agrave "À">
<!ENTITY aring "å"> <!ENTITY Aring "Å">
<!ENTITY atilde "ã"> <!ENTITY Atilde "Ã">
<!ENTITY auml "ä"> <!ENTITY Auml "Ä">
<!ENTITY aelig "æ"> <!ENTITY AElig "Æ">
<!ENTITY ccedil "ç"> <!ENTITY Ccedil "Ç">
<!ENTITY eth "ð"> <!ENTITY ETH "Ð">
<!ENTITY eacute "é"> <!ENTITY Eacute "É">
<!ENTITY ecirc "ê"> <!ENTITY Ecirc "Ê">
<!ENTITY egrave "è"> <!ENTITY Egrave "È">
<!ENTITY euml "ë"> <!ENTITY Euml "Ë">
<!ENTITY iacute "í"> <!ENTITY Iacute "Í">
<!ENTITY icirc "î"> <!ENTITY Icirc "Î">
<!ENTITY igrave "ì"> <!ENTITY Igrave "Ì">
<!ENTITY iuml "ï"> <!ENTITY Iuml "Ï">
<!ENTITY ntilde "ñ"> <!ENTITY Ntilde "Ñ">
...
I Les d´ eclarations de notations J
...
<!ENTITY % local.notation.class "">
<!ENTITY % notation.class
"BMP| CGM-CHAR | CGM-BINARY | CGM-CLEAR | DITROFF | DVI
| EPS | EQN | FAX | GIF | GIF87a | GIF89a
| JPG | JPEG | IGES | PCX
| PIC | PNG | PS | SGML | TBL | TEX | TIFF | WMF | WPG
| linespecific
%local.notation.class;">
<!NOTATION BMP PUBLIC "+//ISBN 0-7923-9432-1:: ...">
<!NOTATION CGM-CHAR PUBLIC "ISO 8632/2//NOTATION ...">
<!NOTATION CGM-BINARY PUBLIC "ISO 8632/3//NOTATION ...">
<!NOTATION CGM-CLEAR PUBLIC "ISO 8632/4//NOTATION ...">
<!NOTATION DITROFF SYSTEM "DITROFF">
<!NOTATION DVI SYSTEM "DVI">
<!NOTATION EPS PUBLIC "+//ISBN 0-201-18127-4:: ...">
I D´ eclarations des ´ el´ ements J
<!ELEMENT title (%title.char.mix;)*>
<!ATTLIST title
%pagenum.attrib; %common.attrib;
%title.role.attrib; %local.title.attrib; >
<!ELEMENT subtitle (%title.char.mix;)*>
<!ATTLIST subtitle
%common.attrib; %subtitle.role.attrib;
%local.subtitle.attrib; >
On remarque dans cet extrait que le contenu des ´ el´ ements n’est jamais donn´ ee
directement. Les r´ edacteurs de DTD passent g´ en´ eralement par une entit´ e
param` etre.
I D´ eclarations des contenu d’´ el´ ements J
<!ENTITY % pagenum.attrib "pagenum CDATA #IMPLIED">
<!ENTITY % local.common.attrib "">
<!ENTITY % common.attrib
"id ID #IMPLIED
revisionflag (changed|added|deleted|off) #IMPLIED
%local.common.attrib;" >
<!ENTITY % local.title.char.mix "">
<!ENTITY % title.char.mix
"#PCDATA|%gen.char.class;|%link.char.class;
|%tech.char.class;|%docinfo.char.class;
|%inlineobj.char.class; %local.title.char.mix;">
<!ENTITY % local.gen.char.class "">
<!ENTITY % gen.char.class
"abbrev|acronym|citetitle|emphasis|footnote|phrase
|quote|trademark %local.gen.char.class;">
Les entit´ es param` etres local.xxx permettent d’´ etendre cette DTD en ajou-
Le langage de requˆ ete XPATH
II Introduction JJ
I Pr´ esentation J
• Le langage XPATH offre un moyen d’identifier un ensemble de noeuds dans un document XML.
• Toutes les applications ayant besoin de rep´ erer un fragment de document XML peuvent utiliser ce langage.
• Les feuilles de style XSL, les pointers XPOINTER et les liens XLINK utilisent de mani` ere intensive les expressions XPATH.
• XPATH est un premier pas vers un langage d’interrogation d’une base de
donn´ ees XML (XQuery).
I Structure d’arbre d’un document XML J
produit produit
prix
nom comment
stock
Livre 50 Un commentaire /
monnaie=’Francs’
nom
CD
prix
23
monnaie=’Euros’
<!−− −−>
Texte <!−− −−>
Texte
<!-- Texte -->
<stock>
<produit>
<nom> Livre </nom><prix monnaie="Francs"> 50 </prix>
<comment> Un commentaire </comment>
</produit>
<produit>
<nom> CD </nom><prix monnaie="Euros"> 23 </prix>
</produit> <!-- Texte -->
I Les expressions XPATH J
La forme g´ en´ erale d’une expression XPATH est
• 10 ou 10.12 un nombre r´ eel (cod´ e en virgule flottant)
• ’Hello’ ou "Hello" une chaˆ ıne de caract` eres
• nom de fonction() l’appel ` a une fonction
• expr1 + expr2 une op´ eration ( + , - , mod , div ) (nombre)
• expr1 = expr2 un test d’´ egalit´ e ( = , != ) (bool´ een)
• expr1 > expr2 une comparaison ( < , <= , > , >= ) (bool´ een)
• expr1 or expr2 ou expr1 and expr2 (bool´ een)
• (expression) une parenth` ese
• chemin un chemin (ensemble de noeuds)
I Les chemins J
Un chemin a la forme suivante :
• /s´ electeur1/s´ electeur2/... un chemin absolu
• s´ electeur1/s´ electeur2/... un chemin relatif
Chaque s´ electeur s´ electionne un ensemble de noeuds en fonction du r´ esultat du s´ electeur pr´ ec´ edent.
L’ensemble initial est soit le noeud courant (forme relative) soit la racine (forme absolue).
Exemple : /stock/produit/comment
{ / } --> stock -->
{ /stock } --> produit -->
{ /stock/produit[1], /stock/produit[2] } --> comment -->
I Les s´ electeurs de noeuds J
Les s´ electeurs de noeuds sont de la forme :
axe :: filtre [ condition1 ][ condition2 ]...
• l’axe indique un sens de recherche,
• le filtre s´ electionne un type de noeud,
• les conditions s´ electionnent sur le contenu.
Les parties axe :: et [ condition ] sont optionnelles.
II Les axes de recherche JJ
I Les axes en avant J
Les axes qui permettent de descendre dans l’arbre : child
les fils du noeud courant (c’est l’axe par d´ efaut). Ces deux expressions sont identiques :
produit/child::nom
produit/nom
self
le noeud courant,
/stock/produit[ prix > 10 ]/self::produit[ prix < 99 ]
/stock/produit/self::prix r´esultat vide
I Les axes en avant (suite) J
descendant
les descendants du noeud courant
/stock/descendant::prix
descendant-or-self
les descendants du noeud courant plus lui-mˆ eme.
I Les axes en arri` ere J
Les axes qui permettent de remonter dans l’arbre : parent
le noeud parent du noeud courant (si il existe),
/stock/produit/comment/parent::produit/prix
ancestor
les ascendants du noeud courant
/stock/produit/comment/ancestor::stock/produit
ancestor-or-self
que dire ?
I Les axes ` a droite et ` a gauche J
following-sibling
les noeuds fr` eres plac´ es apr` es le noeud courant,
produit
produit produit
stock
preceding-sibling
les noeuds fr` eres plac´ es avant le noeud courant,
I Les axes avant et apr` es J
following
les noeuds plac´ es apr` es dans le document,
produit produit
prix
nom comment nom prix
stock
preceding
les noeuds plac´ es avant dans le document,
I Les axes pour les attributs J
attribute
les noeuds de type attribut du noeud courant,
/stock/produit/prix/attribute::monnaie
namespace
les noeuds de type espace de nom du noeud courant,
II Les filtres JJ
I Filtrer les noeuds nomm´ es J
identificateur
les noeuds de l’axe qui portent ce nom.
/stock/produit/prix/attribute::monnaie
*
les noeuds de l’axe qui ont un nom (attribut ou ´ el´ ement)
/stock/*/prix/attribute::*
I Filtrer les noeuds textuels J
text()
tous les noeuds de type texte de l’axe.
/stock/produit/*/text()
I Filtrer les commentaires J
comment()
tous les noeuds de type commentaire de l’axe.
I Filtrer les instructions de traitement J
processing-instruction()
tous les noeuds de type instruction de traitement de l’axe,
I Filtrer les noeuds J
node()
tous les noeuds de l’axe sauf la racine,
/stock/produit/prix/node()
II Simplifications JJ
Afin d’´ eviter une trop grande lourdeur, les simplifications suivantes sont auto- ris´ ees :
originale simplifi´ ee exemple
child:: /stock/produit
attribute:: @ /prix/@monnaie
/descendant-or-self::node()/ // //prix
self::node() . prix[. = 10]
parent::node() .. prix/../nom
[position() = x] [x] produits[4]
II Les types de base de XPATH JJ
Il existe quatre types de base : bool´ een, chaˆ ıne de caract` eres, nombre r´ eel et ensemble de noeuds.
Chaˆ ıne de caract` eres :
• ’chaine de caract` eres’ ou "chaine de caract` eres"
• string(expression)
string(10) = ’10’
string(20.300) = ’20.3’
string(/stock/*/nom) = ’ Livre ’ (le premier noeud)
string(/stock/produit) = ’ Livre 50 ... ’ (concat´enation des noeuds text()) string(/stockx) = ’’
Bool´ een :
• true() ou false()
• boolean(expression) renvoie vrai ssi l’argument est . le bool´ een vrai
. un nombre diff´ erent de z´ ero
. la chaˆ ıne de longueur sup´ erieure ` a z´ ero . un ensemble de noeuds non vide
boolean(10) = true
boolean(0) = false
boolean(’hello’) = true
boolean(’’) = false
boolean(true()) = true boolean(false()) = false boolean(/stock/produit) = true boolean(/stock/comment) = false
Nombre r´ eel :
• 100 ou 234.56
• number( expression )
number(10) = 10
number(’10.12’) = 10.12 number(’ 10.120 ’) = 10.12
number(’ 10x ’) = NaN (not a number)
number(true()) = 1
number(false()) = 0
number(/stock/*/prix) = 50 (le premier) number(/stock/prix) = NaN
II Les conditions JJ
Rappel : les s´ electeurs de noeuds sont de la forme :
axe :: filtre [ condition1 ][ condition2 ]...
D´ efinition : Un s´ electeur calcule
• les noeuds de l’axe
• qui respectent le filtre et
• pour lesquels les conditions (traduites en bool´ een) sont vraies.
I Condition d’existence J
S´ electionner un noeud en fonction de son contenu :
/stock/produit[ prix/attribute::monnaie ]
/stock/produit[ prix[ attribute::monnaie ] ]
Ces expressions s´ electionnent les noeuds produit ` a condition qu’un prix existe avec l’attribut monnaie pr´ ecis´ e.
Remarque : les sous-expressions sont souvent relatives.
Un exemple ´ etrange :
/stock/produit[ /stock/*/prix ]
I Condition de position J
num´ ero
vraie ssi le noeud courant a cette position dans le contexte courant.
produit[ 2 ][ comment ]
produit[ comment ][ 2 ]
La premi` ere expression s´ electionne les noeuds produit en deuxi` eme po-
sition si il poss` ede un ´ el´ ement fils comment , la seconde s´ electionne le
deuxi` eme noeud produit qui poss` ede un ´ el´ ement fil comment .
I Les conditions logiques J
Les relations portent sur deux sous-expressions XPATH : exp1 relation exp2
vraie ssi il existe n1 (dans le r´ esultat de exp1 ) et n2 (dans le r´ esultat de exp2 ) qui respectent la relation. Les relations possibles sont
= != < <= > >=
produit[ prix = 100 ]
les produits qui ont un prix ` a 100.
produit[ prix != 100 ]
les produits qui ont un prix diff´ erent de 100.
produit[ prix < //prix ]
tous les produits sauf les plus on´ ereux.
Conversion : Pour l’´ egalit´ e, la conversation est automatique pour les nombres et les bool´ eens. Pour les relations d’ordre, la conversion en nombre est au- tomatique.
Quelques expressions vraies :
• (10 = ’10.0’)
• (10 < ’12.0’)
• (’10.3’ < ’12.0’)
• (true() = "faux")
I Les conditions logiques (2) J
condition1 and condition2
vraie ssi les deux conditions le sont ´ egalement.
produit[prix > 10 and comment]
condition1 or condition2
vraie ssi au moins une des deux conditions est vraie.
II Fonctions & op´ erations JJ
Les fonctions et op´ erations sont utilisables dans
• les expressions logiques,
• les clauses <xsl:value-of .../> des feuilles de style XSL.
I Op´ erations et fonctions sur les nombres J
+ , - , mod , div ,
op´ erations utilisables sur les nombres (conversion automatique).
produit[(prix div 10) = (prix mod 10)]
sum( noeuds )
renvoie la somme des noeuds apr` es les avoir transform´ es en nombre.
count( noeuds )
renvoie le nombre de noeuds.
floor( nombre )
arrondi par le bas.
ceiling( nombre ) arrondi par le haut.
round( nombre )
arrondi par le plus proche.
I Fonctions sur les bool´ eens J
true() et false() constantes
not( boolean )
vraie ssi le param` etre est faux.
produit[not(prix != 100)]
tous les prix sont ´ egaux ` a 100.
I Fonctions sur les noeuds J
last()
renvoie le nombre de noeuds dans le contexte du noeud courant.
//produit[last()] le dernier produit
//produit[last()-1] l’avant dernier produit
position()
renvoie la position du noeud courant dans son contexte.
//produit[position() = 1] le premier produit
//produit[position()<last()] les produits sauf le dernier
local-name( noeud )
renvoie la partie locale de l’´ etiquette d’un noeud.
namespace-uri( noeud )
renvoie la partie espace de nom de l’´ etiquette d’un noeud.
name( noeud )
renvoie l’´ etiquette d’un noeud.
id( chaines )
renvoie les noeuds identifi´ es par au moins une des ´ etiquettes,
id(’CD’)/prix
id(’CD Voiture SX2500 CD’)/prix
id( /reference/attribute::ref )/prix
I Fonctions sur les chaˆ ınes J
string( objet )
renvoie une version chaˆ ıne du param` etre.
concat( chaˆ ıne1 , ..., chaˆ ıneN ) concat´ enation de chaˆ ınes.
string-length( chaˆ ıne )
renvoie la longueur d’une chaˆ ıne.
normalize-space( chaˆ ıne )
renvoie une version normalis´ ee (suppression des blancs au d´ ebut et ` a la fin et remplacement de toute suite de blancs par un seul).
normalize-space(’ AB CD E ’) = ’AB CD E’
les blancs comprennent l’espace, le retour ` a la ligne (codes 10 et 13)
et la tabulation (code 9).
translate( ch1 , ch2 , ch3 )
renvoie une copie de ch1 dans laquelle les caract` eres pr´ esents dans ch2 sont remplac´ es par les caract` eres de mˆ eme position dans ch3.
translate(’ABCD’, ’AC’, ’ac’) = ’aBcD’