2017-05-17 10 views
0

Guten Nachmittag alle.Python - XML ​​in CSV konvertieren

Ich werde diese Frage vorreden, indem ich sage, dass dies mein erster Ausflug in Python ist. Ich verwende eine API das folgende XML-Beispiel zurückzukehren:

<Times> 
    <Time> 
     <ID> 120877787 </ID> 
     <Job> 
      <ID> J000050 </ID> 
      <Name> My Job </Name> 
     </Job> 
     <Task> 
      <ID> 59469972 </ID> 
      <Name> My Task </Name> 
     </Task> 
     <Staff> 
      <ID> 74268 </ID> 
      <Name> My Name </Name> 
     </Staff> 
     <Date> 2017-05-19T00:00:00 </Date> 
     <Minutes> 480 </Minutes> 
     <Note/> 
     <Billable> true </Billable> 
    </Time> 
</Times> 

ich derzeit in dem Prozess bin 3.4 XML CSV mit Python zu konvertieren.

Ich habe ein gutes Stück Forschung (http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-xml-to-csv-using-python/ zum Beispiel) zur Lösung des Problems gemacht, aber ich kann kein passendes Ergebnis finden, hauptsächlich weil ich die Syntax nicht gut genug verstehe, um sie an meine anzupassen genaue Umstände.

Grundsätzlich suche ich nach dem folgenden Ausgang.

Job Name Task Name Staff Name Date     Minutes Billable 
My Job My Task My Name  2017-05-19T00:00:00 480  true 

Wie gewünscht ist dies, wie die XML-Daten aus der API (als String und betrachtet durch Druck (ts.content)) zurückgeführt wird, die sein kann, wo ich falsch werde.

<Times><Time><ID> 120877787 </ID><Job><ID> J000050 </ID><Name> My Job </Name></Job><Task><ID> 59469972 </ID><Name> My Task </Name></Task><Staff><ID>74268</ID><Name> My Name </Name></Staff><Date> 2017-05-19T00:00:00 </Date><Minutes> 480 </Minutes><Note/><Billable> true </Billable></Time></Times> 

Könnte jemand bitte einen Einblick in den besten Weg geben, diese Aufgabe anzugehen?

Vielen Dank für Ihre Hilfe.

Scott

+0

Nachmittag? Es ist fast Mitternacht .... –

Antwort

1

können Sie findall-Funktion verwenden.

import xml.etree.ElementTree as ET 
import csv 

tree = ET.parse("/temp/test.xml") 
root = tree.getroot() 

f = open('/temp/test.csv', 'w') 

csvwriter = csv.writer(f) 

count = 0 

head = ['Job Name','Task Name','Staff Name','Date','Minutes','Billable'] 

csvwriter.writerow(head) 

for time in root.findall('Time'): 
    row = [] 
    job_name = time.find('Job').find('Name').text 
    row.append(job_name) 
    task_name = time.find('Task').find('Name').text 
    row.append(task_name) 
    staff_name = time.find('Staff').find('Name').text 
    row.append(staff_name) 
    date = time.find('Date').text 
    row.append(date) 
    minutes = time.find('Minutes').text 
    row.append(minutes) 
    billable = time.find('Billable').text 
    row.append(billable) 
    csvwriter.writerow(row) 
f.close() 

Welche gibt:

Job Name,Task Name,Staff Name,Date,    Minutes,Billable 
My Job , My Task , My Name , 2017-05-19T00:00:00 , 480 , true 
+0

Ich verwende print (ts.content), um die Ergebnisse meiner API-Abfrage anzuzeigen. Ersetzen Sie /temp/test.xml von tree = ET.parse ("/ temp/test.xml") durch ts.content? – user2337871

+0

Ich habe versucht, mit ET.fromstring() statt, aber dies führt zu einem csv nur mit der Kopfzeile. Hast du noch andere Vorschläge? – user2337871

+0

Was ist dein api Ergebnis? Kannst du es geben? –