2017-04-19 13 views
2

私はPythonを使用してCSVに変換したいXMLファイルを持っています。 TestitemnameタグのコンテンツはCSVというヘッダーと内容がTestvalueタグのCSVの値として必要です。誰かがこれで私を助けることができますか?Pythonを使用したXMLからCSVへ

サンプルXMLファイル(入力)

<sample:batch xmlns:sample="http://sample.com/schema/sampleimport"> 
    <sample:TestData> 
     <sample:Testitem> 
      <sample:TestitemName>Field1</sample:TestitemName> 
      <sample:Testvalue>1</sample:Testvalue> 
     </sample:Testitem> 
     <sample:Testitem> 
      <sample:TestitemName>Field2</sample:TestitemName> 
      <sample:Testvalue>Hi</sample:Testvalue> 
     </sample:Testitem> 
     <sample:Testitem> 
      <sample:TestitemName>Field3</sample:TestitemName> 
      <sample:Testvalue>1234</sample:Testvalue> 
     </sample:TestData> 
     <sample:TestData> 
     <sample:Testitem> 
      <sample:TestitemName>Field1</sample:TestitemName> 
      <sample:Testvalue>3</sample:Testvalue> 
     </sample:Testitem> 
     <sample:Testitem> 
      <sample:TestitemName>Field2</sample:TestitemName> 
      <sample:Testvalue>Hello</sample:Testvalue> 
     </sample:Testitem> 
     <sample:Testitem> 
      <sample:TestitemName>Field3</sample:TestitemName> 
      <sample:Testvalue>999</sample:Testvalue> 
     </sample:TestData> 

所望のCSVファイル(出力)

Field1,Field2,Filed3 (Header field names) 
1,Hi,1234 (1st record) 
3,Hello,999 (2nd record) 
+0

これまでに何を試みましたか? – sgrg

答えて

1

BeautifulSoupは、XMLデータを解析するために使用することができます。整理されたデータを使用すると、ネストされたタグタイプをループして、データを収集するだけで済みます。

コード:

from BeautifulSoup import BeautifulSoup as Soup 

def parse_xml(file_like): 
    data = [] 
    names = [] 
    soup = Soup(file_like) 
    for batch in soup.findAll('sample:batch'): 
     for test_data in batch.findAll('sample:testdata'): 
      item = {} 
      for test_item in test_data.findAll('sample:testitem'): 
       name = test_item.find('sample:testitemname').text 
       value = test_item.find('sample:testvalue').text 
       item[name] = value 
       if name not in names: 
        names.append(name) 
      data.append(item) 

    return [names] + [[datum.get(name) for name in names] for datum in data] 

テストコード:

data = parse_xml(xml_data) 
for datum in data: 
    print(','.join(datum)) 

試験データ:

from io import StringIO 
xml_data = StringIO(u""" 
    <sample:batch xmlns:sample="http://sample.com/schema/sampleimport"> 
     <sample:TestData> 
      <sample:Testitem> 
       <sample:TestitemName>Field1</sample:TestitemName> 
       <sample:Testvalue>1</sample:Testvalue> 
      </sample:Testitem> 
      <sample:Testitem> 
       <sample:TestitemName>Field2</sample:TestitemName> 
       <sample:Testvalue>Hi</sample:Testvalue> 
      </sample:Testitem> 
      <sample:Testitem> 
       <sample:TestitemName>Field3</sample:TestitemName> 
       <sample:Testvalue>1234</sample:Testvalue> 
     </sample:TestData> 
     <sample:TestData> 
      <sample:Testitem> 
       <sample:TestitemName>Field1</sample:TestitemName> 
       <sample:Testvalue>3</sample:Testvalue> 
      </sample:Testitem> 
      <sample:Testitem> 
       <sample:TestitemName>Field2</sample:TestitemName> 
       <sample:Testvalue>Hello</sample:Testvalue> 
      </sample:Testitem> 
      <sample:Testitem> 
       <sample:TestitemName>Field3</sample:TestitemName> 
       <sample:Testvalue>999</sample:Testvalue> 
      </sample:TestItem> 
     </sample:TestData> 
    </sample:batch> 
""") 

結果:

Field1,Field2,Field3 
1,Hi,1234 
3,Hello,999 
+0

スティーブン、ありがとう!私は出力をCSVファイルに書きたいと思います。もう一度手伝ってもらえますか? – Santhosh

+0

私が示した出力はCSVです...スクリーンに印刷するのではなくファイルに書き込むだけです –

関連する問題