2017-05-17 19 views
0

良い午後。Python - XMLからCSVへの変換

私は、これは、Pythonへの私の最初の進出であると言って、この質問を序文ます。

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

私は、Python 3.4を使用してCSVにXMLを変換するプロセスで、現在午前:私は、次のXMLサンプルを返すためにAPIを使用しています。

私はこの問題を解決するためにかなりの研究(例えばhttp://blog.appliedinformaticsinc.com/how-to-parse-and-convert-xml-to-csv-using-python/)を行っていますが、私は適切な結果を出すことができません。正確な状況。

基本的に私は次のような出力を探しています。

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

たように、これはXMLが(文字列として、プリント(ts.content)で見て)APIから返された私が間違っつもりどこであってもよい方法です要求されました。

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

誰かがこのタスクにアプローチする最良の方法についていくつかの洞察を提供してくれるでしょうか?

ありがとうございました。

スコット

+0

午後?それはほぼ真夜中です.... –

答えて

1

あなたはfindall機能を使用することができます。

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

います:

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

私のAPIクエリの結果を表示するには、print(ts.content)を使用しています。 tree = ET.parse( "/ temp/test.xml")の/temp/test.xmlをts.contentに置き換えますか? – user2337871

+0

代わりにET.fromstring()を使用しようとしましたが、結果としてヘッダー行のみのcsvが生成されます。他に提案はありますか? – user2337871

+0

あなたのAPIの結果は何ですか?あなたはそれを与えることができますか? –