Vous êtes sur la page 1sur 229

Le Méta-Langage XML

2ème GI
Ecole Hassania des Travaux Publics

Mohammed Karim GUENNOUN

1
Généralités et historique

2
Le concept de document électronique

 ISO TC-46: un document est un "ensemble formé par un


support et une information"
 Wikipedia: "un document électronique signifie toute
donnée informatique qui doit être utilisée sous forme
informatique. À l'inverse du document matériel, le
document électronique peut permettre de séparer
l'aspect présentation (mise en forme, mise en page...) et
l'aspect information (contenu, données...), offrant alors la
possibilité d’une exploitation séparée."
 Un document possède un fond (structure logique) et une
forme (structure physique)
 Il peut correspondre à plusieurs formes: textes, croquis,
tableaux, images…
3
La structure d’un document

 Structure logique
– Correspond au contenu du document
(l’information)
 Titre, chapitres, sections, figures, notes de bas de page…
 Structure physique
– Correspond à la forme et à la présentation du
document
 Police, style, taille, couleur des caractères, alignement,
espacement…

4
Structure logique: exemple
<Article>
<Titre> XML: eXtensible Markup Language </Titre>
<Auteur>Wikipédia</Auteur>
<Section titre = "Introduction">
<Paragraphe>XML (Extensible Markup Language, « langage de balisage
extensible ») est un langage informatique de balisage générique. Le W3C
recommande XML pour exprimer des langages de balisages spécifiques
(exemples : XHTML, SVG, XSLT).
</Paragraphe>
<Paragraphe> Son objectif initial est de faciliter l'échange automatisé de
contenus entre systèmes d'informations hétérogènes, notamment, sur
Internet. XML est un sous-ensemble de SGML dont il retient plusieurs
principes dont : la structure d'un document XML est définissable et validable
par un schéma, un document XML est entièrement transformable dans un
autre document XML.
</Paragraphe>
5 </Section>
</Article>
Structure physique: exemple

<Article>
<Titre police="Times" taille="24" position="centré" format="gras"/>
<Auteur police="Times" taille="20" position="centré" format="italique"/>
<Section numero="1" police="Times" taille="18" position="centré"
format=" gras "/>
<Paragraphe police="Times" taille="18" position="justifié"/>
</Article>

6
W3C
 W3C: World Wide Web Consortium
 Fondé en 1994 par Tim Berners-Lee avec l’aide du
MIT/LCS, DARPA, et la INRIA-commission Européenne
 Consortium international dispatché sur plusieurs sites et
géré par:
– MIT/LCS aux US
– INRIA puis ERCIM en Europe
– Keio University au Japon / université Beihang en Chine
 452 membres: e.g. IBM, Microsoft, Oracle…
 Objectifs: accroître le potentiel et l’utilisation du Web
– Leitmotiv: Un seul web partout et pour tous
– Production de standards et de normes
7 – Définition de techniques, langages, architectures pour l’échange
de l’information sur le Web
Chronologie des langages pour le
traitement des documents

 SGML: Standard Generalized Markup Language


– Norme internationale ISO 8879
– 1986, révisée en 1988 et 1994
– Méta-langage général
 HTML: HyperText Markup Language
– Standard W3C pour le formatage des documents sur le
Web
– 1991, 1995, 01/1997, 12/1997, 2008
 XML: eXtensible Markup Language
– Standard W3C
– Méta-langage simplifié compatible SGML

8
SGML
 Un méta-langage de balisage de documents
– Lisible par l’être humain
– Traitable par une machine
– Permet de définir des langages de balisage
 Implique la notion de validité d’un document
 Séparation du fond et de la forme
– Structure logique identifiée par des balises insérées dans le document
– Mise en page définie en dehors dans des feuilles de style
– Possibilité de multiplier les présentations selon le support de présentation
 Support des traitements sur le contenu sans prise en compte de la
forme
 Format de stockage et d’échange normalisé
 Faiblesse principale:
– Lourdeur et complexité de mise en œuvre
9
HTML

 Standard W3C comme format pour les documents à


travers le Web
 S’intéresse principalement à l’aspect présentation
– Balises standardisées pour la mise en forme
 Standard reconnu par tous les navigateurs Web
 Faiblesses:
– Normalisation des différentes balises
– Mélange des structures logique et physique
– Difficulté à trouver l’information et à la traiter

10
Introduction aux bases
d’XML

11
eXtensible Markup Language
Qu’est-ce que c’est?

 XML: un langage textuel d’échange et de stockage


de documents basé sur le balisage
– Langage de description générique
 Développé par XML Working Group dirigé par le
W3C depuis 1996
 Plus simple que SGML
 Plus ouvert et rigoureux que HTML
 XML 1.0, recommandation officielle du W3C depuis
le 10 Février 1998
– V1.1: 2004
 Devenu le standard dominant pour les échanges de
12 données à travers le Web
eXtensible Markup Language
Qu’est-ce que ça doit faire?

 Specification du 10 février 1998: “Its goal is to enable


generic SGML to be served, received, and processed on
the web in the way that is now possible with HTML”.
 Objectifs principaux fixés par le W3C
– Il doit être facile d’éditer et de lire des documents XML
– XML est destiné à être utilisé sans difficulté sur le Web
– XML doit pouvoir être utilisé dans une grande variétés
d’applications
– XML doit être compatible avec SGML et HTML
– L’exploitation de programmes pour le traitement de documents
XML doit être aisée
– Les documents XML doivent être lisibles et compréhensibles par
13 l’homme
– La conception de XML doit être formelle et concise
eXtensible Markup Language
Pourquoi c’est si bien?

 Séparation de la structure et de la
présentation
 Plus simple que SGML
 Idéal pour l’échange de données
 Compréhensible par l’homme et les
machines
 Utilisable entre machines hétérogènes

14
XML vs HTML
 Comme c’est le cas pour HTML,
– les données sont identifiées grâce à des tags (identifiants
entre "crochets angulaires" <…>)
– Collectivement, les tags sont désignés par le terme
balisage (Markup)
 Contrairement à HTML,
– les tags identifient des données au lieu de spécifier
comment les présenter.
– e.g. les tags HTML spécifient quelque chose comme:
afficher cette donnée en gras:
<b> quelque chose en gras </b>
– Les tags XML agissent comme un champs dans un
programme. Ils associent un label qui identifie une donnée:

15 <message>Ceci est mon message </message>


Concepts XML

 Balise ou tag ou label

 Élément de données

 Attribut

16
Les balises

 Les balises permettent de structurer les données


 De la même manière que pour les champs et les
attributs d’un objet, les noms des balises sont libres
du moment qu’ils ont un sens pour l’application qui
va les utiliser
 Évidemment, pour des systèmes impliquant
plusieurs applications, il est nécessaire de se mettre
d’accord sur les noms des balises pour partager les
données XML

17
Les éléments de données

 Exemple pour un système d’échange de message:


<message>
<to>destinataire@ehtp.ac.ma</to>
<from>moi@ehtp.ac.ma</from>
<subject> XML est un langage très sympa </subject>
<text> XML est très utile pour ….</text>
</message>
 Chaque balise de début possède une balise de fin qui lui correspond
 L’information entre les deux tags identifie un élément de la donnée XML
 A part le tag racine, tous les autres tags sont complètement contenus à l’intérieur
d’un autre tag.
 On obtient une structuration hiérarchique des données
 Comme pour HTML, les espaces blancs sont ignorés. L’auteur est libre de formater
les données pour plus de lisibilité
 Contrairement à HTML, la recherche de données est facilitée grâce à leur
structuration
– Les tags XML identifient le contenu et non la présentation.
– e.g. rechercher les message avec "toto" comme destinataire
18
Les attributs

 Les tags peuvent contenir des attributs


– Informations additionnelles incluses comme une partie intégrante du tag à
l’intérieur des crochets
 Exemple:
<message to="destinataire@ehtp.ac.ma"
from="moi@ehtp.ac.ma"
subject="XML est un langage très sympa" >
<text> XML est très utile pour ….</text>
</message>
 Les tags to, from et subject sont maintenant des attributs. Cet exemple est
équivalent au précédent.
 Comme pour HTML,
– Les noms des attributs sont suivis par le signe égal
– Les attributs sont séparés par des espaces blancs
 Contrairement à HTML,
– les virgules entre les attributs ne sont pas ignorées. Si elles sont présentes elles
19 génèrent une erreur
Les tags vides

 Dans certains cas, il est pertinent d’avoir un tag sans contenu.


 Ce type de tag est appelé tag vide
 Un tag vide est terminé par "/>" au lieu de ">"
 Exemple:
<message to="destinataire@ehtp.ac.ma"
from="moi@ehtp.ac.ma"
subject="XML est un langage très sympa" >
<important/>
<text> XML est très utile pour ….</text>
</message>
 Ceci permet de coder <important/> au lieu de coder
<important> </important>

20
Les commentaires

 Les commentaires sont codés de la même manière


que pour HTML
– Contenues entre <!- - et -->
– Exemple:
<message to="destinataire@ehtp.ac.ma"
from="moi@ehtp.ac.ma"
subject="XML est un langage très sympa" >
<!- - ceci est un commentaire - ->
<important/>
<text> XML est très utile pour ….</text>
</message>

21
Le prolog
 Un fichier XML
– Un prolog
– Un corps

 Un fichier XML commence toujours par un prolog

 Le prolog minimal contient une déclaration qui identifie le


document comme un document XML:
– <?xml version="1.0"?>

 La déclaration peut contenir des informations


additionnelles
22 – <?xml version="1.0" encoding="ISO-88596-1" standalone="yes"?>
Les attributs du prolog

 La déclaration du prolog peut contenir les attributs suivants:


– version: identifie la version de l’XML utilisée. C’est un attribut obligatoire
– encoding: identifie l’ensemble des caractères utilisés pour encoder les données.
 Par défaut, c’est le 8-bit Unicode: UTF-8
 ISO-8859-1 correspond à Latin-1 de l’ensemble des caractères pour l’Europe de
l’ouest.
– standalone: spécifie si oui ou non, le document référence une entité externe ou
une spécification externe de types de données.
 S’il n’y a pas de référence externe, le mettre à "yes"
 Le prolog peut aussi contenir des définitions d’entités et des spécifications
qui précisent quels tags sont valides dans le document.
– Ces deux aspects peuvent être déclarés dans un Document Type Definition
(DTD)
– Il peut être directement défini dans le prolog ou en utilisant un pointeur sur un
fichier externe de spécification
 En général, le minimum c’est la version XML, mais c’est aussi une bonne
