2017-08-02 6 views
1

私はPythonにとって非常に新しいので、私は多くを検索しましたが、解決策を見つけることができませんでした。次のXMLファイルをCSVファイルに解析します。ネストされたxml(チャイルドの同じ名前)をCSVに解析するにはどうすればよいですか?

import xml.etree.ElementTree as ET 
import csv 
tree = ET.parse("my_xml_file.xml") 
root = tree.getroot() 
f = open('my_csv_file.csv', 'w') 
csvwriter = csv.writer(f) 

head = ['ID','avgSped','completed'] 
csvwriter.writerow(head) 

for Item in root.findall('item'): 

    for Sensorevents in Item.findall('sensorEvents'): 


     row = [] 
     id_ = Item.find('id').text 
     row.append(id_) 

     avgSped_ = Sensorevents.find('sensorEvents').find('avgSped').text 
     row.append(avgSped_) 

     completed_ = Sensorevents.find('sensorEvents').find('completed').text 
     row.append(completed_) 

     csvwriter.writerow(row) 


f.close() 

、結果はこれです::

<List> 
    <item> 
    <id>5939c5e20d82880efce93933</id> 
    <sensorEvents> 
     <sensorEvents> 
      <avgSped>48.55647532226298</avgSped> 
      <completed>true</completed> 
     </sensorEvents> 
     <sensorEvents> 
      <avgSped>39.53368357145088</avgSped> 
      <completed>true</completed> 
     </sensorEvents> 
     <sensorEvents> 
      <avgSped>41.41160105233052</avgSped> 
      <completed>true</completed> 
     </sensorEvents> 
    </sensorEvents> 
    </item> 

    . 
    . 
    . 
    . 

</List> 

私が書いたコードはこれです

enter image description here

は3 sensorEventsありますが、私のコードは、ちょうど最初のものをキャプチャします。すべてのsensorEventを読み取るようにコードを変更するにはどうすればよいですか? 本当にありがとうございます。

答えて

2

あなたは<sensorEvents>で3 <sensorEvents>、最初<sensorEvents>影子供<sensorEvents>を含む<sensorEvents>タグを持っているので。

これは次に

avgSped_ = Sensorevents.find('sensorEvents').find('avgSped').text 
    row.append(avgSped_) 

    completed_ = Sensorevents.find('sensorEvents').find('completed').text 

のみ最初のタグにデータを取得し、一度だけ

<sensorEvents> 
    <sensorEvents> 
     <avgSped>48.55647532226298</avgSped> 
     <completed>true</completed> 
    </sensorEvents> 
    <sensorEvents> 
     <avgSped>39.53368357145088</avgSped> 
     <completed>true</completed> 
    </sensorEvents> 
    <sensorEvents> 
     <avgSped>41.41160105233052</avgSped> 
     <completed>true</completed> 
    </sensorEvents> 
</sensorEvents> 

あたり

for Sensorevents in Item.findall('sensorEvents'): 

ウィルループを意味しています。

あなたはそれをあなたが、多くの場合、単純にコードのために作るXPath式で検索することができますので、あなたはまた、lxmlのライブラリを使用して検討することもでき

for Item in root.findall('item'): 
    for root_Sensorevents in Item.findall('sensorEvents'): 
     for Sensorevents in root_Sensorevents.findall('sensorEvents'): 
... 
+0

私にとってはうまくいった。ありがとう。 – Saeed

0

を試してみてください。ここで

、XPath式は.//sensorEvents/sensorEventsどこでも文書でsensorEvents要素を探し、その後すぐこれらの下sensorEventsの要素を探し言います。

これを取得したら、示されているように要素の属性の式を書くのは簡単なことです。

>>> from lxml import etree 
>>> tree = etree.parse('temp2.xml') 
>>> inner_sensorEvents = tree.xpath('.//sensorEvents/sensorEvents') 
>>> for inner_sensorEvent in inner_sensorEvents: 
...  inner_sensorEvent.find('avgSped').text, inner_sensorEvent.find('completed').text 
... 
('48.55647532226298', 'true') 
('39.53368357145088', 'true') 
('41.41160105233052', 'true') 
関連する問題