2016-12-08 13 views
1

私は必要なデータを含むXMLファイルが提供されています。私はそれをCSVに変換する必要があります。Python3を使用する柔軟なXML to

これは簡単ですが、XMLの「繰り返し単位」の子の数は必ずしも同じではありません。

私が解決しようとしているのは、もはや存在しなくなるまで、各子要素の子要素を反復し、これを1つの "行"として返す方法です。最終出力は、辞書のリスト(CSVの "行"ごとに1つのリスト)でなければなりません。これが生じるはずである例として

  <repeatingunit> 
       <city> 
        <name>London</name> 
       </city> 
       <station> 
        <name>Southwark</name> 
        <tubeline> 
         <name>Jubilee</name> 
        </tubeline> 
      </repeatingunit> 
      <repeatingunit> 
       <city> 
        <name>London</name> 
        <county>UK</county> 
       <station> 
        <name>Mile End</name> 
       </station> 
      </repeatingunit> 

:私はxml.etree.ElementTreeとroot.iterを使用していた

  {'city|name':'London','station|name':'Southwark','station|tubeline|name': 'Jubilee'},{'city|name':'London','city|country':'UK','station|name':'Mile End'} 

、私はループとうれしいですが、そのダイナミズム。

複数のネストされたリストhereのロジックを使用しようとしましたが、役に立たなくなりました。誰かが正しい方向に私を向けることができる新しいアプローチを提案する?

最後に長さが異なる辞書はcsvに書き出すのには理想的ではないが、私が望む出力に基づいて処理できることを知っている。

答えて

0

再帰的ソリューションはどうですか?

def build_key(elem, key, result): 
    key = key + '|' + elem.name 
    if not elem.children: 
     result[key] = elem.text 

    else: 
     for child in elem.children: 
      build_key(child, key, result) 

results = [] 
for unit in soup.find_all('repeatingunit'): 
    result = {} 
    for child in unit.children: 
     build_key(child, '', result) 
関連する問題