idée d’inclure l’encoding
23
Les instructions de traitement

 Un fichier XML peut aussi contenir des instructions de traitement qui


sont sensées spécifier des commandes à l’application qui traite les
données XML
 Possèdent le format suivant: <?Cible Traitements?>
– "Cible" pourrait correspondre au nom de l’application qui est susceptible
de réaliser le traitement
– "Traitements" est une chaîne de caractères qui pourrait englober
l’information et les commandes à exécuter par l’application
 Dans un fichier XML, on peut définir plusieurs instructions de
traitement pour différentes applications (parfois même pour faire la
même chose de manières différentes)
 La cible "xml" est réservée en majuscules et en minuscules.
– Du point de vue syntaxique, la déclaration est aussi une instruction de
traitement.
– Du point de vue sémantique, ce n’est pas le cas
24
Atouts d’XML

25
Les atouts d’XML (1)

 XML est un langage textuel


– XML n’est pas un format binaire
– Il est possible de créer et éditer un fichier XML
avec pratiquement tout, de l’éditeur de texte
standard à un environnement de développement
complexe

26
Les atouts d’XML (2)

 XML permet l’identification des données


– XML s’intéresse au type et à la structure des
données et non à leur présentation
– Les tags permettent d’identifier les informations
pertinentes et de séparer les données en
différentes parties
 Faciliter la recherche ciblée d’informations

27
Les atouts d’XML (3)

 Facilitation des traitements:


– L’aspect régulier et consistent des notations rend
facile l’implémentation de programmes pour traiter
les données
– XML est un standard neutre par rapport aux
vendeurs, choix libre concernant les parsers XML
 XML adopte la structuration hiérarchique
– la structure hiérarchique permet un accès et un
parcours plus efficace des données

28
Utilisations du langage
XML

29
Traitement classique des données

 XML est devenu LA représentation dominante pour les


données sur le Web
 C’est la base pour l’envoie et la récupération de données
pour les applications distribuées Client-Serveur
 C’est une réponse pour toutes sortes de transactions du
moment que les deux parties se mettent d’accord sur le
balisage à adopter.
– un effort considérable pour la définition de standards à base de
XML
– des mécanismes pour la traduction des tags telles que
 RDF (Ressource Description Framework) pour définir des meta-tags
 XSL (eXtensible Stylesheet Language) pour traduire des tags XML en
d’autres tags XML

30
Programmation dirigée par les
documents

 Une des utilisations principales d’XML est de construire des


documents qui décrivent la structure d’une application ou d’une
partie de l’application.
– Le document contient des références à des interfaces utilisateur et à des
composants logiciels qui sont assemblés pour créer une partie de
l’application "on-the-fly" via de la génération de code.

 Configurer les éléments du middleware: containers, serveur,


services de support…

 Combiner une utilisation d’XML et du langage Java est une


bonne option permettant la portabilité de l’application.

31
Construisons un
document XML

32
Un simple fichier XML

 Nous utilisons un exemple simple de


présentation par slides
 Nous pouvons utiliser n’importe quel éditeur
(e.g. Bloc-notes, vi, emacs…)
 Créer un fichier presentation.xml

33
La déclaration
 Coder le déclaration qui identifie le fichier comme un fichier
XML:
– <?xml version='1.0' encoding='utf-8'?>
– Cette ligne identifie le document comme un document XML
conforme à la version 1.0
– Elle spécifie qu’elle utilise le schéma 8-bit Unicode pour
l’encodage
– Le document n’est pas spécifié comme étant standalone, le parser
peut prendre en compte des références à des documents externes
 Ajouter un commentaire:
– Par défaut, les commentaires sont ignorés par les parseurs
– <?xml version='1.0' encoding='ISO-8859-1'?>
<!-- Ceci est un document définissant une présentation -->

34
L’élément racine
 Après la déclaration, chaque document XML définit exactement
un seul élément appelé élément racine (root element)
 Tous les autres éléments sont contenus dans l’élément racine
– <?xml version='1.0' encoding='ISO-8859-1'?>
<!-- Ceci est un document definissant une presentation -->
<presentation>

</presentation>
– Les noms des tags sont sensibles à la case (case sensitive), le tag
de fin doit exactement correspondre au tag de début.

35
Introduction des attributs
 Une présentation possède certaines propriétés. Il est
plutôt naturel de les définir comme des attributs plutôt
que comme des sous éléments
– <?xml version='1.0' encoding='ISO-8859-1'?>
<!-- Ceci est un document definissant une presentation -->
<presentation
titre= "Ma presentation"
date= "aujourd hui"
auteur= "votre serviteur"
>
</presentation>
– Pour les noms des attributs, il est possible d’utiliser toute combinaison
de chiffres et de lettres en plus de -, _, :, et du point
– Les attributs sont toujours entre guillemets, et ne sont jamais séparés
par des virgules (comme HTML)
36
Ajout d’un élément imbriqué
 Les données XML sont structurés de manière hiérarchique. Un élément
donné peut être contenu dans un autre élément
 Définissons maintenant l’élément slide contenu dans l’élément racine
presentation.
– <?xml version='1.0' encoding='ISO-8859-1'?>
<!-- Ceci est un document définissant une présentation -->
<presentation
titre= "Ma presentation"
date= "aujourd’hui"
auteur= "votre serviteur"
>
<!-- Le premier slide du titre -->
<slide type="all">
<titre> XML, les bases </titre>
</slide>
</presentation>

37
Ajouter du texte du style HTML
 XML, permet de définir des tags et de leur associer les noms de manière
libre
 Il est donc possible d’utiliser des tags HTML dans un fichier XML
– <?xml version='1.0' encoding='ISO-8859-1'?>
<!-- Ceci est un document définissant une présentation -->
<presentation
titre= "Ma presentation"
date= "aujourd’hui"
auteur= "votre serviteur"
>
<!-- Le premier slide du titre -->
<slide type="all">
<titre> XML, les bases </titre>
</slide>
<!-- Le plan de la présentation -->
<slide type="all">
<titre> Plan du cours </titre><br/>
<item> <em> Introduction aux bases </em> </item><br/>
38 <item> <em> Construisons un document XML </em> </item><br/> </slide>
</presentation>
Les caractères spéciaux
 Dans XML, une entité est une structure XML ou tout
simplement du texte qui possède un nom.
 Référencer une entité a pour effet de bord de
l’insérer dans le document à la place de la référence
– Un nom d’entité est référencé de la façon suivante:
&nomEntité;
 Il existe des entités prédéfinies pour les caractères
spéciaux.
 Il est aussi possible de définir de nouvelles entités
(voir la partie DTD)

39
Les entités prédéfinies

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


<!-- Ceci est un document définissant une présentation --> Caractère Référence
<presentation
titre= "Ma presentation"
date= "aujourd’hui" & &amp;
auteur= "votre serviteur"
> < &lt;
<!-- Le premier slide du titre -->
<slide type="all"> > &gt;
<titre> XML, les bases </titre>
</slide> " &quot;
<!-- Le plan de la présentation -->
<slide type="all"> ‘ &apos;
<titre> &lt;Plan du cours&gt; </titre>
<item> <em> Introduction aux bases </em> </item>
<item> <em> &quot; Construisons un document XML &quot; </em>
</item>
40 </slide>
</presentation>
Les références de caractères
 Il est possible de référencer un caractère par sa valeur Unicode
(137 468 caractères pour la version 4.1)
 Dans ce cas le nom de l’entité référencée est # suivi de la
valeur Unicode (en décimal)
– Utiliser la forme &#ValeurUnicode;
– e.g. &#45;&#65;&#45;
– est interprété comme -A-
 Les valeurs Unicode sont publiées sur
http://www.unicode.org/charts
– Elles sont exprimées en Hexadecimal (il faut faire la conversion en
décimal avant de les utiliser)

41
Exemple d’utilisation des valeurs
unicode

<?xml version='1.0' encoding='utf-8'?>


<!-- Ceci est un document définissant une présentation -->
<presentation
titre= "Ma presentation"
date= "aujourd’hui"
auteur= "votre serviteur" >
<!-- Le premier slide du titre -->
<slide type="all">
<titre> XML, les bases </titre>
</slide>
<!-- Le plan de la présentation -->
<slide type="all">
<titre> &lt;Plan du cours&gt; </titre>
<item> <em> &#45;&#65;&#45; Introduction aux bases </em> </item>
<item> <em> &#45;&#66;&#45; &quot; Construisons un document XML &quot;
</em> </item>
42 </slide>
</presentation>
Insertion de zones texte dans un
document XML

 Dans le cas d’insertion de gros blocs de texte avec


plusieurs caractères spéciaux, utiliser le références
d’entités devient très lourd
 XML offre un moyen pour insérer le texte tel quel
– Utiliser des sections CDATA
 Les espaces blancs deviennent significatifs
 Les caractères spéciaux ne sont pas interprétés comme du
code XML
– Une section texte commence par <![CDATA[
– Elle se termine par ]]>

43
Exemple de section texte
– <?xml version=‘1.0 encoding=‘utf-8’?>
<!-- Ceci est un document définissant une présentation -->
<presentation
titre= "Ma presentation"
date= "aujourd’hui"
auteur= "votre serviteur"
>
<!-- Le premier slide du titre -->
<slide type="all">
<titre> XML, les bases </titre>
</slide>
<!-- Le plan de la présentation -->
<slide type="all">
<titre> &lt;Plan du cours&gt; </titre>
<item> <em> &#65;- Introduction aux bases </em> </item>
<item> <em> &#66;- &quot; Construisons un document XML &quot; </em> </item>
<item><![CDATA[Un petit croquis: coin gauche ----- < Milieu> -----
coin droit
]]>
</item>
</slide> </presentation>

44
Exercice

45
Énoncé
 Structurer les informations contenues dans le texte suivant:
