Страницы

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

воскресенье, 1 марта 2020 г.

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

#python #python_3x #xml #xmlparser


есть 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()

    


Ответы

Ответ 1



Используйте функцию 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() Консоль:

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

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