Entraînement et Évaluation

Mettez en pratique vos connaissances et validez votre maîtrise du cours

📑 Navigation Rapide


🎯 Scénarios Décisionnels

Testez votre compréhension avec ces mises en situation réelles. Choisissez la meilleure réponse pour chaque scénario.

Scénario 1 : Choix de Validation
Vous concevez un système de gestion d'inventaire. Les données incluent des codes produits (format XX-9999), des prix décimaux, et des emails de fournisseurs.

Quelle technologie de validation choisir ?

Scénario 2 : Cardinalité DTD
Un livre peut avoir un ou plusieurs auteurs (au moins un), un titre obligatoire, et optionnellement un avis.

Quelle déclaration DTD est correcte ?

Scénario 3 : Type d'Attribut DTD
Vous devez définir un attribut "catégorie" qui ne peut prendre que les valeurs "fiction", "science" ou "histoire", avec "fiction" par défaut.

Quelle déclaration ATTLIST est correcte ?

Scénario 4 : Selection XPath
Vous voulez sélectionner tous les livres en français (attribut lang="fr") qui ont plus d'un auteur.

Quelle expression XPath est correcte ?

Scénario 5 : XPath - Premier Element
Vous avez un document avec plusieurs <recette> dans une <collection>. Vous voulez le titre de la TOUTE PREMIERE recette du document.

Quelle expression XPath est correcte ?

Scénario 6 : XSD Restriction
Vous devez créer un type pour un code produit qui doit commencer par 2 lettres majuscules suivies de 4 chiffres (ex: AB1234).

Quelle facette XSD utiliser ?

Scénario 7 : XQuery FLWOR
Vous voulez lister les titres des livres publiés après 2000, triés par année décroissante.

Quelle expression XQuery est correcte ?

Scénario 8 : MongoDB - Filtrage
Vous cherchez les étudiants qui ont 20 ans OU qui sont inscrits en cours "SGBD".

Quelle requête MongoDB est correcte ?

Scénario 9 : MongoDB - Agregation
Vous voulez calculer la moyenne des notes par cours, en ne gardant que les cours avec une moyenne supérieure à 12.

Quel ordre de pipeline est optimal ?

Scénario 10 : DTD vs XSD
Vous devez choisir entre DTD et XSD pour un projet. Vous avez besoin de : typage fort des données, validation de namespaces, et réutilisation de types complexes.

Quelle technologie choisir ?

Scénario 11 : Contenu Mixte DTD
Vous voulez permettre un paragraphe contenant du texte libre mélangé avec des balises <gras> et <italique>.

Quelle déclaration DTD est correcte ?

Scénario 12 : XSD Cardinalite
En DTD, un élément est défini comme : auteur+ (un ou plusieurs). Comment traduire cela en XSD ?

Quels attributs utiliser ?

Scénario 13 : XPath Axe de Navigation
À partir d'un élément <ingrédient>, vous voulez sélectionner tous ses éléments frères qui le précèdent.

Quel axe XPath utiliser ?

Scénario 14 : XQuery Construction
Vous voulez créer un élément <livre> avec un attribut "titre" dynamique contenant la valeur de $b/title.

Quelle syntaxe XQuery est correcte ?

Scénario 15 : MongoDB Update
Vous voulez incrémenter l'âge de tous les étudiants de moins de 20 ans de 1 an.

Quelle requête MongoDB est correcte ?

Scénario 16 : ID et IDREF en DTD
Vous avez des réservations qui doivent référencer des usagers existants. Les usagers ont un identifiant unique.

Quelle déclaration DTD permet cette relation ?


Exercices d'Examen - Dataset Université

Ce dataset représente une université avec des étudiants, des cours et des professeurs. Utilisez-le pour pratiquer vos requêtes XPath et XQuery.

