есть 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()
Консоль:
Комментариев нет:
Отправить комментарий