2017-08-19 7 views
-2

je besoin d'un script python pour extraire des données à partir du fichier xmlfichier xml script python fichier csv

Je dispose d'un fichier xml comme Shoen ci-dessous:

<software> 
    <name>Update Image</name> 
    <Build>22.02</Build> 
    <description>Firmware for Delta-M Series </description> 
    <CommonImages> </CommonImages> 
<ModelBasedImages> 
    <ULT> 
     <CNTRL_0> 
      <file type="UI_APP" ver="2.35" crc="1234"/> 
      <file type="MainFW" ver="5.01" crc="5678"/> 
      <SIZE300> 
       <file type="ParamTableDB" ver="1.1.4" crc="9101"/> 
      </SIZE300> 
     </CNTRL_0> 
     <CNTRL_2> 
      <file type="UI_APP" ver="2.35" crc="1234"/> 
      <file type="MainFW" ver="5.01" crc="9158"/> 
     </CNTRL_2> 
    </ULT> 
</ModelBasedImages> 
</software> 

Je veux que les données sous forme de tableau comme:

Type

ver crc
UI_APP 2,35 1234
MainFW 5,01 5678
ParamTableDB 1.1.4 9101
UI_APP 2,35 1234
MainFW 5.01 9158

Extrait dans tout type de fichier csv/doc ....

J'ai essayé ce code:

import xml.etree.ElementTree as ET 
import csv 

tree = ET.parse("Build_40.01 (copy).xml") 
root = tree.getroot() 

# open a file for writing 

Resident_data = open('ResidentData.csv', 'w') 

# create the csv writer object 

csvwriter = csv.writer(Resident_data) 
resident_head = [] 

count = 0 
for member in root.findall('file'): 
    resident = [] 
    address_list = [] 
    if count == 0: 
     name = member.find('type').tag 
     resident_head.append(name) 
     ver = member.find('ver').tag 
     resident_head.append(ver) 
     crc = member.find('crc').tag 
     resident_head.append(crc) 

     csvwriter.writerow(resident_head) 
     count = count + 1 

    name = member.find('type').text 
    resident.append(name) 
    ver = member.find('ver').text 
    resident.append(ver) 
    crc = member.find('crc').text 
    resident.append(crc) 

    csvwriter.writerow(resident) 
Resident_data.close() 

Merci à l'avance édités: code xml actualisé.

+2

Qu'avez-vous essayé? La question est hors-sujet sauf si vous mentionnez certains de vos efforts pour résoudre le problème. –

+0

'xml.etree.ElementTree.ParseError: balise non concordante: ligne 13' pour la balise' '. Utilisez 'bs4' peut-être? –

+0

Ce n'est pas valide xml. – Goyo

Répondre

0

Utilisez la xpath expression .//file pour trouver tous <file> éléments dans le document XML, puis utilisez les attributs de chaque élément pour remplir le fichier CSV par un csv.DictWriter:

import csv 
import xml.etree.ElementTree as ET 

tree = ET.parse("Build_40.01 (copy).xml") 
root = tree.getroot() 

with open('ResidentData.csv', 'w') as f: 
    w = csv.DictWriter(f, fieldnames=('type', 'ver', 'crc')) 
    w.writerheader() 
    w.writerows(e.attrib for e in root.findall('.//file')) 

Pour votre entrée exemple le fichier CSV de sortie est ressembler à ceci:

 
type,ver,crc 
UI_APP,2.35,1234 
MainFW,5.01,5678 
ParamTableDB,1.1.4,9101 
UI_APP,2.35,1234 
MainFW,5.01,9158 

qui utilise le délimiteur par défaut (virgule) pour un fichier CSV. Vous pouvez changer le délimiteur en utilisant l'option delimiter=' ' pour DictWriter(), cependant, vous ne pourrez pas obtenir le même formatage que votre exemple de sortie, qui semble utiliser des champs de largeur fixe (mais vous pourriez vous en sortir en utilisant tab comme délimiteur).