📄 Document XML : Université (cliquez pour réduire)
<?xml version="1.0" encoding="UTF-8"?>
<universite nom="HELHa" ville="Mons">

  <!-- PROFESSEURS -->
  <professeurs>
    <professeur id="P001" titre="Dr">
      <nom>Dupont</nom>
      <prenom>Marie</prenom>
      <email>marie.dupont@helha.be</email>
      <departement>Informatique</departement>
    </professeur>
    <professeur id="P002" titre="Pr">
      <nom>Martin</nom>
      <prenom>Jean</prenom>
      <email>jean.martin@helha.be</email>
      <departement>Informatique</departement>
    </professeur>
    <professeur id="P003" titre="Dr">
      <nom>Bernard</nom>
      <prenom>Sophie</prenom>
      <email>sophie.bernard@helha.be</email>
      <departement>Gestion</departement>
    </professeur>
  </professeurs>

  <!-- COURS -->
  <cours>
    <cours id="SGBD" credits="5" obligatoire="true" prof_id="P001">
      <intitule>Systèmes de Gestion de Bases de Données</intitule>
      <heures>60</heures>
      <annee>3</annee>
    </cours>
    <cours id="JAVA" credits="6" obligatoire="true" prof_id="P002">
      <intitule>Programmation Java Avancée</intitule>
      <heures>75</heures>
      <annee>2</annee>
    </cours>
    <cours id="WEB" credits="4" obligatoire="true" prof_id="P001">
      <intitule>Développement Web</intitule>
      <heures>45</heures>
      <annee>2</annee>
    </cours>
    <cours id="STAT" credits="3" obligatoire="false" prof_id="P003">
      <intitule>Statistiques Appliquées</intitule>
      <heures>30</heures>
      <annee>1</annee>
    </cours>
    <cours id="GEST" credits="4" obligatoire="false" prof_id="P003">
      <intitule>Gestion de Projet</intitule>
      <heures>40</heures>
      <annee>3</annee>
    </cours>
  </cours>

  <!-- ETUDIANTS -->
  <etudiants>
    <etudiant id="E001" sexe="F" annee="3">
      <nom>Lefebvre</nom>
      <prenom>Alice</prenom>
      <email>alice.lefebvre@student.helha.be</email>
      <dateNaissance>2002-05-15</dateNaissance>
      <inscriptions>
        <inscription cours_id="SGBD" note="16.5"/>
        <inscription cours_id="JAVA" note="14.0"/>
        <inscription cours_id="GEST" note="18.0"/>
      </inscriptions>
    </etudiant>
    <etudiant id="E002" sexe="M" annee="3">
      <nom>Dubois</nom>
      <prenom>Thomas</prenom>
      <email>thomas.dubois@student.helha.be</email>
      <dateNaissance>2001-11-22</dateNaissance>
      <inscriptions>
        <inscription cours_id="SGBD" note="12.0"/>
        <inscription cours_id="WEB" note="15.5"/>
      </inscriptions>
    </etudiant>
    <etudiant id="E003" sexe="F" annee="2">
      <nom>Moreau</nom>
      <prenom>Emma</prenom>
      <email>emma.moreau@student.helha.be</email>
      <dateNaissance>2003-03-08</dateNaissance>
      <inscriptions>
        <inscription cours_id="JAVA" note="17.5"/>
        <inscription cours_id="WEB" note="16.0"/>
        <inscription cours_id="STAT" note="13.5"/>
      </inscriptions>
    </etudiant>
    <etudiant id="E004" sexe="M" annee="1">
      <nom>Petit</nom>
      <prenom>Lucas</prenom>
      <email>lucas.petit@student.helha.be</email>
      <dateNaissance>2004-08-30</dateNaissance>
      <inscriptions>
        <inscription cours_id="STAT" note="11.0"/>
      </inscriptions>
    </etudiant>
    <etudiant id="E005" sexe="F" annee="3">
      <nom>Robert</nom>
      <prenom>Chloé</prenom>
      <email>chloe.robert@student.helha.be</email>
      <dateNaissance>2002-01-14</dateNaissance>
      <inscriptions>
        <inscription cours_id="SGBD" note="19.0"/>
        <inscription cours_id="JAVA" note="18.5"/>
        <inscription cours_id="WEB" note="17.0"/>
        <inscription cours_id="GEST" note="16.5"/>
      </inscriptions>
    </etudiant>
    <etudiant id="E006" sexe="M" annee="2">
      <nom>Richard</nom>
      <prenom>Hugo</prenom>
      <email>hugo.richard@student.helha.be</email>
      <dateNaissance>2003-06-21</dateNaissance>
      <inscriptions>
        <inscription cours_id="JAVA" note="9.5"/>
        <inscription cours_id="STAT" note="14.0"/>
      </inscriptions>
    </etudiant>
  </etudiants>

</universite>

Exercices XPath

Exercice 1 : Sélections Simples

Écrivez les expressions XPath pour :

  1. Tous les étudiants
  2. Le nom de l'université (attribut)
  3. Tous les cours obligatoires
  4. Les étudiants en 3e année
💡 Voir les solutions
<!-- 1. Tous les étudiants -->
//etudiant

<!-- 2. Le nom de l'université -->
/universite/@nom

<!-- 3. Cours obligatoires -->
//cours[@obligatoire='true']

<!-- 4. Étudiants en 3e année -->
//etudiant[@annee='3']
Exercice 2 : Fonctions et Prédicats

Écrivez les expressions XPath pour :

  1. Les étudiants avec plus de 2 inscriptions
  2. Les cours ayant plus de 50 heures
  3. Le total des crédits de tous les cours
  4. Les étudiantes (sexe="F") nées après 2002
💡 Voir les solutions
<!-- 1. Étudiants avec plus de 2 inscriptions -->
//etudiant[count(inscriptions/inscription) > 2]

<!-- 2. Cours avec plus de 50 heures -->
//cours[heures > 50]

<!-- 3. Total des crédits -->
sum(//cours/@credits)

<!-- 4. Étudiantes nées après 2002 -->
//etudiant[@sexe='F' and dateNaissance > '2002-12-31']
Exercice 3 : Jointures et Navigation

Écrivez les expressions XPath pour :

  1. Le nom du professeur qui enseigne le cours SGBD
  2. Tous les intitulés des cours suivis par Alice Lefebvre
  3. Les emails des étudiants ayant une note ≥ 15 dans n'importe quel cours
💡 Voir les solutions
<!-- 1. Professeur du cours SGBD -->
<!-- On récupère d'abord le prof_id du cours SGBD, puis on cherche le professeur -->
//professeur[@id = //cours[@id='SGBD']/@prof_id]/nom

<!-- 2. Intitulés des cours d'Alice -->
//cours[@id = //etudiant[prenom='Alice']/inscriptions/inscription/@cours_id]/intitule

<!-- 3. Emails des étudiants avec note ≥ 15 -->
//etudiant[inscriptions/inscription[@note >= 15]]/email

Exercices XQuery

Exercice 4 : FLWOR de Base

Écrivez les requêtes XQuery pour :

  1. Lister le prénom de tous les étudiants
  2. Lister les cours triés par nombre d'heures décroissant
  3. Afficher le nom et l'email de chaque professeur
💡 Voir les solutions
<!-- 1. Prénoms des étudiants -->
for $e in //etudiant
return $e/prenom

<!-- 2. Cours triés par heures -->
for $c in //cours
order by $c/heures descending
return $c/intitule

<!-- 3. Nom et email des professeurs -->
for $p in //professeur
return
  <prof>
    <nom>{data($p/nom)}</nom>
    <email>{data($p/email)}</email>
  </prof>
Exercice 5 : Filtrage et Construction

Écrivez les requêtes XQuery pour :

  1. Les étudiants ayant au moins une note ≥ 18 (avec leur nom)
  2. Les cours obligatoires avec leurs crédits et professeur
  3. Calculer la moyenne des notes de chaque étudiant
💡 Voir les solutions
<!-- 1. Étudiants avec note ≥ 18 -->
for $e in //etudiant
where $e/inscriptions/inscription[@note >= 18]
return
  <excellent>
    {$e/nom}
    {$e/prenom}
  </excellent>

<!-- 2. Cours obligatoires avec détails -->
for $c in //cours[@obligatoire='true']
let $prof := //professeur[@id = $c/@prof_id]
return
  <cours-oblig credits="{$c/@credits}">
    <intitule>{data($c/intitule)}</intitule>
    <professeur>{concat($prof/prenom, ' ', $prof/nom)}</professeur>
  </cours-oblig>

<!-- 3. Moyenne par étudiant -->
for $e in //etudiant
let $notes := $e/inscriptions/inscription/@note
return
  <etudiant nom="{$e/nom}">
    <moyenne>{avg($notes)}</moyenne>
  </etudiant>
Exercice 6 : Group By et Agrégation

Écrivez les requêtes XQuery pour :

  1. Compter le nombre d'étudiants par année
  2. Calculer la moyenne des notes par cours
  3. Lister les professeurs avec le nombre de cours qu'ils enseignent
💡 Voir les solutions
<!-- 1. Étudiants par année -->
for $e in //etudiant
let $annee := $e/@annee
group by $annee
return
  <annee niveau="{$annee}" count="{count($e)}"/>

<!-- 2. Moyenne par cours -->
for $c in //cours
let $cours_id := $c/@id
let $notes := //inscription[@cours_id = $cours_id]/@note
return
  <cours id="{$cours_id}">
    <moyenne>{round(avg($notes) * 100) div 100}</moyenne>
  </cours>

<!-- 3. Cours par professeur -->
for $p in //professeur
let $nbCours := count(//cours[@prof_id = $p/@id])
return
  <professeur nom="{concat($p/titre, ' ', $p/nom)}">
    <nombre-cours>{$nbCours}</nombre-cours>
  </professeur>
Conseils pour l'Examen

Quiz Final Récapitulatif

25 questions pour tester vos connaissances sur l'ensemble du cours

📄 XML - Fondamentaux

Q1. Quel nom d'élément XML est invalide ?

Q2. Quelle entité XML représente le caractère & ?

Q3. Combien d'éléments racine un document XML peut-il avoir ?

Q4. Quelle est la différence entre un document "bien-formé" et "valide" ?

📋 DTD - Document Type Definition

Q5. Quelle déclaration DTD indique un élément optionnel (0 ou 1) ?

Q6. Quelle déclaration DTD signifie "1 ou plusieurs" ?

Q7. En DTD, quel type d'attribut référence un ID existant ?

Q8. Pour le contenu mixte en DTD, où doit se placer #PCDATA ?

Q9. Quel mot-clé DTD indique un attribut obligatoire ?

🔷 XSD - XML Schema Definition

Q10. En XSD, quelle facette permet de définir une expression régulière ?

Q11. Comment traduire DTD "element+" en XSD ?

Q12. Quel type XSD utiliser pour valider un format ISBN (XXX-X-XXX) ?

Q13. Quelle facette limite les valeurs numériques entre 0 et 20 ?

Q14. Quel type XSD utiliser pour une date (ex: 2025-01-15) ?

🔍 XPath - Navigation XML

Q15. Quel axe XPath sélectionne les éléments frères suivants ?

Q16. Quelle est la différence entre //livre[1] et (//livre)[1] ?

Q17. Comment sélectionner les livres disponibles en XPath ?

Q18. Quelle fonction XPath compte le nombre d'éléments ?

Q19. Comment combiner deux conditions XPath sur les attributs ?

📝 XQuery - Requêtes XML

Q20. En XQuery, quelle syntaxe permet d'évaluer une expression dans un attribut ?

Q21. Quel est l'ordre correct des clauses FLWOR ?

Q22. Comment trier en ordre décroissant en XQuery ?

🍃 MongoDB - Base NoSQL

Q23. Quel opérateur MongoDB incrémente une valeur ?

Q24. Dans un pipeline MongoDB, quelle étape doit être placée en premier pour optimiser les performances ?

Q25. Comment faire un OR logique entre deux conditions en MongoDB ?


Dashboard de Revision Finale

ModuleConcepts ClesA Retenir
XMLBien-forme vs Valide, Elements/AttributsRacine unique, balises fermees
DTDELEMENT, ATTLIST, Cardinalite#PCDATA en premier pour mixte
XSDsimpleType, complexType, Facettespattern, enumeration, min/maxOccurs
XPathAxes, Predicats, Fonctions//livre[1] vs (//livre)[1]
XQueryFLWOR, Construction XML{...} pour evaluation dynamique
MongoDBCRUD, Pipeline Agregation$match en premier, $group avec $