Vous êtes sur la page 1sur 14

Revision DS: SOA (XML)

Exercice 1:
1. Que désigne un document XML bien formé ?
2.Que désigne un document XML valide?
3. Soit le fichier Carnet.xml (ci-dessous) qui représente un document XML ayant des erreurs.
Corrigez alors ce document XML. Essayez de marquer les corrections effectuées avec une
couleur différente.
<?xml version="1.0" encoding="UTF-8"?>
<carnet-adresse>
<entree>
<nom>DUPONT Michelle</nom>
<adresse>
<rue>6-55, rue de l'église<rue>
<code-postal>31000</code-postal>
<localite> Toulouse</localite>
<tel>0450505050</TEL>
<mail>dupmich@yahoo.fr</email>
</entree>
Exercice 2: Soit un extrait du fichier Livre.xml (ci-dessous) qui regroupe l'ensemble des
informations décrivant les livres qui ont obtenus des prix :
<?xml version="1.0" encoding="UTF-8"?>
<livres>
<prix id="xx11">
<auteur> Kingsley Amis</auteur>
<titre> The Old Devils</titre>
<annee>1986 </annee>
</prix>
<prix>
<auteur>Margaret Atwood</auteur>
<titre> The Blind Assassin</titre>
<annee>2000</annee>
</prix>
<prix>
<auteur>Pat Barker</auteur>
<titre>The Ghost Road</titre>
<annee>1995</annee>
</prix>
<prix id="xc15">
<auteur>Anita Brookner</auteur>
<titre> Hotel du Lac </titre>
<annee>1984</annee>
</prix>
</livres>

1. Etablir le schéma XML (XSD) de ce document XML.

2. Donnez les chemins de localisation XPATH adéquat pour :


a. Sélectionner l'auteur du livre ayant un prix et intitulé Hotel du Lac.
b. Sélectionner le titre du troisième prix dans la liste
C. Sélectionner l'année de l'obtention du deuxième prix.
d. Sélectionner les auteurs des livres qui ont obtenus des prix depuis l'année 1995.
e. Sélectionner les informations relatives aux prix ayant un id égale à xc15.

Exercice 3:
Une entreprise désire garder les informations de ses employés dans un document XML. Vous
disposez des informations suivantes :
● L'élément racine est entreprise.
● Une entreprise possède plusieurs employés.
● L'élément employé dans la liste possède deux attributs :
1 - sexe : C'est un attribut optionnel dont sa valeur peut être Homme ou Femme.
2 - identifiant : C'est un attribut obligatoire dont sa valeur doit obligatoirement commencer par la
lettre E suivie de 2 lettres suivies de 2 chiffres (exemple: Ecn12).
L'élément employé dans la liste possède également trois sous éléments comme suit:
1- nom: pour spécifier le nom de l'employé
2- prenom: pour spécifier le prénom de l'employé
3- daterecrutement: pour préciser la date de recrutement de cet employé et ayant
obligatoirement la forme aaaa-mm-jj (exemple: 2013-03-10)
tel: pour spécifier le(s) numéro(s) de téléphone de cet employé s'il y en a.
a. Ecrire un exemple de document XML répondant aux besoins de cette entreprise.
L'exemple à fournir doit obligatoirement inclure au moins 2 employés.
b. Ecrire un schema XML (XSD) qui 'valide ce document XML et qui respecte les
exigences citées précédemment.
c. Etablir également DTD de ce document XML
Probléme:
A. Enoncé : Une entreprise de gestion de projets souhaite générer des rapports basés sur ses
informations de ses projets stockées dans un document XML. Les spécifications sont les
suivantes : Cette entreprise gère plusieurs projets.
- Chaque projet est représenté par un élément projet avec un attribut obligatoire id (identifiant
du projet)
o La valeur de l'attribut id doit obligatoirement commencer par les lettres PR suivies de 4
chiffres (exemple : PR0001).
L'élément projet contient les sous éléments suivants :
o nom : pour spécifier le nom du projet
o chef de projet : Le nom du chef de projet.
o Intervenant : le non des employés participant à ce projet. Au moins deux intervenants par
projet.
o date_de_debut : La date de début du projet au format "aaaa-mm-jj".
o date_de_fin : La date de fin prévue du projet au format "aaaa-mm-jj".
o status : Le statut du projet qui prendra uniquement l'une des valeurs spécifiées dans la liste
suivante : {en cours, terminé, en attente, archivé}.
o description : Une description détaillée du projet. Certains projets peuvent ne pas avoir une
description.
B. Questions :
1. Ecrire un exemple de document XML répondant aux exigences détaillées ci-dessus.
L'exemple à fournir doit obligatoirement inclure au moins 2 projets.
2. Ecrire un schéma XML (XSD) qui valide ce document XML et qui respecte les exigences
citées précédemment.
3. Etablir également DTD de ce document XML
Correction:

