Python: Converter XML para ficheiro CSV
tenho um ficheiro XML como este:
<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>
Estou a tentar convertê-lo para um ficheiro CSV como este.
Data,Studyval
Date,Site
Info,age
Info,gender
o meu problema é que os nomes dos pais e dos filhos são os mesmos - 'att' e'attval'. Como digo ao Python para distinguir os dois e dar-me a saída?
tentei isto:
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 imprimiu as mesmas coisas duas vezes.
5
1 answers
Não utilize a função findall
, pois irá procurar marcas att em toda a árvore. Basta iterar a árvore em ordem de cima para baixo e agarrar os elementos relevantes neles.
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))
Que dá:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
5
Author: Havok, 2015-08-06 00:30:00