Terminale NSI — Arbres (hors attendus stricts)
Séance bonus — XML et JSON
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)