Exercice 1:
1 - Un document XML bien formé désigne un document qui suit les règles de la syntaxe XML. Il
doit avoir une structure hiérarchique avec des balises ouvertes et fermées correctement, des
attributs entre guillemets, et respecter d'autres règles de base de la syntaxe XML.

2 - Un document XML valide désigne un document XML qui satisfait à un schéma ou à une
DTD (Document Type Definition), c'est-à-dire qu'il respecte la structure, les éléments, les
attributs, et les règles spécifiées par le schéma ou la DTD.

3 - Le fichier XML que vous avez fourni contient des erreurs de syntaxe. Voici les corrections
marquées en couleur :
<?xml version="1.0" encoding="UTF-8"?>
<carnet-adresse>
<entree>
<nom>DUPONT Michelle</nom>
<adresse>
<rue>6-55, rue de l'église</rue> <!-- Correction : Balise fermée
correctement -->
<code-postal>31000</code-postal>
<localite> Toulouse</localite>
<tel>0450505050</tel> <!-- Correction : Balise fermée correctement,
majuscules corrigées -->
<mail>dupmich@yahoo.fr</mail> <!-- Correction : Balise fermée correctement,
attribut 'email' corrigé -->
</adresse> <!-- Correction : Balise fermée correctement -->
</entree>
</carnet-adresse> <!-- Correction : Balise fermée correctement -->

J'ai corrigé les erreurs suivantes :

● La balise <rue> n'était pas correctement fermée.


● La balise <tel> contenait des majuscules inutiles.
● La balise <mail> devrait utiliser <mail> au lieu de <email>.
● Les balises <adresse>, <entree>, et <carnet-adresse> ont été correctement fermées.
Exercice 2:
1-

<?xml version="1.0" encoding="UTF-8"?> <xs:schema


<livres> xmlns:xs="http://www.w3.org/2001/XMLSchema">
<prix id="xx11">
<auteur> Kingsley Amis</auteur> <!-- Define a new simple type for the custom ID
<titre> The Old Devils</titre> format -->
<annee>1986</annee> <xs:simpleType name="customIDType">
</prix> <xs:restriction base="xs:string">
<prix> <xs:pattern value="[a-z]{2}[0-9]{2}"/>
<auteur>Margaret Atwood</auteur> </xs:restriction>
<titre> The Blind Assassin</titre> </xs:simpleType>
<annee>2000</annee>
</prix> <!-- Define the main element 'livres' -->
<prix> <xs:element name="livres">
<auteur>Pat Barker</auteur> <xs:complexType>
<titre>The Ghost Road</titre> <xs:sequence>
<annee>1995</annee> <!-- Define the 'prix' element with
</prix> the 'id' attribute of type 'customIDType' -->
<prix id="xc15"> <xs:element name="prix" minOccurs="0"
<auteur>Anita Brookner</auteur> maxOccurs="unbounded">
<titre> Hotel du Lac </titre> <xs:complexType>
<annee>1984</annee> <xs:sequence>
</prix> <xs:element name="auteur"
</livres> type="xs:string"/>
<xs:element name="titre"
type="xs:string"/>
<xs:element name="annee"
type="xs:integer"/>
</xs:sequence>
<xs:attribute name="id"
type="customIDType" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

2-
a. Sélectionner l'auteur du livre ayant un prix et intitulé "Hotel du Lac":

/livres/prix[titre = 'Hotel du Lac']/auteur


ou
//prix[titre = 'Hotel du Lac']/auteur

b. Sélectionner le titre du troisième prix dans la liste:


//prix[3]/titre
ou
//prix[last()-1]/titre
c. Sélectionner l'année de l'obtention du deuxième prix:
//prix[2]/annee
d. Sélectionner les auteurs des livres qui ont obtenu des prix depuis l'année 1995:
//prix[annee >= '1995']/auteur
e. Sélectionner les informations relatives aux prix ayant un ID égal à "xc15":
//prix[@id = 'xc15']

EXERCICE 3:
a. Voici un exemple de document XML répondant aux
besoins de l'entreprise avec deux employés :
<?xml version="1.0" encoding="UTF-8"?>
<entreprise>
<employe sexe="Homme" identifiant="Ecn12">
<nom>Dupont</nom>
<prenom>John</prenom>
<daterecrutement>2015-08-20</daterecrutement>
</employe>
<employe sexe="Femme" identifiant="Eab34">
<nom>Doe</nom>
<prenom>Jane</prenom>
<daterecrutement>2018-04-12</daterecrutement>
<tel>987-654-3210</tel>
</employe>
</entreprise>
b. Voici le schéma XML (XSD) qui valide ce document XML en respectant les exigences
mentionnées :
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- Define a new simple type for the custom ID format -->
<xs:simpleType name="customIDType">
<xs:restriction base="xs:string">
<xs:pattern value="E[a-z]{2}[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>

<!-- Define a new simple type for the custom date format -->
<xs:simpleType name="customDateType">
<xs:restriction base="xs:string"/>
<xs:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}"/>
</xs:simpleType>

<!-- Define a new simple type for the custom telephone format -->
<xs:simpleType name="customTelType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{3}-[0-9]{3}-[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>

<!-- Define the main element 'entreprise' -->


<xs:element name="entreprise">
<xs:complexType>
<xs:sequence>
<!-- Define the 'employe' element with the 'identifiant'
attribute of type 'customIDType',
the 'daterecrutement' element of type 'customDateType',
and the 'tel' element of type 'customTelType' -->
<xs:element name="employe" minOccurs="2" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="prenom" type="xs:string"/>
<xs:element name="daterecrutement"
type="customDateType"/>
<xs:element name="tel" type="customTelType"
minOccurs="0"/>
</xs:sequence>
<xs:attribute name="sexe" type="xs:string"/>
<xs:attribute name="identifiant" type="customIDType"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

