Statut de cette séance
Hors attendus stricts (arbres binaires), proposée en bonus car XML/JSON illustrent l'idée de structure arborescente générale, à arité quelconque.

1. XML : des balises pour structurer

<recette>
  <nom>Gâteau au chocolat</nom>
  <ingredients>
    <ingredient>
      <nom>Chocolat noir</nom>
      <quantite unite="grammes">200</quantite>
    </ingredient>
  </ingredients>
</recette>

Chaque balise peut contenir d'autres balises : structure arborescente à arité quelconque (contrairement aux arbres binaires stricts).

2. Exercice 1 — Documents XML bien formés ?

1. <a></a>
3. <a><b></B></a>
4. <a><b></a>
5. <a></a><a></a>
6. <a><b id="45" id="48"></b></a>
7. <a><b id="45"></b><b id="45"></b></a>
Voir la réponse
1. Bien formé. 3. Casse incorrecte (<b> / </B>). 4. <b> jamais fermée. 5. Deux racines. 6. Attribut id dupliqué. 7. Bien formé (deux balises différentes, chacune avec son propre id — piège classique).

3. JSON : léger et populaire

{
  "nom": "Gâteau au chocolat",
  "ingredients": [
    {"nom": "Chocolat noir", "quantite": {"valeur": 200, "unite": "grammes"}}
  ]
}

4. Exercice 2 — Lire un fichier JSON en Python

Charge config.json ({"mode": "bonjour", "nom": "Alice"}) et affiche le message adapté.

Voir la réponse
import json
with open("config.json", encoding="utf-8") as f:
    data = json.load(f)
mode = data.get("mode")
nom = data.get("nom")
if mode == "bonjour":
    print(f"Bonjour {nom} !")
elif mode == "bonsoir":
    print(f"Bonsoir {nom} !")
.get() renvoie None au lieu de lever une erreur si la clé est absente.

5. Exercice 3 — Compter des éléments (arité quelconque)

def creer_noeud(tag, children=None):
    return {"tag": tag, "children": children if children is not None else []}

def compte_balise(noeud, nom_balise):
    ...
Voir la réponse
def compte_balise(noeud, nom_balise):
    compteur = 1 if noeud["tag"] == nom_balise else 0
    for enfant in noeud["children"]:
        compteur += compte_balise(enfant, nom_balise)
    return compteur
Même principe que taille() (séance 1), mais boucle sur une LISTE d'enfants au lieu de deux appels gauche/droit.

Exercice défi (bonus)

Défi — Générer un document XML défi
Voir la réponse
import xml.etree.ElementTree as ET
def gen_doc(n):
    racine = ET.Element("a")
    for i in range(n):
        b = ET.SubElement(racine, "b")
        b.text = str(i)
    ET.ElementTree(racine).write(f"doc{n}.xml", encoding="utf-8", xml_declaration=True)