Hum, alors oui, le parsing de xml c'est un peu plus complexe que ce que t'as vu jusque là. Y'a plusieurs méthodes et plusieurs bibliotèques, dans USF j'utilise ElementTree, qui te renvois un objet dans lequel tu peux faire des recherches par tags, et lire les propriétés associées, il y a xpath, lxml et d'autres méthodes avec toutes leurs façons différentes de traiter le xml (et donc avantages et inconvénients).
En gros, avec ElementTree, j'utilise get_xml juste pour m'aider, l'important, c'est que je récupère un objet que j'appelle "xml", c'est dans cet objet que je fais mes recherches d'éléments, et que je construit mon niveau.
pour simplifier un peu
# récupération de l'objet de type xml
xml = return ElementTree.ElementTree(None, nom_du_fichier)
# le xml est est arbre, il a donc une racine, qui est un élément unique, avec des enfants, on récupère les attributs de la racine
attribs = xml.getroot().attrib
# le nom du niveau est l'un de ces attributs, qui sont stoqués dans un dictionnaire
self.name = attribs['name']
<?xml version="1.0" encoding="UTF-8"?>
<map
name="Big level"
background="biglevel-background.png"
foreground="biglevel-foreground.png"
middle="biglevel-middle.png"
margins="750,750,750,750"
>
ici map est le noeud racine, tous ses attributs sont entre "<map" et le premier signe ">", les enfants sont tout ce qui est entre ce ">" et le "</map>" correspondant.
name est donc ici "Big Level"
Un exemple simple pour comprendre comment je traite les enfants (😛) se trouve dans "load_entrypoints", à qui l'on passe le xml, c'est découpé dans un soucis de clareté, mais tous les "load_" pourrait bien etre remplacé par leur code, les uns à la suite des autres, c'était le cas au début, d'ailleurs.
# initialisation des entrypoints en une liste vide
self.entrypoints = []
# on demande à notre objet xml tous les enfants de type 'entry-point' et on boucle dessus.
for point in xml.findall('entry-point'):
# les enfants sont des noeuds, comme la racine, donc on demande leurs attributs de la meme façon.
coords = point.attrib['coords'].split(' ')
# on utilise les coordonées pour construire un point
self.entrypoints.append([int(coords[0]), int(coords[1])])
en gros, entre attrib, et find_all, tu fais un peu tous les traitements de base.