2012-04-11 18 views
1

XML文書をPythonデータ構造に変換しようとしています。Python:辞書のキーが上書きされないようにする

XMLのサンプル:

<SOFTWARES> 
     <PUBLISHER>Microsoft Corporation</PUBLISHER> 
     <NAME>Microsoft Office Visio 2010</NAME> 
     <VERSION>14.0.6029.1000</VERSION> 
     <FOLDER>C:/Program Files/Microsoft Office/</FOLDER> 
     <LANGUAGE>Language Neutral</LANGUAGE> 
     <INSTALLDATE>2012/03/29</INSTALLDATE> 
    </SOFTWARES> 
    <SOFTWARES> 
     <PUBLISHER>Microsoft</PUBLISHER> 
     <NAME>Update for Microsoft Office 2010 (KB2553310) 64-Bit Edition</NAME> 
     <INSTALLDATE>0000//0/0/00</INSTALLDATE> 
    </SOFTWARES> 

lxml.de本の優れた例がありますhttp://lxml.de/FAQ.html#how-can-i-map-an-xml-tree-into-a-dict-of-dicts

def xml_to_dict(element): 
    return element.tag, dict(map(xml_to_dict, element)) or element.text 

これは素晴らしい有するdictsの辞書が、1つの欠陥を生じさせます。既存のキーを上書きします。プロセスが完了すると、だから私は得る:関係なく、その前にいたどのように多くの、最後のソフトブロックをある

'SOFTWARES': { 
    'PUBLISHER': 'Microsoft', 
    'NAME': 'Update for Microsoft Office 2010 (KB2553310) 64-Bit Edition', 
    'INSTALLDATE': '0000//0/0/00', 
}, 

を。 lxmlの関数は再帰的なのでうまくいきますが、重複するキーを扱うことができるものを書いています。好ましくは、SOFTWARESのdictsをリストに投げ込むだけで、時間が来たらリストを反復することができます。この特定のケースのための

答えて

1

最も簡単な解決策:

map(xml_to_dict, xml_document) 

これは、あなたの辞書のリストが表示されます。

+0

可能であれば、私はdictsを保持したいと思います。重複したキーを持つ辞書をリストに追加するだけです。 –

+1

@PhilipCammarata:これはあなたに非常に奇妙なフォーマットを与えるでしょう。値がリストであるかどうかは決して分かりません。したがって、すべてのコードで特別なケースが必要になります。常にリストを使用するか、決して使用しないでください。 –

+1

サンプル入力は、繰り返しキーが含まれていないSOFTWARESブロックのリストのように見えます。このための自然なデータモデルは、dicts(SOFTWAREブロックごとに1つのdict)のリストです。これはまさに@ Svenのコードがすることです。 – alexis

関連する問題