2015-08-05 16 views
5

Ho un file XML in questo modo:Python: Conversione XML in file CSV

<hierachy> 
    <att> 
     <Order>1</Order> 
     <attval>Data</attval> 
     <children> 
      <att> 
       <Order>1</Order> 
       <attval>Studyval</attval> 
      </att> 
      <att> 
       <Order>2</Order> 
       <attval>Site</attval> 
      </att> 
     </children> 
    </att> 
    <att> 
     <Order>2</Order> 
     <attval>Info</attval> 
     <children> 
      <att> 
       <Order>1</Order> 
       <attval>age</attval> 
      </att> 
      <att> 
       <Order>2</Order> 
       <attval>gender</attval> 
      </att> 
     </children> 
    </att> 
</hierachy> 

Sto cercando di convertirlo in un file CSV come questo:

Data,Studyval 
Date,Site 
Info,age 
Info,gender 

Il mio problema è, entrambi i nomi padre e figlio sono uguali: "att" e "attval". Come faccio a dire a Python di distinguere tra i due e di darmi l'output?

ho provato questo:

import xml.etree.cElementTree as ET 

tree = ET.parse('input.xml') 
rebase = tree.getroot() 

list = [] 

for att in rebase.findall('att'): 
     name = att.find('attval').text 
     for each_att in att.findall('attval'): 
      try: 
       val = att.find('attval').text 
       print name, val 
      except AttributeError: 
       print name 

e stampate le stesse cose due volte.

risposta

5

Non utilizzare la funzione findall, poiché cercherà i tag att nell'intero albero. Basta iterare l'albero in ordine dall'alto al basso e afferrare gli elementi pertinenti in essi.

from xml.etree import ElementTree 
tree = ElementTree.parse('input.xml') 
root = tree.getroot() 

for att in root: 
    first = att.find('attval').text 
    for subatt in att.find('children'): 
     second = subatt.find('attval').text 
     print('{},{}'.format(first, second)) 

che dà:

$ python process.py 
Data,Studyval 
Data,Site 
Info,age 
Info,gender 
+0

che è perfetto! Grazie mille! – pam