web-dev-qa-db-fra.com

Python: convertir XML en fichier CSV

J'ai un fichier XML comme celui-ci:

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

J'essaie de le convertir en un fichier CSV comme celui-ci:

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

Mon problème est que les noms des parents et des enfants sont les mêmes - "att" et "attval". Comment puis-je dire Python pour distinguer les deux et me donner la sortie?

J'ai essayé ceci:

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

et il a imprimé les mêmes choses deux fois.

7
pam

N'utilisez pas la fonction findall, car elle recherchera les balises att dans l'arborescence entière. Il suffit d'itérer l'arbre de haut en bas et de saisir les éléments pertinents en eux.

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

Qui donne:

$ python process.py 
Data,Studyval
Data,Site
Info,age
Info,gender
8
Havok