Architecture SOA et Service Web
Schéma XML et XPath
Ghallabi Sameh
ISIMM
A.U. 2022-2023
Schéma XML
Les schémas XML permettent, comme les DTD, de définir des
modèles de documents.
Il est ensuite possible de vérifier qu'un document donné est valide pour
un schéma c'est-à-dire respecte les contraintes données par le schéma.
Un schéma XML définit :
- La signification et les relations entre différents éléments et leur contenu.
-Les attributs et leurs valeurs
-Les types de données, les attributs associés à ces données.
Caractéristiques des schémas XML
Organisation des balises ou de leur contenu.
Possibilité de typer des données
-Eléments simples et complexes
-Attributs simples
Possibilité de définir des contraintes
-Existence, obligatoire, optionnel
-Domaines, cardinalités, références
Plus riche et complet que les DTD
Gestion des espaces de noms
Réutilisation par importation et héritage
Structure de base d’un schéma XML
Comme tout document XML, un schéma XML commence par un
prologue et a un élément racine.
Le schéma XML utilise un espace de nom xsd.
L'élément racine est l'élément xsd:schema
Exemple: Le document XML-Schéma ("[Link]")
Déclaration des éléments
Dans un schéma, un élément se déclare avec la balise < xsd:element >
L’attribut name de xsd:element contient le nom de l’élément.
Les éléments composés d’attributs et de sous éléments devront inclure une
balise xsd:complexType.
Exemple:
Ce schéma déclare deux éléments :
remarque et contacts
A chaque élément est associé un type via l'attribut type
-remarque de type xsd:string, type simple prédéfini de XML Schema
-contacts de type typeContacts, type complexe défini par l'utilisateur
Déclaration des éléments
Un élément peut avoir un type:
[Link] simple: si sa valeur a un type prédéfini en XML-Schéma ou une
extension de ces types.
1.1. Types primitifs: string, boolean, float, double, integer,…
1.2. Types dérivés : dérivent d’un type primitif ou d’un autre type dérivé.
1.2.1 Dérivation par restriction,
1.2.2 Dérivation par extension,
1.2.3 Dérivation par union,
1.2.3 Dérivation par liste.
2. Type complexe: s’il contient des sous éléments ou s’il comporte au moins un
attribut
2.1. Collection ordonnée d'éléments typés: xsd:sequence
2.2. Choix entre éléments typés: xsd:choice
2.3. Collection non ordonnée d'éléments typés: xsd:all
Types simples : Primitif
Dans un schéma XML, un élément simple se déclare avec la balise
xsd:element.
Un élément simple est un élément qui ne possède pas de sous-
éléments.
Un type simple, c’est par exemple un chiffre, une date ou encore une
chaîne de caractères.
Exemple de déclaration d'un élément de type simple
Quelques types prédéfinis
String Bonjour
Boolean {true, false, 1, 0}
………
Dérivation de types simples
Dérivation par restriction (1/3)
La dérivation par restriction restreint l’ensemble des valeurs d'un
type pré-existant.
La restriction est définie par des contraintes de facettes du type de
base: valeur min, valeur max ...
Exemple:
Les contraintes de facettes (2/3)
on distingue différents types de contraintes, appelés facettes:
lenght : la longueur d’une donnée.
minLenght: la longueur minimale.
maxLenght: la longueur maximale.
enumeration: un ensemble discret de valeurs.
maxInclusive: une valeur max comprise.
maxExclusive: une valeur max exclue.
minInclusive: une valeur min comprise.
minExclusive : une valeur min exclue.
Les contraintes de facettes (2/3)
Exemple1:
Exemple2:
Dérivation de types simples
Dérivation par extension
Dériver un nouveau type par extension consiste à ajouter à un type
existant des sous-éléments ou des attributs.
On obtient inévitablement un type complexe.
Exemple 1: cas de l’ajout de l’unité de mesure ‘unit’ à la valeur
donnée ‘Mesure’ (cas d’une base de type simple
Dérivation de types simples
Dérivation par liste
Une liste permet de définir un nouveau type de sorte qu’une valeur
du nouveau type est une liste de valeurs du type pré_existant
(valeurs séparées par espace).
Types complexes
Un élément complexe est un élément qui peut contenir d’autres
éléments ou bien des attributs.
Un élément complexe se déclare en utilisant la balise
xsd:complexType
Trois façons de composer des éléments dans un type complexe:
-sequence,
- choice,
-all.
Types complexes: Sequence
Un type sequence est défini par une suite de sous-éléments qui
doivent être présents dans l'ordre donné.
Le nombre d'occurences de chaque sous-élément est défini par les
attributs minOccurs et maxOccurs.
Exemple
.
Types complexes: Choice
Un seul des éléments listés doit être présent.
Le nombre d'occurences possibles est déterminé par les attributs
minOccurs et maxOccurs de l’élément.
Exemple 1
.
Types complexes: All
Le type all est utilisé lorsque l’on veut spécifier que les éléments
contenus dans un type complexe peuvent apparaître dans n’importe
quel ordre.
Syntaxe Exemple
.
Déclaration des attributs
La définition d’attributs associés à un élément se fait dans un élément
qui possède les attributs suivants:
Name : nom de l’attribut
Type : type de l’attribut, par exemple xsd:string, xsd:boolean, .
Use : permet de préciser si l’attribut est obligatoire ou optionnel: required
(obligatoire), optional (facultatif)
Value : fixed ou default (valeur par défaut)
Types complexes: All
Le type all est utilisé lorsque l’on veut spécifier que les éléments
contenus dans un type complexe peuvent apparaître dans n’importe
quel ordre.
Syntaxe Exemple
.
Exercice
1. Rédiger un Schéma XML pour une bibliographie. Cette bibliographie :
• contient des livres et des articles :
• les informations nécessaires pour un livre (élément livre) sont :
-son titre général (élément titre) ;
-les noms des auteurs (éléments auteur) ;
-ses tomes (élément tomes) et pour chaque tome (éléments tome), leur nombre
de pages (élément pages) ;
-des informations générales sur son édition (élément infosEdition)comme par
exemple le nom de l'éditeur (élément editeur), le lieu d'édition (élément
lieuEdition), le lieu d'impression (élément lieuImpression), son numéro ISBN
(élément ISBN) ;
.
Exercice
• les informations nécessaires pour un article (élément article) sont :
-son titre (élément titre) ;
-les noms des auteurs (éléments auteur) ;
-ses références de publication (élément infosPublication) : nom du journal
(élément nomJournal), numéro des pages (élément pages), année de publication
(élément anneePublication) et numéro du journal (élément numéroJournal)
- on réservera aussi un champ optionnel, pour chaque article, pour un avis
élément avis)
.
XML Path Language (XPath)
Document XML = ensemble de balises organisées hiérarchiquement
(structure d ’arbre).
Xpath peut être utilisé pour parcourir les éléments et les attributs
d’un document XML.
XPATH est un langage non-XML (çàd syntaxe non XML) qui offre
un moyen permettant d’identifier un ensemble de nœuds dans un
document XML.
Le langage XPath
Il utilise des expressions de chemin pour désigner des nœuds
dans l’arbre.
ces expressions de chemin ressemblent beaucoup aux ces
expressions de chemin que vous utilisez avec les systèmes des
fichiers informatiques traditionnels.
Une expression XPATH indique le chemin de localisation d’un
nœud dans le document XML.
comparaison XPath/système de
fichiers
XPath : Principe
Expression XPath : Chaîne spécifiant la sélection d'un ensemble de
nœuds dans un arbre.
Exemple:
XPath terminologie
Nœuds:
Dans XPath, il y a sept types de nœuds : élément, attribut, texte,
namespace, instruction de traitement, commentaire et document.
Les documents XML sont traités comme des arbres de nœuds.
L'élément supérieure de l'arbre est appelé l'élément racine.
Exemple:
- <bookstore> (nœud élément racine)
- <author>J K. Rowling</author> (nœud élément)
- lang="en" (nœud attribut )
XPath terminologie
Relation de nœuds:
-Parent
Chaque élément et attribut a un parent. Dans l'exemple suivant. l'élément book est
le parent des éléments title, author, year et le price
-Enfants
Nœuds d'élément peuvent avoir zéro, un ou plusieurs enfants. Dans l'exemple
suivant. les éléments title, author, year et le price sont tous les enfants de
l'élément book .
-Ancêtres
Parent d'un nœud, parent du parent, etc
-Descendants
Les enfants d’un nœud, les enfants des enfants, etc. Dans l'exemple suivant, les
descendants de l'élément bookstore sont les éléments book, title, author, year et
price. Et les descendants de l'élément book sont les éléments title, author, year et
price
XPath - Expression de chemins
Une expression de chemins
-spécifie une traversée de l'arbre du document (un chemin) :
• depuis un nœud de départ
• …..vers un ensemble de nœuds cibles
– a pour résultat
• un ensemble de nœuds
• ou une valeur, numérique, booléenne ou alphanumérique
Un chemin XPath est une suite d’étapes assemblées de gauche à
droite et séparées par le caractère « / »
– : [/]étape1 /étape2 /.../étapeN
Un chemin peut être :
– Absolu : commence à la racine; /étape1/…/étapeN
– Relatif : commence à un nœud courant (contexte), étape1/…/étapeN,
Exemple : /Stock/Produit/Comment
XPath : Sélecteur de nœud
Le nœud est sélectionné en suivant un chemin ou des étapes.
XPath : Sélecteur de nœud
Exemple:
Xpath: Sélection d'un ensemble
de nœuds
Xpath: Sélection d'un ensemble
de nœuds
XPath : Sélecteur de nœud
Une expression Xpath peut être une expression de chemin formée de
trois éléments :
-L’axe qui définit le sens de parcours des nœuds à partir du nœud contexte ;
-Le filtre :
qui indique le type des nœuds qui seront retenus dans l’évaluation de
l’expression ;
nom de nœud sélectionné (élément ou @attribut)
-Condition(prédicats)
que doivent satisfaire les noeuds retenus
Les prédicats sont exprimés entre « [] »
XPath : Sélecteur de nœud
Une expression Xpath peut être une expression de chemin formée de
trois éléments :
-L’axe qui définit le sens de parcours des nœuds à partir du nœud contexte ;
-Le filtre :
qui indique le type des nœuds qui seront retenus dans l’évaluation de
l’expression ;
nom de nœud sélectionné (élément ou @attribut)
-Condition(prédicats)
que doivent satisfaire les noeuds retenus
Les prédicats sont exprimés entre « [] »
Exemple:
/gdt/expose[comment][time]: les éléments expose qui contiennent un fils comment ET un
fils time
/gdt/expose[position()=2]: le deuxième élément expose fils de gdt à partir de la racine
XPath : exemple
XPath : exemple
XPath :Axes (ou direction)
XPath :Axes (ou direction)
XPath :Axes (ou direction)
Un axe spécifie quels sont les nœuds à considérer (quelle direction
suivre), relativement au nœud contexte:
self : sélectionne le nœud contexte lui-même (comme avec .)
child : sélectionne les enfants du nœud contexte (comme avec elmt_name)
descendant : sélectionne les descendants du nœud contexte (comme avec //)
parent : sélectionne le père du nœud contexte (comme avec ..).
following-sibling : sélectionne les frères suivants du nœud contexte (si le nœud
contexte n’est pas un élément, cet axe est vide) ;
preceding-sibling : sélectionne les frères précédents du nœud contexte (si le nœud
contexte n’est pas un élément, cet axe est vide) ;
attribute : sélectionne les nœuds attributs, fils du nœud contexte (si le nœud
contexte n’est pas un élément, cet axe est vide) ;
XPath :Axes (ou direction)
XPath :Axes (ou direction)
self : sélectionne uniquement le nœud contexte ;
descendant-or-self : sélectionne le nœud contexte et les nœuds
descendants du nœud contexte ;
ancestor-or-self : sélectionne le nœud contexte et les nœuds
ancêtres du nœud contexte.
XPath :Axes (ou direction)
Indique dans quelle partie de l’arbre (par rapport au nœud courant) il faut
chercher les nœuds à retourner.
XPath définit plusieurs axes dont 5 forment une partition de l’arbre
XPath :Axes (ou direction)
self:: (abrégé : .) nœud courant
child:: (abrégé : rien) les fils directs du nœud courant
attribute:: (abrégé :@) attributs
parent:: (abrégé : ..) nœud parent du nœud courant
XPath :Axes (ou direction)
XPath :Axes (ou direction)
XPath :Exemple
XPATH : Fonctions d’ensemble
node() : sélectionne tout nœud de l’axe ;
text() : sélectionne tout nœud de l’axe de type texte ;
comment() : sélectionne tout nœud de l’axe de type commentaire.
last() : vraie ssi le nœud est le dernier.
position() : renvoie la position du nœud courant.
id(nom) : renvoie le nœud identifié par l'étiquette nom.
XPATH : Exemples
•child::para : sélectionne les éléments para enfants du nœud contextuel.
• child::text() : tous les nœuds textuels du nœud contextuel.
• child::node() : tous les enfants du nœud contextuel, quel que soit leur type
(élément ou autre).
• attribute::name : l'attribut name du nœud contextuel.
• attribute::* : tous les attributs du nœud contextuel.
• descendant::para : tous les descendants para du nœud contextuel.
• ancestor::para : tous les ancêtres para du nœud contextuel.
• ancestor-or-self::section : tous les ancêtres section du nœud contextuel et le
nœud contextuel lui-même si c'est un section.
• descendant-or-self::para : tous les descendants para du nœud contextuel et le
nœud contextuel lui-même si c'est un para.
XPATH : Exercice
Soit le fichier XML [Link], présenté schématiquement ci-dessous:
XPATH : Exercice
Ecrivez les requêtes XPath suivantes :
Les titres de tous les films
Les titres des films ou joue Michel Blanc.
Les types de films répertoriés.
Les rôles joués par Michel Blanc.
L’acteur principal de chaque film (premier dans la distribution).
Le nom du producteur qui apparaît juste après Yves Rousset-Rouard
Les acteurs qui apparaissent avant Michel Blanc dans la distribution des films de
Patrice Leconte.
Les titres des films avec plus de 5 acteurs dans la distribution.
Titre des films qui n’ont pas obtenu de prix.
XPATH : Correction
//film/titre
//film[role/acteur=’Michel Blanc’]/titre
//film/@type/string()
//role[acteur=’Michel Blanc’]/nom
//film/role[1]/acteur
//producteur[nom=’Yves Rousset-Rouard’]/following-sibling ::producteur[1]
//film[realisateur=’Patrice Leconte’]/role[acteur=’Michel Blanc’]/precedingsibling
::role/acteur
//film[count(role)>5]/titre
//film[not(prix)]/titre
//film[count(prix)=0]/titre