Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

Парсинг xml с большой вложенностью python

есть xml типа
<Список> <Актуальный список> <Заключение> <Объект> <Объект> <Объект> <Заключение> <Объект>
Блоков "Заключение" достаточно большое количество, а подблоков "Объект" в этих блоках не фиксировано. На данный момент код парсит только первые подблоки и дальше не проваливается. Как реализовать проверку всех подблоков и возможную более глубокую вложенность? Заранее спасибо за ответ.
#!/usr/bin/env python # -*- coding: utf-8 -*- # vim:fileencoding=utf-8 import xml.etree.ElementTree as ET import csv
tree = ET.parse("data.xml") root = tree.getroot()
# открываем файл для записи
file_out = open('file_out.csv', 'w', newline='')
# создаем шапку csvwriter = csv.writer(file_out, delimiter=';') columns = ["AdditionalReason","StartDate"] csvwriter.writerow(columns) count = 0 for member in root.find('АктуальныйСписок').findall('Заключение'): mass =[] # AdditionalReason additional_reason = member.find('ВидЗаключения').find('Идентификатор').text mass.append('приостановление' if additional_reason == '1' else '') # StartDate start_date = member.find('ДатаЗаключения').text mass.append(start_date) csvwriter.writerow(mass) count += 1 file_out.close()


Ответ

Используйте функцию iter для поиска на любов уровне вложенности нужного тега.
Модифицированный файл:
<Список> <АктуальныйСписок> <Заключение> <Объект/> <Объект/> <Объект/> <Заключение> <Объект/> <Другое> <Второе> <Заключение> <Объект/> <Объект/> <Объект/>
Код:
import xml.etree.ElementTree as ET
tree = ET.parse("data.xml") root = tree.getroot()
# Поиск тегов <Заключение> на любом уровне for member in root.iter('Заключение'): print(member)
# Перебор детей <Объект> for obj in member.findall('Объект'): print(' ', obj)
print()
Консоль:


Комментариев нет:

Отправить комментарий