Je souhaite trouver un moyen d’obtenir tous les sous-éléments d’une arborescence d’éléments comme le fait ElementTree.getchildren()
, puisque getchildren()
est obsolète depuis Python version 2.7, je ne veux plus l’utiliser, même si je peux toujours l’utiliser actuellement.
Merci.
Tous les sous-éléments (descendants) de elem
:
all_descendants = list(elem.iter())
Un exemple plus complet:
>>> import xml.etree.ElementTree as ET
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(a, 'd')
>>> e = ET.SubElement(b, 'e')
>>> f = ET.SubElement(d, 'f')
>>> g = ET.SubElement(d, 'g')
>>> [elem.tag for elem in a.iter()]
['a', 'b', 'e', 'c', 'd', 'f', 'g']
Pour exclure la racine elle-même:
>>> [elem.tag for elem in a.iter() if elem is not a]
['b', 'e', 'c', 'd', 'f', 'g']
Si vous voulez obtenir tous les éléments 'a', vous pouvez utiliser:
a_lst = list(elem.iter('a'))
Si la elem
est aussi 'a', elle sera incluse.
Aucune des réponses existantes ne trouvera tous les enfants. Cette solution utilise BeautifulSoup au lieu de ETree, mais trouvera tous les enfants au lieu du niveau supérieur uniquement:
from bs4 import BeautifulSoup
with open(filename) as f:
soup = BeautifulSoup(f, 'xml')
results = soup.find_all('element_name')
Peut-être que cela ne correspond pas à la question réelle de l'OP, mais dans un sens plus large, je suggérerais que, si quelqu'un souhaite que tous les éléments soient nommés, par exemple, 'objet' peut utiliser (une approche alternative à @Turtles Are Cute qui me semble au moins plus naturelle):
objs = tree.findall('object')
qui renvoie également une liste.