I want to find a way to get all the sub-elements of an element tree like the way ElementTree.getchildren()
does, since getchildren()
is deprecated since Python version 2.7.
I don't want to use it anymore, though I can still use it currently.
All sub-elements (descendants) of elem
:
all_descendants = list(elem.iter())
A more complete example:
>>> 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']
To exclude the root itself:
>>> [elem.tag for elem in a.iter() if elem is not a]
['b', 'e', 'c', 'd', 'f', 'g']
iter()
. The element behaves also like a list; so, you can also index the subelements. –
Ancier getchildren()
also returns only the immediate children. The old equivalent of the new list(elem.iter())
is the list(elem.getiterator())
. It depends what Steven really wants. –
Ancier in the pydoc it is mentioned to use list() method over the node to get child elements.
list(elem)
for child in elem
and last_child = elem[-1]
. –
Samsun If you want to get all elements 'a', you can use:
a_lst = list(elem.iter('a'))
If the elem
is also 'a', it will be included.
None of the existing answers will find all children. This solution uses BeautifulSoup instead of ETree, but will find all children, instead of just top-level:
from bs4 import BeautifulSoup
with open(filename) as f:
soup = BeautifulSoup(f, 'xml')
results = soup.find_all('element_name')
Maybe this does not correspond to OP actual question but in a greater sense I would suggest that if someone want to get all elements named with a certain name e.g. 'object' can use (an alternative approach to @Turtles Are Cute which to me at least seems more natural):
objs = tree.findall('object')
which also returns a list.
© 2022 - 2024 — McMap. All rights reserved.