Une bouteille d’eau Cristaline de 150cl contient par litre 71mg d’ions positifs clacium, et
5,5mg d’ions positifs magnésium. On y trouve également des ions négatifs comme des
chlorures à 20 mg par litre et des nitrates avec 1mg par litre. Elle est recueillie à St-Cyr la
source, dans le département du loiret. Son code barre est 3270800 et son PH est de 7,45.
Comme la bouteille est sale, quelques matériaux comme du Fer s’y trouvent en
suspension.
Une seconde bouteille d’eau Cristaline a été recueillie à la source d’Aurèle dans les Alpes
Maritimes. La concentration en ions de calcium est de 98 mg/l, et en ions magnésium de 4
mg/l. Il y a 3,6 mg/l d’ions de chlorure et 2mg/l de nitrates, pour un PH de 7,4. Le code
barre de cette bouteille de 50 cl est 3266006.
Une bouteille de même contenance est de marque Volvic, a été puisée à Volvic bien connu
pour ses sources donnant un PH neutre de 7. Elle comprend 11,5 mg/l d’ions calcium,
8.0mg/l d’ions magnésium, 13,5mg/l d’ions chlorure et 6,3mg/l d’ions nitrates. Elle contient
également des particules de silice. Son code barre est 33045798. En fait, Volvic est dans le
46 Puy-de-Dôme
Une solution
<?xml version="1.0" encoding="ISO-8859-1" ?>
<eau>
<bouteille>
<marque>Cristaline</marque>
<composition>
<ion type="positif">calcium 71mg/l</ion>
<ion type="positif">magnésium 5,5mg/l</ion>
<ion type="negatif">chlorure 20mg/l</ion>
<ion type="negatif">nitrate 1mg/l</ion>
<autre type="metal">fer</autre>
</composition>
<source>
<ville>St-Cyr la Source</ville>
<departement>Loiret</departement>
</source>
<code_barre> 3270800 </code_barre>
<contenance unit="cl">150</contenance>
<ph>7,45</ph>
</bouteille> ….

47
Modélisation des
documents:
Les DTDs

48
Une DTD,
Ça sert à quoi?

 Une DTD (Document Type Definition) permet de


définir son propre langage basé sur XML (d’où la
notion de meta-langage)
 Elle spécifie
– Le vocabulaire du langage:
 Les balises
 Les éléments
 Les attributs
– La grammaire du langage
 Les imbrications correctes des éléments

49
Le concept de validité d’un document
XML

 Un document bien formé possède les


caractéristiques suivantes
– Le document possède un élément racine unique
– Un attribut est unique dans son élément
– Les balises doivent être correctement imbriquées
– Les éléments vides peuvent utiliser une notation spécifique
– Les guillemets sont obligatoires pour associer une valeur à
un attribut
 Un document valide est un document:
– Bien formé
– Conforme à la DTD qui lui est associée

50
Exemples,
Qu’est-ce que vous en pensez?

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


<titre>Exemple1</titre>
<sous-titre>Je le pense pas bon</sous-titre>
<texte> Je pense car …</texte>

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


<Exercice>
<titre>Exemple2</titre>
<evaluateurs nom="etudiant1" nom="etudiant2" nom="etudiant3" />
</Exercice>

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


<Exercice>
<titre>Exemple2</titre>
<evaluateurs>
<evaluateur nom="etudiant1"/>
<evaluateur nom="etudiant2"/>
<evaluateur nom="etudiant3" />

51 </Evaluateurs>
</Exercice>
Déclaration d’éléments simples dans
une DTD

 Déclaration sous la forme:


– <!ELEMENT balise (sa définition)>
– Le paramètre "sa définition" correspond à
 Un type de données prédéfini
 Ou à un élément de données composé constitué lui-
même d’éléments
– Les types prédéfinis
 ANY: l’élément peut contenir tout types de données
 EMPTY: l’élément ne contient pas données
 #PCDATA: l’élément contient une chaîne de caractère
