Мне кажется, что вам не нужны какие-либо возможности DOM из вашей программы. Я бы поддержал использование библиотеки (c) ElementTree. Если вы используете функцию iterparse модуля cElementTree, вы можете пробираться через xml и обрабатывать события по мере их возникновения.
Обратите внимание, однако, совет Fredriks по использованию cElementTree iterparse function :
для анализа больших файлов вы можете избавиться от элементов, как только вы их обработали:
for event, elem in iterparse(source):
if elem.tag == "record":
... process record elements ...
elem.clear()
Приведенный выше шаблон имеет один недостаток; он не очищает корневой элемент, поэтому вы получите один элемент с множеством пустых дочерних элементов. Если ваши файлы огромные, а не просто большие, это может быть проблемой. Чтобы обойти это, вам нужно заполучить корневой элемент. Самый простой способ сделать это - включить стартовые события и сохранить ссылку на первый элемент в переменной:
# get an iterable
context = iterparse(source, events=("start", "end"))
# turn it into an iterator
context = iter(context)
# get the root element
event, root = context.next()
for event, elem in context:
if event == "end" and elem.tag == "record":
... process record elements ...
root.clear()
lxml.iterparse () не позволяет этого.
Предыдущий не работает на Python 3.7, рассмотрите следующий способ получить первый элемент.
# get an iterable
context = iterparse(source, events=("start", "end"))
is_first = True
for event, elem in context:
# get the root element
if is_first:
root = elm
is_first = False
if event == "end" and elem.tag == "record":
... process record elements ...
root.clear()