C - DTD file:
<!DOCTYPE entreprise [
<!ELEMENT entreprise (employe+)>
<!ELEMENT employe (nom, prenom, daterecrutement, tel?)>
<!ATTLIST employe
sexe (Homme|Femme) #IMPLIED
identifiant CDATA #REQUIRED>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT daterecrutement (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
]>
Probléme 02:
<!DOCTYPE entreprise [
<!ELEMENT entreprise (projets)>
<!ELEMENT projets (projet+)>
<!ELEMENT projet (nom, chef_de_projet, intervenant+, date_de_debut,
date_de_fin, status, description?)>
<!ATTLIST projet id CDATA #REQUIRED>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT chef_de_projet (#PCDATA)>
<!ELEMENT intervenant (#PCDATA)>
<!ELEMENT date_de_debut (#PCDATA)>
<!ELEMENT date_de_fin (#PCDATA)>
<!ELEMENT status (#PCDATA)>
<!ELEMENT description (#PCDATA)>
]>

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


<projets>
<projet id="PR0001">
<nom>Projet Alpha</nom>
<chef_de_projet>Nicolas Dupont</chef_de_projet>
<intervenant>Alice Smith</intervenant>
<intervenant>John Doe</intervenant>
<date_de_debut>2023-01-15</date_de_debut>
<date_de_fin>2023-07-30</date_de_fin>
<status>en cours</status>
<description>Projet de développement logiciel</description>
</projet>
<projet id="PR0002">
<nom>Projet Beta</nom>
<chef_de_projet>Sophie Martin</chef_de_projet>
<intervenant>Emily Johnson</intervenant>
<intervenant>Michael Brown</intervenant>
<date_de_debut>2023-03-20</date_de_debut>
<date_de_fin>2023-10-10</date_de_fin>
<status>terminé</status>
</projet>
</projets>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- Define simple types -->


<xs:simpleType name="statusType">
<xs:restriction base="xs:string">
<xs:enumeration value="en cours"/>
<xs:enumeration value="terminé"/>
<xs:enumeration value="en attente"/>
<xs:enumeration value="archivé"/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="projectID">
<xs:restriction base="xs:string">
<xs:pattern value="PR[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>

<!-- Define complex types for elements -->


<xs:element name="projets">
<xs:complexType>
<xs:sequence>
<xs:element name="projet" minOccurs="2" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nom" type="xs:string"/>
<xs:element name="chef_de_projet" type="xs:string"/>
<xs:element name="intervenant" type="xs:string" minOccurs="2"
maxOccurs="unbounded"/>
<xs:element name="date_de_debut" type="xs:date"/>
<xs:element name="date_de_fin" type="xs:date"/>
<xs:element name="status" type="statusType"/>
<xs:element name="description" type="xs:string"
minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="projectID" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XQUERY:
<bib>
<book year="1994">
<title>TCP/IP Illustrated</title>
<author>
<last>Stevens</last>
<first>W.</first>
</author>
<publisher>Addison-Wesley</publisher>
<price>65.95</price>
</book>
<book year="1992">
<title>Advanced Programming in the Unix environment</title>
<author>
<last>Stevens</last>
<first>W.</first>
</author>
<publisher>Addison-Wesley</publisher>
<price>65.95</price>
</book>
<book year="2000">
<title>Data on the Web</title>
<author>
<last>Abiteboul</last>
<first>Serge</first>
</author>
<author>
<last>Buneman</last>
<first>Peter</first>
</author>
<author>
<last>Suciu</last>
<first>Dan</first>
</author>
<publisher>Morgan Kaufmann Publishers</publisher>
<price>39.95</price>
</book>
<book year="1999">
<title>The Economics of Technology and Content for Digital TV</title>
<editor>
<last>Gerbarg</last>
<first>Darcy</first>
<affiliation>CITI</affiliation>
</editor>
<publisher>Kluwer Academic Publishers</publisher>
<price>129.95</price>
</book>
</bib>

Pour chacune des requêtes XQuery suivantes, expliquez ce qu'elle fait et anticipez le
résultat de son exécution. Vérifiez à l'aide de la librairie saxon.

{ for $b in doc("biblio.xml")//book where $b/publisher = "Addison-Wesley"


and $b/@year > 1991 return {$b/title} }
Description:

<results>
{
for $b in doc("biblio.xml")//book,
$t in $b/title,
$a in $b/author
return
<result>
{$t}
{$a}
</result>
}
</results>

<results> {
let $a := doc("biblio.xml")//author
for $last in distinct-values($a/last),
$first in distinct-values($a[last=$last]/first)
order by $last, $first
return
<result><author> <last>{$last}</last>
<first>{$first}</first> </author>
{ for $b in doc("biblio.xml")/bib/book
where some $ba in $b/author
satisfies ($ba/last = $last and
$ba/first=$first)
return $b/title }
</result> }
</results>

declare function local:books-by-author ($root, $last, $first) {


for $b in $root/book
where some $ba in $b/author
satisfies ($ba/last = $last and
$ba/first=$first)
return $b/title
};
<results> {
let $a := doc("biblio.xml")//author
for $last in distinct-values($a/last),
$first in distinct-values($a[last=$last]/first)
order by $last, $first
return <result>
<author> <last>{$last}</last>
<first>{$first}</first> </author>
{local:books-by-author(doc("biblio.xml")/bib, $last, $first)}
</result>
}
</results>

{ for $b in doc("biblio.xml")//book where count($b/author) > 0 return


{$b/title} { for $a in $b/author[position() <= 2] return $a } { if
(count($b/author) > 2) then else () } }

declare function local:books-by-author ($root, $last, $first) {


for $b in $root/book
where some $ba in $b/author
satisfies ($ba/last = $last and
$ba/first=$first)
return $b/title
};

<results> {
let $a := doc("biblio.xml")//author
for $last in distinct-values($a/last),
$first in distinct-values($a[last=$last]/first)
order by $last, $first
return <result>
<author> <last>{$last}</last>
<first>{$first}</first> </author>
<number> {count(local:books-by-author(doc("biblio.xml")/bib,$last,
$first))} </number>
</result>
}
</results>

<data> {
for $year in distinct-values(doc("biblio.xml")//book/@year)
let $avg := avg(doc("biblio.xml")//book[@year=$year]/price/text())
return <year value="{$year}" avgprice="{$avg}"/>
}
</data>

Vous aimerez peut-être aussi