2016-12-08 5 views
1

Мне предоставлен XML-файл, содержащий нужные мне данные, и мне нужно его преобразовать в CSV.Гибкий XML-словарь с использованием Python3

Это должно быть просто, но количество детей для «повторяющейся единицы» XML не всегда одинаково.

То, что я пытаюсь выработать, - это то, как наилучшим образом перебирать дочерние элементы каждого дочернего элемента, пока их больше нет, и верните это как одну «линию». Конечным результатом должен быть список словарей (один список для каждой строки для CSV).

В качестве примера

  <repeatingunit> 
       <city> 
        <name>London</name> 
       </city> 
       <station> 
        <name>Southwark</name> 
        <tubeline> 
         <name>Jubilee</name> 
        </tubeline> 
      </repeatingunit> 
      <repeatingunit> 
       <city> 
        <name>London</name> 
        <county>UK</county> 
       <station> 
        <name>Mile End</name> 
       </station> 
      </repeatingunit> 

Это должно привести к:

  {'city|name':'London','station|name':'Southwark','station|tubeline|name': 'Jubilee'},{'city|name':'London','city|country':'UK','station|name':'Mile End'} 

Я использовал xml.etree.ElementTree и root.iter, я доволен зацикленной но сво динамизм.

Я попытался использовать логику для множественного вложенного списка here, но безрезультатно. Может ли кто-нибудь указать мне в правильном направлении предложить новый подход?

Я знаю, что словари различной длины в конце не идеальны для записи в csv, но я могу справиться с этим, основываясь на моем желаемом выходе.

ответ

0

Как насчет рекурсивного решения?

def build_key(elem, key, result): 
    key = key + '|' + elem.name 
    if not elem.children: 
     result[key] = elem.text 

    else: 
     for child in elem.children: 
      build_key(child, key, result) 

results = [] 
for unit in soup.find_all('repeatingunit'): 
    result = {} 
    for child in unit.children: 
     build_key(child, '', result)