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をリストに投げ込むだけで、時間が来たらリストを反復することができます。この特定のケースのための
可能であれば、私はdictsを保持したいと思います。重複したキーを持つ辞書をリストに追加するだけです。 –
@PhilipCammarata:これはあなたに非常に奇妙なフォーマットを与えるでしょう。値がリストであるかどうかは決して分かりません。したがって、すべてのコードで特別なケースが必要になります。常にリストを使用するか、決して使用しないでください。 –
サンプル入力は、繰り返しキーが含まれていないSOFTWARESブロックのリストのように見えます。このための自然なデータモデルは、dicts(SOFTWAREブロックごとに1つのdict)のリストです。これはまさに@ Svenのコードがすることです。 – alexis