2016-10-11 35 views
0

私はこれのような入れ子のPython辞書を持っています。 再帰的にネストされたPython辞書を反復する

d = {} 
d[a] = b 
d[c] = {1:2, 2:3} 

は私のような d[e] = {1:{2:3}, 3:4}内部のより多くのネストされた辞書が存在することができるので、再帰的にXML形式にネストされた辞書を変換しようとしています。私の望むXML形式は次のようなものです

<root> 
    <a>b</a> 
    <c> 
    <1>2</1> 
    <2>3</3> 
    </c> 
</root> 

これまでに、lxmlライブラリを使ってネストされたxmlを処理するPythonコードがあります。しかし、それは私に望ましい出力を与えません。

def encode(node, Dict): 
    if len(Dict) == 0: 
    return node 
    for kee, val in Dict.items(): 
    subNode = etree.SubElement(node, kee) 
    del msgDict[kee] 
    if not isinstance(val, dict): 
     subNode.text = str(val) 
    else: 
     return encode(subNode, val) 

助けていただければ幸いです。ありがとうございました。

+1

あなたはこの回答をお探しですか? http://stackoverflow.com/questions/1019895/serialize-python-dictionary-to-xml – Rob

+0

そうでした。しかし、私は外部ライブラリを使用する代わりにネイティブメソッドを記述しようとしていました。それはかなり簡単なはずですが、私の再帰的思考はやや貧弱です。 – pseudo

+0

あなたは正しい考えがあります。現在の要素が再帰を行いたい別の辞書であれば、それが要素であればその値を書き出します。あなたは何を得ていますか? – Rob

答えて

0

エンコードを思い出す方法が正しくないように見えます。たぶんこれが役立ちます。簡単にするために、私はちょうどリストに物を追加します(lと呼ばれます)。代わりに、etree.SubElement(...)を実行してください。

def encode(D, l=[]): 
    for k, v in D.items(): 
     if isinstance(v, dict): 
      l2 = [k] 
      encode(v, l2) 
      l.append(l2) 
     else: 
      l.append([k, v]) 
+0

私は参照してください。それも機能します。しかし、私はキーとバリューのペアをたくさん使って作業しています。それらをリストに変換したり、前後に前後すると時間がかかります。 – pseudo

0

自分のコードにバグが見つかりました。再帰呼び出しを元のループに戻しませんでした。ネストされた要素の内部に入った後、それは "返され"、元のループに戻りません。 return encode(subNode, val)の代わりに、変数element = encode(subNode, val)を保存すると問題が解決されます。

関連する問題