Python 3.4+xml.etree.ElementTreeпонятие
xml.etree.ElementTree.XMLPullParser
потоковый разбор
Неблокирующий парсер: данные подаются кусками через feed(), а готовые события забираются read_events() — для сети и асинхронного кода.
Синтаксис
parser = ET.XMLPullParser(events=None)
parser.feed(data)
for event, elem in parser.read_events(): ...
В отличие от iterparse, он сам ничего не читает: вы решаете, откуда и когда брать данные. read_events() отдаёт только новые события, повторно уже прочитанные не приходят. close() всегда возвращает None, а не корень, как XMLParser.close(), — корень берите из события 'end' верхнего элемента. Новые версии expat могут придерживать незаконченный токен до следующего feed(); с 3.13 есть flush().
Примеры
import xml.etree.ElementTree as ET
p = ET.XMLPullParser(events=('end',))
for chunk in ['<log><e>a</e>', '<e>b</e>', '</log>']:
p.feed(chunk)
print([el.text for ev, el in p.read_events() if el.tag == 'e'])
# → ['a'] / ['b'] / []
print(p.close()) # → None
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности