Python Glossary English

все Python 3xml.etree.ElementTreeпонятие

xml.etree.ElementTree.Element

дерево и элементы

Узел XML-дерева: имя tag, словарь attrib, text и tail. Ведёт себя как список детей и умеет искать find/findall/iter.

Синтаксис

elem = ET.Element(tag, attrib={}, **extra)
elem.find(path) / elem.findall(path) / elem.iter(tag=None)

find() ищет только среди прямых детей, findall('.//x') — на любой глубине, iter('x') — по всему поддереву вместе с самим элементом. XPath ограничен: есть [@attr='v'], [tag='text'], [1], [last()], '..', но нет text(), count() и сравнения > <; путь с // в начале даёт SyntaxError. Не пишите if root.find('x'): у элемента без детей истинность ложна, а с 3.12 проверка ещё и выдаёт DeprecationWarning — сравнивайте с None. remove() удаляет ребёнка вместе с его tail.

Примеры

import xml.etree.ElementTree as ET
x = '<lib><book y="2001"><t>A</t></book><shelf><book y="1999"><t>B</t></book></shelf></lib>'
r = ET.fromstring(x)
print(len(r.findall('book')), len(r.findall('.//book')))  # → 1 2
print([b.get('y') for b in r.iter('book')])  # → ['2001', '1999']
print(r.find(".//book[@y='1999']/t").text)  # → B
print(r.findtext('nope', 'нет'), r.find('nope'))  # → нет None
import xml.etree.ElementTree as ET
r = ET.fromstring('<a><b/></a>')
try:
    r.findall('//b')
except SyntaxError as e:
    print(e)  # → cannot use absolute path on element
print(r.find('b') is not None)  # → True — так, а не if r.find('b'):

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности