2015-08-05 34 views
5

Böyle bir XML dosyası vardır:Python: CSV, XML dosyası dönüştürme

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

bunu dönüştürmek için çalışıyorum bir CSV böyle dosyası:

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

Benim sorundur, Ebeveyn ve çocuk isimleri aynıdır - 'att' ve 'attval'. Python'a ikisi arasında ayrım yapmasını ve çıktıyı vermesini nasıl söyleyebilirim?

bu çalıştı:

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 

ve iki kez aynı şeyleri baskılı. bu bütün ağacın att etiketleri arayacaktır olarak

cevap

5

, findall fonksiyonunu kullanmayın. Sadece yukarıdan aşağıya doğru sırayla ağacı yineleme ve onları alakalı unsurları yakala. verir

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

:

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

mükemmel ki! Teşekkürler bir ton! – pam