2016-12-08 4 views
1

Je reçois un fichier XML contenant les données dont j'ai besoin et j'ai besoin de le convertir en CSV. Cela devrait être simple, mais le nombre d'enfants pour l '"unité récurrente" du XML n'est pas toujours le même. Ce que j'essaie de comprendre, c'est de réitérer au mieux l'enfant de chaque élément enfant, jusqu'à ce qu'il n'y en ait plus, et de le renvoyer comme une «ligne». La sortie finale devrait être une liste de dictionnaires (une liste par "rangée" pour le CSV).Flexible XML vers le dictionnaire en utilisant Python3

À titre d'exemple

  <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> 

Cela devrait se traduire par:

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

J'utilisais xml.etree.ElementTree et root.iter, je suis content de la boucle mais son la dynamisme.

J'ai essayé d'utiliser la logique pour plusieurs listes imbriquées here mais en vain. Quelqu'un peut-il me diriger dans la bonne direction suggérer une nouvelle approche? Je suis conscient que les dictionnaires étant de longueur différente à la fin n'est pas idéal pour l'écriture sur csv mais je peux gérer cela en fonction de ma sortie désirée.

Répondre

0

Que diriez-vous d'une solution récursive?

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)