– Exemple: <(!ELEMENT Institution (#PCDATA)>
– <Institution> EHTP </Institution>

52
Déclaration d’éléments composés

 Le contenu d’une balise est défini par une


combinaison de séquences et de choix d’éléments

 Syntaxe utilisant des opérateurs de composition:


Opérateur Action Exemple
+ L’élément doit être présent au minimum une fois E+
* L’élément peut être présent plusieurs fois E*
? L’élément est facultatif E?
| Un des deux éléments doit être présent (pas les deux) E1 | E2
, Le premier élément doit être présent et doit être suivi par le deuxième E1,E2
() Les parenthèses permettent de regrouper des compositions d’éléments (E1 I E2)*
53 afin de leur appliquer d’autres opérateurs
Exemple
 <!ELEMENT personne(nom,prenom+,tel?,adresse)>
<!ELEMENT nom(#PCDATA)>
<!ELEMENT prenom(#PCDATA)>
<!ELEMENT tel(#PCDATA)>
<!ELEMENT adresse (ANY)>
 <personne>
<nom> guennoun </nom>
<prenom> mohammed </prenom>
<prenom> karim </prenom>
<tel>06 48 62 ** **</tel>
<adresse>
<numéro> 1</numéro>
<rue> ****</rue>
<ville> Casablanca </ville>
</adresse>
54 </personne>
Déclaration d’attributs
 Déclaration sous la forme:
– <!ATTLIST balise attribut type mode>
– Balise: fait référence à l’élément auquel est rattaché l’attribut
– Attribut: correspond au nom de l’attribut déclaré
– Type: correspond au type de données associées à l’attribut
 CDATA: chaîne de caractères entre guillemets
 Liste de valeurs ‘(v1|v2|v3)’: énumération
 ID et IDREF: clé et référence à clé
– mode précise le caractère obligatoire ou non de l’attribut
 #REQUIRED: la valeur de l’attribut doit être spécifiée dans le
document
 #IMPLIED: La valeur n’a pas besoin d’être spécifiée. Si elle ne l’ai
pas, généralement l’application utilise une valeur par défaut
 #FIXED "uneValeur" : La valeur de l’attribut est fixée à cette valeur
pour tout le document

55
Exemple

<!ELEMENT auteur (#PCDATA) >


<!ELEMENT editeur (#PCDATA) >
<!ATTLIST auteur
genre (Masculin | Feminin ) #REQUIRED
ville CDATA #IMPLIED>
<!ATTLIST editeur
ville CDATA #FIXED "Casablanca">

56
Exemple de DTD

<!ELEMENT DOCUMENT(PERSONNE*)>

<!ELEMENT PERSONNE (#PCDATA)>

<!ATTLIST PERSONNE PNUM ID #REQUIRED>

<!ATTLIST PERSONNE MERE IDREF #IMPLIED>

<!ATTLIST PERSONNE PERE IDREF #IMPLIED>

57
DTD interne
 Spécifiée en utilisant la déclaration:
<!DOCTYPE nomDeLaDTD [ déclarations ]>
 Exemple:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE PERSONNES [
<!ELEMENT DOCUMENT(PERSONNE*)>
<!ELEMENT PERSONNE (#PCDATA)>
<!ATTLIST PERSONNE PNUM ID #REQUIRED>
<!ATTLIST PERSONNE MERE IDREF #IMPLIED>
<!ATTLIST PERSONNE PERE IDREF #IMPLIED> ]>

<PERSONNES>
<PERSONNE PNUM = "P1">Fatima</PERSONNE>
<PERSONNE PNUM = "P2">Ali</PERSONNE>
<PERSONNE PNUM = "P3" MERE="P1" PERE="P2">Adam</PERSONNE>
<PERSONNE PNUM = "P4" MERE="P1" PERE="P2">Rime</PERSONNE>
</PERSONNES>
58
DTD externe (arrêt)

 Modèle pour plusieurs documents


– partage des balises, attributs et structures

 Définition locale ou externe


– Locale: <!DOCTYPE doc SYSTEM "doc.dtd">
– Externe: <!DOCTYPE doc PUBLIC
"www.myweb.com/doc.dtd">

 Exemple de document
<?xml version="1.0" standalone="no"?>
59 <!DOCTYPE modeles SYSTEM "modeles.dtd">
Encore un petit exercice
 On se propose de définir un format XML de stockage
d’un catalogue de films sur DVD.
 Le catalogue comprend un ensemble de fiches de
films
 Chaque fiche comprend:
– Un numéro unique
– Le titre du film
– Sa date de sortie
– Un ou plusieurs réalisateurs
– Les acteurs principaux
– Le genre du film (comédie, horreur, action, aventure) (en
option)
– Un commentaire optionnel qui présente brièvement
60 l’histoire du film
– Un lien éventuel vers le site du film
Insuffisances des DTD

 Pas de types de données à part du texte


(#PCDATA)
 Expression de cardinalités limitée
– ‘?’, ‘*’ et ‘+’
 Syntaxe spécifique (pas XML)
– difficile à interpréter
– difficile à traduire en schéma objets
 Alternative:
61 – XML-schema du W3C
Les schémas XML

62
Schéma XML

 Un schéma d'un document définit:


– les éléments possibles dans le document
– les attributs associés à ces éléments
– la structure du document et les types de données
 Le schéma est spécifié en XML
– pas de nouveau langage
– balisage de déclaration
– utilise un espace de nom xs:
 Présente de nombreux avantages
– types de données personnalisés
– extensibilité par extension et restriction
– analysable par un parseur XML standard

63
Objectifs

 Reprendre les acquis des DTD


– Plus riche et complet que les DTD
 Permettre de typer les données
– Éléments simples et complexes
– Attributs simples
 Permettre de définir des contraintes
– Existence obligatoire ou optionnelle
– Domaines de valeurs, cardinalités,
– ...
 Respecter la vision XML
– Syntaxe XML

64
Les éléments du schéma

 La base d’un schéma XML:


– l’élément de données
 Un élément peut avoir un type:
– Simple: une balise qui ne contient aucun attribut et dans laquelle
aucune autre balise n'est imbriquée.
– Complexe s’il contient des sous éléments ou s’il comporte un
attribut
 Les sous éléments peuvent être déclarés:
– xs:all tous les éléments doivent exister (peu importe l’ordre)
– xs:choice un des éléments doit exister
– xs:sequence tous les éléments doivent exister dans l’ordre spécifié

65
Les types considérés par les
schémas XML

 Les schémas distinguent plusieurs types :


– Types simples (#PCDATA ou feuille de l'arbre)
 Types de base ou primitifs (entier, chaîne, ...)
 Types simples définis :
– par restriction d'un type simple,

– Types complexes (nœuds de l'arbre) définis


 par construction,
 par restriction d'un type complexe,
 par extension

66
Les types simples
 string  date
– La vie est belle! – 1999-05-31
 byte  ID
– 1, 126 – "A212"
 integer  IDREF
– -126789, -1, 0, 1, 126789 – "A212"
 positiveInteger  IDREFS
– 1, 126789 – "A212" "B213"
 negativeInteger  anyURI
– -126789, -1 – http://www.example.com/e1.html#5
 int  language
– 1, 126789675
– en-GB, en-US, fr-FR
 unsignedInt  dateTime
– 0, 1267896754
– 1999-05-31T13:20:00.000
 boolean
 …
– true, false, 1, 0

Exemple: <xs:element name="NomBalise" type="xs:TypeSimple" />


67
Les types simples par restriction

 Un type simple peut provenir de la restriction d'un


type de base
 <xs:simpleType name="poids">
<xs:restriction base="xs:int">
<xs:minInclusive value='100'/>
</xs:restriction>
</xs:simpleType>
 Ou d’un autre type simple:
 <xs:simpleType name="poids2">
<xs:restriction base="poids">
<xs:maxInclusive value='200'/>
</xs:restriction>
68
</xs:simpleType>
Les facettes

 Les facettes sont des restrictions de types simples:


 <xs:minInclusive value='valeur'/>
 <xs:minExclusive value='valeur'/>
 <xs:maxInclusive value='valeur'/>
 <xs:maxExclusive value='valeur'/>
 Une énumération est possible
<xs:restriction base="xs:string">
<xs:enumeration value='rouge'/>
<xs:enumeration value='noir'/>
<xs:enumeration value='bleu'/>
</xs:restriction>

69
Les types complexes
 Définition d'objets complexes
– <sequence> : collection ordonnée d'éléments typés
– <all> : collection non ordonnée d'éléments typés
– <choice>: choix entre éléments typés
 Exemple
<xs:element name="Film">
<xs:complexType>
<xs:sequence>
<xs:element name="titre" type="xs:string"/>
<xs:element name="réalisateur" type="xs:string"/>
<xs:element name="DateSortie" type="xs:date"/>
<xs:element name="nombreEntrées" type="xs:int"/>
</xs:sequence>
</xs:complexType>
70 </xs:element>
Le nombre d’occurences

 Dans un schéma, il est aussi possible de


contraindre le nombre d’occurrences d’un
élément dans un autre
– La syntaxe: minOccurs/maxOccurs
– Exemple:
<xs:element name="catalogueFilms">
<xs:complexType>
<xs:sequence>
<xs:element name="Film" minOccurs="1" maxOccurs="unbounded
</xs:sequence>
</xs:complexType>
71 </xs:element>
Déclaration des attributs

 Pour les types simples:


– Extension du type simple par l’attribut
<xs:complexType>
<xs:extension base="xs:string">
<xs:attribute name="referenceInterne" type="xs:positiveInteger"/>
</xs:extension>
</xs:complexType>

 La déclaration suivante est conforme à ce


schéma:
72 – <titreFilm referenceInterne="12345"> Pulp Fiction</titreFilm>
Déclaration des attributs

 Pour les éléments à contenu complexe


– Définition à l’intérieur de la balise xs:complexType
<xs:element name="sousTitrage" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="auteur" type="xs:string" minOccurs="1" maxOccurs= "unbounded"/>
</xs:sequence>
<xs:attribute name="langue" use="required" type="xs:string"/>
<xs:attribute name="date" use="optional" type="xs:date"/>
</xs:complexType>
</xs:element>

 La déclaration suivante est conforme à ce schéma


<sousTitrage langue="francais">
<auteur> La société francaise de traduction </auteur>
73 </sousTitrage>
Fichier de stockage d’un schéma
XML

 Comme tout fichier XML


– Présence du prolog
– Une balise racine
 Sinon:
– Extension: xsd
– Balise racine imposée:
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 Pour référencer un schéma xml, il faut le faire au niveau de la
balise racine
– <racine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="chemin_vers_fichier.xsd"> </racine>

74
Schéma Vs DTD

 Les DTD définissent la grammaire des


documents
 Elles sont de plus en plus souvent remplacées
par des schémas
– Typage plus rigoureux (autre que du texte #PCDATA)
– Cardinalité plus expressive (minOccurs/maxOccurs)
– Syntaxe XML
 + facile à interpréter
 + facile à transformer en Objets
75
Le même exercice
 On se propose de définir un format XML de stockage
d’un catalogue de films sur DVD.
 Le catalogue comprend un ensemble de fiches de
films
 Chaque fiche comprend:
– Un numéro unique
– Le titre du film
– Sa date de sortie
– Un ou plusieurs réalisateurs
– Le genre du film (comédie, horreur, action, aventure) (en
option)
– Un commentaire optionnel qui présente brièvement
l’histoire du film
76 – Un lien éventuel vers le site du film
Programmation XML

77
Bridging the gap,
XML et l’orienté-objet

 Comment résoudre le problème de la distance entre


XML et les programmes objets?
 Les services sont souvent programmés en langage
objet: Java, C++, C#,
– Pour les échanges à base de messages XML,
 Les traiter et les analyser (parser)
 Les traduire en objets
 JAXP: Java Api for Xml Processing
– Traitement des données XML par des
applications codées en Java
78
JAXP: SAX, DOM, XSLT

 Trois technologies s’offrent à nous pour analyser, traiter


et transformer les documents XML :
– SAX, une API événementielle qui lit de manière séquentielle (du
début à la fin) un document XML et exécute des méthodes
correspondant aux différents éléments du document
– DOM, une API basée sur une modélisation objet des documents
XML avec des classes et des méthodes permettant le parcours et
la manipulation des arbres XML
– XSLT, une norme W3C basée sur XML, décrivant une
transformation par le biais de règles appliquées aux différents
nœuds de l’arbre XML.

79
L’API JAXP
 JAXP
– https://docs.oracle.com/javase/8/docs/technotes/guides/xml/jaxp/index.html
– Couche d’abstraction de SAX, DOM et XSLT indépendante de l’implémentation
– XML et JAVA = un couple parfait
 SAX (Simple API for XML)
– Développement communautaire
 DOM (Document Object Model)
– Recommandation W3C, http://www.w3.org/DOM/
 Transform, basé sur XPATH et XSLT
– Recommandations W3C, http://www.w3.org/TR/xpath/ et
http://www.w3.org/TR/xslt

80
L’API JAXP

 Les APIs principales JAXP sont définies


dans le package javax.xml.parsers
 Ce package contient les classes usines:
– SAXParserFactory: produit des parsers SAX
– DocumentBuilderFactory: produit des
constructeurs de document
– TransformerFactory: produit des transformateurs
XSLT

81
Les différents Packages

 Les API SAX, DOM et transform sont définies avec les


librairies suivantes:
– javax.xml.parsers: l’API JAXP
 Définit une interface commune à tout les vendeurs de parseurs SAX,
DOM, et transform
– org.w3c.dom:
 Définit la classe ‘Document’ (DOM) et les classes de ses composants
– org.xml.sax:
 Définit l’API SAX basique
– javax.xml.transform:
 Définit les APIs pour XSLT (transformations génériques ou avec
feuilles de style)

82
Le parseur SAX

83
L’API SAX
 Modèle simplifié d'événements
 Types d'événement :
– début et fin de document ;
– début et fin d'éléments ;
– attributs, texte, …
 Parcours séquentiel des éléments du document
 Mécanisme généralement utilisé par les servlets et les
programmes qui échangent des documents XML sur un réseau
– Plus rapide
– Moins gourmant en mémoire (traitement en flux, pas de représentation
interne des données comme pour DOM)

84
Fonctionnement de l’API basée
événements

start document
start element: bouteille
start element: marque
<?xml version="1.0"?>
characters: Cristaline
<bouteille> ……
<marque>Cristaline</marque> end element: marque
<source> St-Cyr la Source </source> start element: source
</bouteille> characters: St-Cyr la source
……
end element: source
end element: bouteille
end document

85
La manufacture de parseurs SAX

 JAXP offre une manufacture pour la création de


parseurs SAX
– Classe SAXParserFactory dans le package javax.xml.parsers
– La méthode statique newInstance permet d’en créer une
instance
 SAXParserFactory fact= SAXParserFactory.newInstance();
 La manufacture permet de créer des instances du
parseur SAX
– SAXParser SP = fact.newSAXParser();

86
Le parseur SAX

 Traite un fichier XML en faisant appel à la


méthode ‘parse’
 SP.parse(fichier,handler)
– fichier: le fichier xml à parser
– handler: la classe qui implémente les traitements
des événements de parcours du fichier en
héritant de l’interface ContentHandler

87
L’interface ContentHandler

 L’API SAX intègre l’interface ContentHandler


permettant de
– Parcourir le document séquentiellement
– Lever des événements d’analyse
 Début / Fin du documents
 Début / Fin d’éléments
 Zones textes
– Exécuter une méthode de traitement, pour
chaque événement

88
Méthodes de traitement

 La façon la plus simple d’implémenter l’interface


ContentHandler est d’hériter de la classe
DefaultHandler
 La classe DefaultHandler
– Fait partie du package org.xml.sax.helpers
– Définit les méthodes de traitement
 startDocument / endDocument
 startElement / endElement
 Characters …
– Les traitements correspondent à ne rien faire (les méthodes
sont vides)

89
Méthodes de traitement: début et fin
de documents

 Les méthodes de traitement principales sont déclarés


dans la classe DefaultHandler avec les signatures
suivantes:
– public void startDocument()
 Réception de la notification du début du document
 Le parsseur SAX exécute cette méthode une seul fois avant toutes
les autres
 Lève l’exception : SAXException
– public void endDocument()
 Réception de la notification de fin de document
 La dernière méthode exécutée par le parseur
 Lève l’exception SAXException

90
Méthodes de traitement: début et fin
d’éléments

– public void startElement(String uri, String localName, String qName,


Attributes atts)
 Reçoit la notification du début d’un élément
 Invoquée par le parseur au début de chaque élément
 Les paramètres de la méthode
– uri: la URI de l’espace de nommage, chaîne vide si aucun n’est spécifié
– localName: nom local
– qName: nom qualifié
– atts: les attributs attachés aux éléments
 Lève l’exception SAXException
– public void endElement(java.lang.String uri, java.lang.String localName,
java.lang.String qName)
 Reçoit la notification de la fin d’un élément
 Même sémantique des paramètres que pour startElement

91
Méthodes de traitement: parcours de
la liste des attributs.

 Pour le parcours des attributs d’un élément, la classe


Attributes offre les méthodes
– int getLength(): renvoie un entier (de type int) indiquant le nombre
des attributs de l’élément
– String getLocalName(int i):
 Renvoie le nom (de type String) d’un attribut local.
 Renvoie "" si l’attribut n’est pas local
– String getQName(int i):
 Renvoie le nom d’un attribut qualifié
 Renvoie "" si l’attribut n’est pas qualifié
– String getValue(int i):
 Renvoie la valeur de l’attribut (de type String)

92
Méthodes de traitement: les zones
de texte

 Pour le traitement des zones de texte, la classe


DefaultHandler offre la méthode characters:
– public void characters(char[] c, int start, int length)
 Reçoit la notification d’une chaîne de caractères
 Le parseur l’appelle pour renvoyer un morceau d’une chaîne de
caractères
 Possibilité de récupérer la valeur de la partie renvoyée en String
en faisant un appel
– String s = new String(c, start, length);
 Si besoin d’avoir la chaîne complète, il est nécessaire de
concaténer les morceaux envoyés par le parseur

93
Méthode de traitement des
instructions
 public void processingInstruction (String target,
String data)
– Reçoit la notification d’une instruction de traitement (<?cible
Traitement?>
– target: la chaîne correspondant à la cible
– Traitement : la chaîne correspondant aux traitements
– Exécutée à chaque rencontre d’une instruction de
traitement
– La ligne de déclaration xml est ignorée
– Lève l’exception SAXException

94
Faisons le ensemble

95
Le squelette du parseur

 Créer un fichier Echo.java


– Un méthode main qui prendra en argument le
nom du fichier XML sur la ligne de commande

public class Echo


{
public static void main(String argv[ ])
{
}

96
Les déclaration des ‘import’

 Importer les packages


import java.io.*;
// utilisé pour l’affichage du résultat
import org.xml.sax.*;
// définit les interfaces du parseur SAX
import org.xml.sax.helpers.DefaultHandler;
// utilisé pour définir le traitement des événements, par héritage
import javax.xml.parsers.SAXParserFactory;
// classe permettant de créer l’instance du parser
import javax.xml.parsers.ParserConfigurationException;
//Exception levée par la Factory si échec de création de l’instance du parseur
import javax.xml.parsers.SAXParser;
// Le type de l’instance créée par la factory
public class Echo
97 {….
Traitement de la ligne de commande

 Le fichier XML sera passé en commande, dans argv[0]. Introduire


le code suivant dans le main:

public static void main(String argv[])


{
if (argv.length != 1) {
System.err.println("entrer le nom du fichier en ligne de commande!");
System.exit(1);
}
try {
// Parsing du document XML

}
catch (Exception e) {

}
98 }
L’interface ContentHandler

 Interface avec les méthodes suivantes exécutées en réponse au


événement d’analyse:
– startDocument,
– endDocument,
– startElement,
– endElement,
– Characters
 La façon la plus simple d’implémenter cette interface est d’hériter de la
classe DefaultHandler
– Package: org.xml.sax.helpers
– toutes les méthodes sont vides
public class Echo extends DefaultHandler
{
...
99 }
Création de l’instance du parseur
public static void main(String argv[])
{
if (argv.length != 1) {
System.err.println("entrer le nom du fichier en ligne de commande!");
System.exit(1);
}
// Création d’une instance la Factory
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
// Parsing du document XML

// Création de l’instance parser


SAXParser saxParser = factory.newSAXParser();

// Initialisation du handler des événements


DefaultHandler handler = new Echo();

//Appeler l’analyse sur le fichier passé en commande


saxParser.parse( new File(argv[0]), handler );
10 } catch (Throwable t) {….
Traitement des événements de
parsing : début et fin des doc

public void startDocument() throws SAXException


{
//afficher le prolog du document
System.out.println("<?xml version='1.0' encoding='UTF-8'?>");
}

public void endDocument() throws SAXException


{
// rien à faire
}
….

10
Traitement des événements de
parsing : début des éléments

public void startElement(String namespaceURI, String nsName, String qName,


Attributes attrs)
throws SAXException
{
String ElementName = nsName; // Le nom de l’élément
if (ElementName.equals("")) ElementName = qName; // pas d’espace de nommage
System.out.print("<"+ElementName);
int n=attrs.getLength() ;
if (n!= 0) {
for (int i = 0; i < n; i++) {
String aName = attrs.getLocalName(i); // Récupérer le nom de l’attribut
if (aName.equals("")) aName = attrs.getQName(i);
System.out.print(" ");
System.out.print(aName+"=\""+attrs.getValue(i)+"\"");
}
}
10 System.out.println(">");
}
Traitement des événements de
parsing : fin des éléments

public void endElement(String namespaceURI,


String nsName, String qName
)
throws SAXException
{
String ElementName = nsName;
if (ElementName.equals("")) ElementName = qName;
System.out.println("</"+ElementName+">");
}
...

10
Traitement des caractères (arrêt)

public class Echo extends DefaultHandler


{
String text="";
public void endElement(...) …

public void characters(char buf[ ], int offset, int len)


throws SAXException
{
String s = new String(buf, offset, len);
text=text+s;
}
...

10
Afficher le contenu d’une balise à la
fin

 Après mise dans le buffer des caractères


contenus dans la balise
public void endElement(...)
throws SAXException
{
System.out.println(text);
text="";
String eName = sName; // element name
...
}

10
Afficher le contenu partiel de la
balise mère
 Exemple:
<bouteille>
Cette bouteille possède les éléments suivants
<marque>Cristaline</marque>…
 Il est nécessaire de vider le contenu du
buffer au début aussi
public void startElement(...)
throws SAXException
{
System.out.println(text);
text="";
String eName = sName; // element name
10 ...
}
Traitement des instructions

 Ajouter une instruction de traitement à votre fichier


xml
– <?InstructionDeTraitement echo?>
 Dans le code, implémenter la méthode
processingInstruction
public void processingInstruction(String target, String data) throws
SAXException
{
System.out.println("voici mon instruction de connexion");
System.out.println("target: "+target);
System.out.println("data: "+data);
10 }
Exécution

 Comme n’importe quelle application Java,


 Compiler la classe Echo.java
– javac Echo.java
 L’exécuter en donnant un fichier xml en ligne
de commande
– java Echo Bouteilles.xml

10
Quelques remarques

 Le parseur vérifie l’aspect bien formé du document. Il


lève des exceptions dans le cas contraire
– Introduire des erreurs de type document mal formé
– Remarquer le traitement séquentiel du document
 Les tags vides de type <balise/> sont affichés sous
la forme <balise></balise>
– Ajouter une balise vide

10
Traitements spécifiques

 Modifier le code des méthodes de traitement du


parseur SAX pour:
– Afficher exclusivement les marques des bouteilles
– Afficher les marques et les sources des bouteilles (sous la
forme: ville, departement)
– Afficher la marque de la bouteille qui possède le plus haut
niveau de magnésium ainsi que la valeur correspondante
– Afficher la marque qui possède le plus bas niveau de nitrate
– Afficher la valeur moyenne des niveaux de magnésium et de
nitrate pour toutes les bouteilles référencées dans le document
XML
11 – Selon l’instruction de traitement du document (tout, ou
marque), afficher tout le document ou seulement les marques.
Document Object Model

L’API DOM

11
DOM: Document Object Model

 Standard W3C fait pour HTML et XML


 Structure d'objets pour représenter un document
– Résultat d'un "parser"
– Produit par construction
 Interface objet pour naviguer dans un document
– Orientée objet
– Peut être utilisée en:
 Java, C++
 C#, VB
 PHP

11
Utilisation de DOM

 A partir d’un document XML, un Document


XML
parseur DOM permet de générer
un objet structuré en arbre
représentant le document Parseur
DOM
 À Travers l’API DOM, l’application
peut parcourir et agir sur ce
document Arbre DOM

API DOM

Application
11
Transformation d’un document
XML en un objet DOM

 L’API DOM permet


– De parser un document xml afin de générer le
DOM qui le représente
– Manipuler l’objet obtenu en agissant sur les
nœuds de l’arbre DOM
 créer,
 modifier,
 supprimer,
 réarranger

11
Structure de l’objet DOM

Document

<?xml version="1.0" ?> Inst1,T C bouteille


<?instr1 T?>
<!-- C -->
<bouteille type="bouteille d'eau" >
<marque>Cristaline</marque>
type, bouteille marque source
<source> St-Cyr la Source </source> d’eau
</bouteille>

Cristaline St-Cyr..

11
Déclaration d’un DOM

 La classe org.w3c.dom.Document
correspond à un objet DOM
 Un objet Document peut être
– Obtenu comme résultat du parsing d’un fichier
xml
– Construit en utilisant l’API dom

11
La manufacture de parseurs DOM
 JAXP offre une manufacture pour la création de
parseurs DOM
– DocumentBuilderFactory dans le package javax.xml.parsers
– La méthode newInstance permet d’en créer une instance
 DocumentBuilderFactory fact=
DocumentBuilderFactory.newInstance();
 La manufacture permet de créer des instances du
parseur DOM
– DocumentBuilder builder = fact.newDocumentBuilder();

11
Le parseur DOM

 Traite un fichier XML en faisant appel à la


méthode ‘parse’
 builder.parse(fichier)
– fichier: le fichier xml à parser
– Renvoie, en retour, un objet de type
org.w3c.dom.Document

11
L’interface Document

 Hérite de l’interface Node


 Représente le document parsé
 Donne accès
– Aux commentaires
– Aux instructions de traitement
– au nœud racine du document XML ou HTML
 A travers le nœud racine, il est possible
d’accéder aux autres nœuds de l’arbre DOM
11
L’interface mère: Node

 L’interface élémentaire pour les DOM


 Représente un nœud dans l’arbre de données d’un document XML
 Offre des méthodes pour
– Récupérer les valeurs du nœud ainsi que les attributs éventuels du nœuds
– Parcourir ses descendants
– Modifier l’arborescence
 Un nœud, possède le attributs:
– nodeType ( short getNodeType() )
– nodeName ( String getNodeName() )
– nodeValue ( String getNodeValue() )
– attributes ( NamedNodeMap getAttributes() )

12
L’interface mère Node: Le
type du noeud

 Une méthode permet de renvoyer le code représentant le type du


nœuds
– public short getNodeType()
 Un Node peut posséder les types suivants:
– public static final short ELEMENT_NODE 1
– public static final short ATTRIBUTE_NODE 2
– public static final short TEXT_NODE 3
– public static final short CDATA_SECTION_NODE 4
– public static final short ENTITY_REFERENCE_NODE 5
– public static final short ENTITY_NODE 6
– public static final short PROCESSING_INSTRUCTION_NODE 7
– public static final short COMMENT_NODE 8
– public static final short DOCUMENT_NODE 9
– public static final short DOCUMENT_TYPE_NODE 10
– public static final short DOCUMENT_FRAGMENT_NODE 11
12
Contenu des attributs par type de
noeud

Interface nodeName nodeValue Attributes


Attr nom de l’attribut Valeur de l’attribut null
CDATASection "#cdata-section" Contenu de la section null

Comment "#comment" contenu du null


commentaire

Document "#document" null null


Element Le nom du tag null NamedNodeMap

ProcessingInstruction Cible données null

Text "#text" contenu du nœud null


12 texte
Méthode de parcours de l’arbre:
ascendant et descendants

 Obtenir le père du nœud:


– public Node getParentNode()
– Renvoie null si le nœud n’a pas de père (e.g. document)
 Obtenir les fils d’un nœud:
– public NodeList getChildNodes()
– Renvoie la liste vide si le nœud n’a pas de fils
– Parcours en utilisant getLength et item
 Obtenir le premier fils du nœud
– public Node getFirstChild()
– Renvoie null si pas de fils
 Obtenir le dernier fils du nœud
– public Node getLastChild()
– null si pas de fils

12
Parcours de l’arbre: les frères

 Obtenir le grand frère (le précédent)


– public Node getPreviousSibling()
– Renvoie null si le nœud est le premier des fils
 Obtenir le frère suivant
– public Node getNextSibling()
– Renvoie null sui le nœud est le dernier des fils
 Cela permet de parcourir le DOM de plusieurs manières
– Une liste de fils
– Le premier fils, puis ces petits frères
– Le dernier fils puis ses grands frères

12
Modification de l’arbre (1/2)

 Tester si un nœud possède des fils


– public boolean hasChildNodes()
 Introduction d’un nouveau fils
– Création d’un élément: createElement(String tagName)
– public Node insertBefore(Node newChild, Node refChild)
– newChild doit être crée dans le document
– Si, refChild vaut null, le nœud est inséré à la fin
– Si, newChild est déjà dans le document, il est d’abord
supprimé

12
Modification de l’arbre: (2/2)

 Remplacement d’un fils


– public Node replaceChild(Node newChild, Node oldChild)
– Si newChild est dans le document, il est d’abord supprimé

 Introduction d’un fils à la fin


– public Node appendChild(Node newChild)

 Suppression d’un fils


– public Node removeChild(Node oldChild)

12
Interface pour les Attributs

 Les attributs sont aussi des Node


 Pour un Node de type Element
– NamedNodeMap getAttributes(), permet de renvoyer la liste
des attributs
 L’interface NamedNodeMap offre les méthodes
– int getLength(), pour récupérer le nombre des attributs
– Node item(int i), pour récupérer le ième attributs
– String getNodeName(), pour récupérer le nom de l’attribut
– String getNodeValue(), pour récupérer sa valeur

12
Démonstration

12
Squelette du programme

public class DomEcho {


public static void main(String argv[])
{
if (argv.length != 1) {
System.out.println("passer le nom du fichier");
System.exit(1);
}
}// main
}// DomEcho

12
Les imports
 Les APIs JAXP
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
 Les exceptions
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import java.io.IOException;
 La définition w3c
import org.w3c.dom.Node;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
 Lecture du fichier XML
import java.io.File;

13
Déclaration du DOM

public class DomEcho


{
static Document document;
public static void main(String argv[])
{
….

13
Instanciation de la manufacture

 Création d’une instance de la manufacture de parseur


DOM:
public static void main(String argv[])
{
if (argv.length != 1) {
...
}
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
try {

13
Création du parseur

 A partir de la manufacture, on crée le parseur


 Le DOM est obtenu en faisant appel à la
méthode parse
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse( new File(argv[0]) );
}
catch(Exception e)
{
System.out.println("erreur de parsing");
13 }
Exécution

 Compiler la classe EchoDom.java


– javac EchoDom.java
 L’exécuter en donnant un fichier xml en ligne
de commande
– java EchoDom bouteilles.xml
 Vous avez généré votre premier DOM!

13
Affichage du tag racine

 La méthode getDocumentElement() permet de


renvoyer l’élément racine d’un document xml (de
type org.w3c.dom.Element)
 La méthode getTagName() permet d’extraire le
nom de la balise d’un élément
 Rajouter le code:
document = builder.parse( new File(argv[0]) );
Element e =document.getDocumentElement();
System.out.println(e.getTagName());
}

13
Exécution

 Compiler la classe EchoDom.java


– javac EchoDom.java
 L’exécuter en donnant un fichier xml en ligne
de commande
– java EchoDom bouteilles.xml

13
Traitement d’un commentaire

 Un commentaire est un Node de type COMMENT_NODE


– getNodeName renvoie #comment
– getNodeValue renvoie le commentaire associé
 Introduire la méthode:
public static void traiterCommentaire(Node n)
{
if(n.getNodeType()!=Node.COMMENT_NODE)
{
System.out.println("la valeur de Type: "+n.getNodeType());
System.out.println("Le noeud ne correspond pas à un commentaire");
System.exit(1);
}
System.out.println("commentaire: "+n.getNodeValue());
13 }
Traitement des instructions

 Une instruction est un Node de type PROCESSING_INSTRUCTION_NODE


– getNodeName renvoie la cible
– getNodeValue renvoie les données
 Introduire la méthode:
public static void traiterInstruction(Node n)
{
if(n.getNodeType()!=Node.PROCESSING_INSTRUCTION_NODE)
{
System.out.println("la valeur de Type: "+n.getNodeType());
System.out.println("Le noeud ne correspond pas à une instruction");
System.exit(1);
}
System.out.println("Instruction :"+n.getNodeName()+ " "+n.getNodeValue());
13 }
Traitement d’une balise

 Une balise est un Node de type ELEMENT_NODE


– getNodeName renvoie le nom de la balise
– getNodeValue renvoie null
 Introduire la méthode:
public static void traiterElement(Node n)
{
if(n.getNodeType()!=Node.ELEMENT_NODE)
{
System.out.println("la valeur de Type: "+n.getNodeType());
System.out.println("Le noeud ne correspond pas à un element");
System.exit(1);
}
System.out.print("balise: ");
13 System.out.println(n.getNodeName());
Traitement d’un nœud texte

 Le texte contenu dans une balise est un Node de type TEXT_NODE


– getNodeName renvoie #text
– getNodeValue renvoie la chaine de caractères correspondant au texte
 Introduire la méthode:
public static void traiterText(Node n)
{
if(n.getNodeType()!=Node.TEXT_NODE)
{
System.out.println("la valeur de Type: "+n.getNodeType());
System.out.println("Le noeud ne correspond pas à du texte");
System.exit(1);
}
System.out.print("+ Text: "+n.getNodeValue());
14 }
Traitement des attributs (1/2)

 Les attributs d’un nœud (forcément de type


ELEMENT_NODE) sont récupérés via la
méthode:
– NamedNodeMap getAttributes();
 Un attribut est un Node de type
ATTRIBUTE_NODE
– getNodeName renvoie le nom de l’attribut
– getNodeValue renvoie sa valeur

14
Traitement des attributs (2/2)

 Introduire la méthode:
public static void traiterListAttributs(Node n)
{
NamedNodeMap NNM=n.getAttributes();
Node m;
int l=NNM.getLength();
for (int i=0;i<l;i++)
{
m=NNM.item(i);
System.out.print("\n Attribut: "+m.getNodeName()+" = "+m.getNodeValue());
}
System.out.println("");
}
14
Traitement d’un nœud de l’arbre (1/2)

 Introduire la méthode:
public static void traiterNoeud(Node n)
{
switch(n.getNodeType()) {
case Node.TEXT_NODE:
traiterText(n);
break;
case Node.COMMENT_NODE:
traiterCommentaire(n);
break;
case Node.PROCESSING_INSTRUCTION_NODE:
14 traiterInstruction(n);
Traitement d’un nœud de l’arbre (2/2)

case Node.ELEMENT_NODE:
traiterElement(n);
if(n.hasAttributes())
{
traiterListAttributs(n);
}
NodeList NL=n.getChildNodes();
for(int i=0;i<NL.getLength();i++)
{
traiterNoeud(NL.item(i));
}
break;
default: System.out.println("Type de nœud non pris en compte");
}
}

14
Traitement du document

 Le document est un Node de type DOCUMENT_NODE


– getNodeName renvoie #document
– getNodeValue renvoie null
 Donne accès à l’arborescence complète du dom
 Introduire la méthode:
public static void traiterDocument(Node n)
{
NodeList NL=n.getChildNodes();
for(int i=0;i<NL.getLength();i++)
{
traiterNoeud(NL.item(i));
}
14 }
Parcours et affichage du DOM

public static void main(String argv[])


{ ….
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {DocumentBuilder builder =factory.newDocumentBuilder();
document = builder.parse( new File(argv[0]) );
//Element e =document.getDocumentElement();
//System.out.println(e.getTagName());
traiterDocument(document);
}
catch(Exception e)
{
System.out.println("erreur de parsing");
}

14
Exécution

 Recompiler la classe EchoDom.java


– javac EchoDom.java
 L’exécuter en donnant un fichier xml en ligne
de commande
– java EchoDom bouteilles.xml

14
Exemple: Modification
de l’arbre DOM (1/2)

 Modifier l’arbre de dom


 Mettre le premier fils de l’élément racine en dernier
 Utiliser les méthodes
– getDocumentElement() pour récupérer la balise racine
– getFirstChild() pour récuprer le premier fils
– appendChild(Node) pour introduire un dernier fils
 Quand un nœud est déplacé tous ces fils sont
déplacés avec lui

14
Exemple:
Modification de l’arbre DOM (2/2)

 Modifier la méthode traiterDocument:


public static void traiterDocument(Document d)
{
Node n=d.getDocumentElement();
n.appendChild(n.getFirstChild());
NodeList NL=d.getChildNodes();
for(int i=0;i<NL.getLength();i++)
{
traiterNoeud(NL.item(i));
}
}

14  Recompiler et exécuter
A vous de jouer!
 Modifier le code pour:
– Afficher exclusivement les marques des bouteilles
– Afficher les marques et les sources des bouteilles (sous la forme:
ville, departement)
– Afficher la marque de la bouteille qui possède le plus haut niveau
de magnésium ainsi que la valeur correspondante
– Afficher la marque qui possède le plus bas niveau de nitrate
– Afficher la valeur moyenne des niveaux de magnésium et de
nitrate pour toutes les bouteilles référencées dans le document
XML
– Transformer le DOM pour trier les bouteilles par ordre croissant de
teneur en calcium

15
Algorithme de tri par selection
procedure triSelection(entier tab[ ])
variables i, k,posmin,tmp: entiers
pour (i de 0 à N-2 en incrémentant de 1) faire
/* recherche du numéro du minimum */
posmin <- i;
Pour (k de i+1 à N-1 en incrémentant de 1) faire
Si (tab[k] < tab[posmin]) alors posmin <- k;
finSi
finPour
/* échange des valeurs entre la case courante et le minimum */
tmp <- tab[i];
tab[i] <- tab[posmin];
tab[posmin] <- tmp;
finPour

15
L’API Transformer de JAXP

XPATH et XSLT

15
Plan

 Introduction du package javax.xml.transform


 Exemple: Transformations d’un DOM vers un
fichier XML
 XPATH
 XSLT
 Transformations à base de règles XSLT

15
Introduction au package
javax.xml.transform

15
Le package JAXP pour la
transformation

 Le package pour la transformation dans


JAXP:
– javax.xml.transform: package définissant
 La classe factory pour la génération des
transformateurs
 La classe des transformateurs

15
La manufacture des transformateurs

 JAXP offre une manufacture pour la création de


parseurs transformateurs
– TransformerFactory dans le package javax.xml.transform
– La méthode newInstance permet d’en créer une instance
 TransformerFactory fact=
TransformerFactory.newInstance();
 La manufacture permet de créer des instances de
transformateurs
– Transformer trans = fact.newTransformer();
– Transformer trans = fact.newTransformer(Source s);

15
Les transformateurs

 Transforment un arbre source vers un arbre


résultat en faisant appel à la méthode
transform
 trans.transform(Source in, Result out )
– in: l’élement à analyser de type Source
– out: l’élément résultant de la transformation de
type Result
– Renvoie void

15
Les packages Source et Result

 javax.xml.transform.dom: package définissant les classes


DOMSource et DOMResult permettant de transformer et
de générer des DOM
 javax.xml.transform.sax: package définissant les classes
SAXSource et SAXResult permettant d’utiliser un parser
SAX comme source ou de générer des événements SAX
en sortie pour un parser SAX
 javax.xml.transform.stream: package définissant les
classes StreamSource et StreamResult permettant
d’utiliser des fichiers comme source et sortie d’un
transformateur
15
L’interface Source

 Permet de définir l’arbre source à


transformer
 L’interface source est implémentée par les
classes suivantes:
– DOMSource: l’arbre source est un DOM
– SAXSource: l’arbre source est un SAX
– StreamSource: l’arbre source est un fichier
quelconque

15
La classe DOMSource

 DOMSource:
– Permet de définir un DOM comme source de la
transformation
– Constructeurs:
 DOMSource()
 DOMSource(Node n)
– Méthodes principales
 Node getNode()
 Void setNode(Node n)

16
La classe SAXSource

 SAXSource:
– Permet de définir un SAX comme source de la
transformation
– Constructeurs:
 SAXSource()
 SAXSource(InputSource IS)
– Méthodes principales
 InputSource getInputSource()
 void setInputSource(InputSource IS)

16
La classe StreamSource

 StreamSource:
– Permet de définir un fichier comme source de la
transformation
– Constructeurs:
 StreamSource()
 StreamSource(File f)
 StreamSource(InputStream IS)
– Méthodes principales
 InputStream getInputStream()
 Void setInputStream(InputStream IS)

16
L’interface Result

 Permet de définir l’arbre résultant de la


transformation
 L’interface Result est implémentée par les
classes suivantes
– DOMResult: l’arbre résultant est un DOM
– SAXResult: l’arbre résultant est un SAX
– StreamResult: l’arbre résultant est un fichier
quelconque

16
La classe DOMResult

 DOMResult:
– Permet de définir un DOM comme résultat de la
transformation
– Constructeurs:
 DOMResult()
 DOMResult(Node n)
– Méthodes principales
 Node getNode()
 Void setNode(Node n)

16
La classe SAXResult

 SAXResult:
– Permet de définir un parseur SAX comme résultat
de la transformation
– Constructeurs:
 SAXResult()
 SAXResult(ContentHandler CH)
– Méthodes principales
 ContentHandler getHandler()
 void setHandler(ContentHandler CH)

16
La classe StreamResult

 StreamResult:
– Permet de définir un fichier comme résultat de la
transformation
– Constructeurs:
 StreamResult()
 StreamResult(File f)
 StreamResult(OutputStream OS)
– Méthodes principales
 OutputStream getOutputStream()
 Void setOutputStream(OutputStream OS)

16
Un programme simple:
Transformer un DOM pour
générer un fichier XML

16
Du DOM vers l’XML

 La méthode transform prend en paramètre


plusieurs types de sources et de résultats
 Une des utilisations utiles correspond à
transformer un DOM en un fichier XML pour
en afficher le contenu
 Dans ce cas
– Source correspondra à un type DOMSource
– Result correspondra à un type StreamResult

16
Squelette du programme

 Reprenons la classe DOMEcho en sa


première version
 Cette version permettait de générer un objet
DOM à partir d’un fichier XML
 Maintenant essayons de générer un fichier
XML avec le contenu de l’objet DOM obtenu

16
Rappelez-vous le premier code la
classe DOM Echo

 Les imports:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.*;
import org.w3c.dom.*;
import java.io.File;
import java.io.IOException;

17
Les imports

 Ajouter les imports pour le transformateur, le


type source et le type résultat:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

17
Le code de la classe EchoDOM
public class EchoDOM{
static Document document;
public static void main(String argv[])
{
if (argv.length != 1) {
System.err.println("passer nom du fichier XML en ligne de commande");
System.exit(1);
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder =factory.newDocumentBuilder();
document = builder.parse( new File(argv[0]) );}
catch(Exception e){
System.out.println(e.getMessage());
System.exit(2); }}}

17
La classe Transform_DOM_XML (1/2)

public class Transform_DOM_XML{


static Document document;
public static void main(String argv[])
{
if (argv.length != 2) {
System.err.println("passer le nom des fichiers source et résultat en ligne de
commande");
System.exit(1);
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder =factory.newDocumentBuilder();
document = builder.parse( new File(argv[0]) );

17
La classe Transform_DOM_XML (2/2)

.......
// transformation du DOM
TransformerFactory TFactory = TransformerFactory.newInstance();
Transformer transformer = TFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(argv[1]));
transformer.transform(source, result);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(2);
}}}

17
Exécution

 Compiler la classe Transform_DOM_XML


– javac Transform_DOM_XML.java
 Exécuter
– java Transform_DOM_XML bouteilles.xml
Resultat.xml
 Si tout va bien, bouteilles.xml et Resultat.xml
ont le même contenu

17
Transformer une branche d’un DOM

 Le constructeur de DOMSource prend en


paramètre un objet de type Node
– Node n;
– DOMSource DOMS= new DOMSource(n);
 Il est possible de transformer une branche
d’un DOM
 Permet de trier l’information contenu dans un
DOM
17
Reprenons la classe
Transform_DOM_XML
.......
// transformation du DOM
TransformerFactory TFactory = TransformerFactory.newInstance();
Transformer transformer = TFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(argv[1]));
transformer.transform(source, result);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(2);
}}}

17
Faisons une selection sur la
première bouteille

17
Exécution

 Compiler la classe Transform_FirstNode_XML


– javac Transform_FirstNode_XML.java
 Exécuter
– java Transform_FirstNode_XML bouteilles.xml
Resultat.xml
 Maintenant, Resultat.xml contient
exclusivement les éléments de la première
bouteille

17
Transformer et les
feuilles de style

18
La fonction transform avec une
feuille de style

 Précédemment, nous utilisions le


transformateur pour passer d’un
représentation à une autre (e.g. d’un DOM
vers un fichier XML) de manière générique
 Nous allons utiliser une feuille de style pour
spécifier les actions de transformation

18
La suite…

 Nous allons introduire dans la suite


– La recommandation XPATH
– La recommandation XSLT
 XSLT utilisant XPATH pour la navigation et la
sélection des nœuds d’un document XML,
nous allons commencer par introduire
XPATH

18
XPATH

18
XPATH (XML Path Language)

 XPATH est une recommandation W3C


 Utilise la représentation arborescente d’un
document XML
 Permet de
– Naviguer à travers ces nœuds
– Sélectionner des nœuds spécifiques en se basant
sur des critères de sélection

18
Les expression XPATH (1/3)

 Une expression XPATH est un patron


(pattern) permettant de sélectionner un
ensemble de nœuds XML
 XSLT utilise ces patrons pour appliquer les
transformations

18
Les expressions XPATH (2/3)

 Chaque expression est exprimée par rapport à un nœud


contexte
 Les étapes de localisation sont réalisées par rapport à ce
nœud
 Deux notations sont définies pour XPATH
– Syntaxe abréviée (Abbreviated syntaxe)
 Plus compacte, plus intuitive:
 /B1/B2/B3
– Syntaxe complète (full syntaxe)
 Plus verbeuse, plus complète:
 /child::B1/child::B2/child::B3

18
Les expressions XPATH (3/3)

 Afin d’affiner la sélection des nœuds XML


appartenant à ce chemin, XPATH permet de définir
des expressions avec des contraintes et des critères
de sélection
 Les expressions XPATH peuvent combiner:
– Des jokers (wildcards)
– Des opérateurs
– Des fonctions

18
Les nœuds XPATH

 XPATH prend en compte sept types de nœuds


– La racine
– Les éléments
– Le texte
– Les attributs
– Les commentaires
– Les instructions de traitement
– Les espaces de nommage

18
Eléments du chemin XPATH

 Pour la notation abréviée on peut retrouver les


éléments de chemin suivants:
– Le slash (/) constitue l’élément de séparation dans les
chemins
– Un chemin absolu commençant par la racine du
document, commence par un /
– Un chemin relatif commençant à partir d’un nœud
donné peut commencer par n’importe quoi
– “..” correspond au parent du nœud courant
– “.” correspond au nœud courant
18
Les attributs

 Les attributs sont spécifiés en utilisant la


syntaxe:
– balise1/@nomAttribut
– Exemple: /BOUTEILLES/bouteille/@couleur

19
Indexation et critères de sélection

 « [ ] » est utilisé pour


– Indexer les éléments
– Spécifier un critère de sélection
– Exemples
 /BOUTEILLES/bouteille[2]
 /BOUTEILLES/bouteille[@couleur="sans"]
– Possibilité de combiner les deux, exemples
 /BOUTEILLES/bouteille[@couleur="sans"][2]

19
Les jokers

 Les jokers considérés par XPATH


– « * » permettant de sélectionner tous les nœuds
éléments (tous les nœuds sauf les attributs et le texte)
– node() permettant de sélectionner tous les nœuds y
compris les attributs et le texte
– « @* » permettant de sélectionner tous les attributs
– Exemples
 /BOUTEILLES/*/marque
 /BOUTEILLES/*/*

19
Spécification de chemins avec
niveau d’imbrication indéterminé

 XPATH permet de spécifier des chemins


sans donner le niveau de hiérarchie pour
atteindre les nœuds
 « // » correspond à un niveau de hiérarchie
indéterminé
 Exemple
– /BOUTEILLES//ville

19
Types XPATH

 XPATH prend en compte les types suivants:


– Les ensembles de nœuds
– Les chaînes de caractères
– Les booléens
– Les valeurs numériques

19
Opérateurs XPATH

 XPATH prend en compte les opérateurs suivants:


– Opérateur de choix : « | »
 Exemple: /*//calcium|magnesium
– Les opérateurs or et and sur les booléens
 Exemple /BOUTEILLES/bouteille[@couleur="sans" or
@odeur="sans"]
– Les opérateurs « = » et « != »
– Les opérateurs <, >, <=, >=, +, -, *, div, mod sur les nombres
 Les parenthèses peuvent être utilisées pour éviter les
problèmes de précédence

19
Le texte
 Dans XPATH, le texte contenu dans un élément
(String-value) est la concaténation de tout le contenu
texte des balises filles
 Exemple:
– Pour le nœud
<source> La source:
<ville>St-Cyr la Source</ville>
<departement>Loiret</departement>
</source>
– Le String-value de source correspond à la chaîne de
caractères: La source:St-Cyr la SourceLoiret

19
Les fonctions XPATH

 La fonction text() permet d’obtenir le contenu texte d’un


nœud
– /BOUTEILLES//source/text()
 XPATH propose des fonctions de position
– last() permet d’indiquer le dernier élément
 /BOUTEILLES//source[last()]
– position() permet de renvoyer la position d’un élément
 /BOUTEILLES//source[position()<3]
– Count(b1) permet de renvoyer le nombre de fils portant le nom
b1
 /BOUTEILLES//source[count(ville)=1]

19
Les fonctions pour les chaînes de
caractères

 XPATH propose les fonctions suivantes


– concat(string, string, ...)
– starts-with(string1, string2)
– substring-before(string1, string2)
– substring-after(string1, string2)
– substring(string, idx)
– substring(string, idx, len)
– string-length(string)

19
Les fonctions booléennes

 not(exp1): renvoie la négation de l’expression


exp1
 true(): retourne vrai
 false(): retourne faux
 lang(langue)retourne vrai si la langue (définit
par l’attribut xml:lang correspond.
– Exemple : lang("fr") renvoie true pour le nœud
<bouteille xml:lang="fr">

19
Les fonctions numériques

 XPATH propose les fonctions numériques


– http://www.w3.org/TR/xpath-functions/#numeric-
functions
– sum(…)
– avg(…)
– abs(N): retourne la valeur absolue de N.
– round(r): retourne l’entier le plus proche de r.

20
Les fonctions de conversion

 Permet de transformer une donnée d’un type à un


autre
– string(...): retourne la valeur string d’un nombre, un booléen
ou un ensemble de nœuds
– boolean(...): retourne la valeur booléenne d’un nombre, un
string ou un ensemble de nœuds. (un nombre non nul, un
string ou un ensemble de nœuds non vides renvoient true
– number(...): retourne la valeur numérique d’un booléen (1
pour true et 0 pour false),

20
XSLT

20
eXtensible Stylesheet Language
Transformation

 XSLT, une recommandation W3C basée sur


XML
 Décrit une transformation par le biais de
règles appliquées à des nœuds particuliers
de l’arbre XML.
 Utilise XPATH pour la navigation et la
sélection des nœuds d’un document XML

20
Fonctionnement d’une
transformation XSLT (1/2)
 Une transformation XSLT est exprimée comme un
document XML
 Ce document contient des éléments appartenant à
l’espace de nom spécifique défini par le W3C
 Une transformation exprimée en XSLT décrit les règles
pour transformer un arbre source en un arbre résultat
 La transformation est obtenue en associant des motifs à
des modèles
– Les motifs sont appliqués aux éléments de l'arbre source
– Le modèle est instancié pour créer une partie de l'arbre résultat

20
Fonctionnement d’une
transformation XSLT (1/2)

 L'arbre résultat est distinct de l'arbre source


 La structure de l'arbre résultat peut être
complètement différente de la structure de
l'arbre source
 Pendant la construction de l'arbre résultat,
– des éléments de l'arbre source peuvent être filtrés
et réordonnés
– des structures arbitraires peuvent être ajoutées

20
XSLT et XPATH

 XSLT utilise le langage d'expression défini


par XPATH pour sélectionner les éléments à
traiter, les traitements conditionnels et la
génération de texte.

20
L’espace de nom XSLT

 Les processeurs XSLT doivent utiliser le mécanisme


des espaces de noms pour reconnaître les éléments et
les attributs de cet espace de noms
 L'URI de l'espace de noms XSLT est :
http://www.w3.org/1999/XSL/Transform
 Utilise le préfixe xsl: pour référencer les éléments de
l'espace de noms XSLT
 Liste des éléments de cet espace:
http://xmlfr.org/w3c/TR/xslt/#element-syntax-summary

20
Les templates XSLT

 Un template XSLT est un ensemble


d’instructions de formatage appliquées à des
nœuds sélectionnés par des expressions
XPATH
 Syntaxe:

<xsl:template match="un chemin XPATH">


Texte à générer…
</xsl:template>
20
Démonstration

20
Exemple didactique

 Expérimentons la méthode transform avec une feuille de


style
 Ceci permet de transformer un fichier XML en un fichier
XML, HTML, ou texte
 A la création de l’instance transformer, nous allons lui
passer une feuille de style pour le traitement des différentes
balises
 Exemple didactique: prendre notre document XML
bouteilles et générer un fichier HTML permettant d’afficher
et de présenter convenablement les informations
pertinentes
21
La fonction transform avec une
feuille de style

 Précédemment, nous utilisions le


transformateur pour passer d’un
représentation à une autre (e.g. d’un DOM
vers un fichier XML) de manière générique
 Nous allons utiliser une feuille de style pour
spécifier les actions de transformation

21
La feuille de style (1/2)

 Une feuille de style (extension xsl) est un document


XML
 Le nœud racine est xsl:stylesheet avec les attributs
obligatoires
– xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
– Version="1.0"
 Une balise <xsl:outputmethode="typeSortie"> définit
le type de document généré
– xml (par défaut), html, ou text

21
La feuille de style (2/2)

 Une feuille de style contient un ensemble de


templates à appliquer sur les différents nœuds
du document à analyser:
<xsl:template match="un chemin XPATH">
Texte à insérer
</xsl:template>
 Pour toutes les balises non capturées par un
template, le string-value correspondant est
générée
21
Une première feuille de style

 Dans un fichier nommé Style.xsl, introduire le


code suivant:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
</xsl:stylesheet>
 C’est la feuille de style minimale
21
Reprenons le code de la classe
Transform_DOM_XML

 A partir de cette classe, mettre à jour le code


pour définir la classe TransformXSLT

import javax.xml.transform.stream.StreamSource;
public class TransformXSLT{
static Document document;
public static void main(String argv[])
{
if (argv.length != 3)
{System.err.println("passer aussi la feuille de style en ligne de
commande");
System.exit(1);}
21
Génération du transformer

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
try{
File style=new File(argv[0]);
File XML=new File(argv[1]);
DocumentBuilder builder =factory.newDocumentBuilder();
document = builder.parse(XML);
StreamSource styleSource= new StreamSource(style);
TransformerFactory tFactory = TransformerFactory.newInstance();
// passer la feuille de style xslt comme argument du constructeur
Transformer transformer = tFactory.newTransformer(styleSource);
21
Transformation en utilisant la feuille
de style


DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(argv[2]));
transformer.transform(source, result);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(2);
}
}// fin main
}//fin class

21
Exécution

 Compiler la classe TransformXSLT


– javac TransformXSLT.java
 Exécuter le code
– java TransformXSLT Style.xsl bouteilles.xml
Sortie.html
 Ouvrir le fichier Sortie.html avec un browser
 Nous retrouvons le String-value du document
– Une concaténation de tout le texte contenu dans la
balise racine et dans ces balises filles
21
Un premier template

 Dans la feuille de style Style.xsl, introduire le


template de traitement du nœud racine pour
obtenir un fichier html
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet….>
<xsl:template match="/">
<html> <body>
<xsl:apply-templates/>
</body> </html>
</xsl:template>
21 </xsl:stylesheet>
Un deuxième template

 Ajouter un deuxième template pour le nœud


<BOUTEILLES>:

<xsl:template match="/BOUTEILLES">
<h1 align="center"> Mes Bouteilles </h1>
<xsl:apply-templates/>
</xsl:template>

 Ré-exécuter le code de TransformXSLT avec
la nouvelle feuille de style
22
Un troisième template

 Ajouter le traitement pour les balises


<bouteille>
<xsl:template match="/BOUTEILLES/bouteille">
<h2>Une bouteille d'eau</h2>
<h3>
<xsl:apply-templates/>
</h3>
</xsl:template>

22
Traitement de la balise marque

 Utiliser le « // » pour éviter de donner tout le


chemin:
<xsl:template match="//marque">
<h4> elle est de marque:
<xsl:apply-templates/>
</h4>
</xsl:template>

22
Afficher la composition sous forme
d’items

<xsl:template match="//composition">
<h4> Ma bouteille se compose de:
<h5>
<ul>
<xsl:apply-templates/>
</ul>
</h5>
</h4>
</xsl:template>
22
Afficher les items

<xsl:template match="//calcium">
<li>
<xsl:apply-templates/>
mg/l de calcium
</li>
</xsl:template>
 Introduire les templates équivalents pour les
balises: magnesium, chlorure, et nitrate

22
Pour ne pas afficher le contenu
d’une balise

 Ne rien faire! :
<xsl:template match="//source">
On veut pas afficher la source <br/>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="//ville|//departement">
</xsl:template>
22
Ignorer le reste d’un document

 Introduire le template vide avec le joker « * »:

<xsl:template match="*">
</xsl:template>

22
Réordonner l’information

 Exemple, analyser la composition avant la


marque
<xsl:template match="/BOUTEILLES/bouteille">
<h2>Une bouteille d'eau</h2>
<h3>
<xsl:apply-templates select="text()|composition"/>
<xsl:apply-templates select="marque"/>
</h3>
</xsl:template>

22
A vous de jouer!
 Ecrire de feuilles de style pour générer un fichier comprenant:
– Exclusivement les marques des bouteilles
– Les marques et les sources des bouteilles (sous la forme: ville,
departement)
– Les marques ainsi que les valeurs correspondantes de calcium
– La marque de la bouteille qui possède le plus haut niveau de
magnésium ainsi que la valeur correspondante
– La marque qui possède le plus bas niveau de nitrate

22
Merci de votre attention

22

Vous aimerez peut-être aussi