-2

次の構造を持つ辞書の値から XML 文字列を作成しようとしています。ルートから文字列までのキーの数 (辞書の深さ) は不定で、範囲は 1 から ? です。

'modes': {   'P': {   'S': {  u'01': u'Some Text A.',
                              u'02': u'Some Text B.',
                              u'03': u'Some Text C.',
                              u'04': u'Some Text D.',
                              u'05': u'Some Text E.',
                              u'06': u'Some Text F.'},
                     'U': {   u'01': u'Some Text G.',
                              u'02': u'Some Text H.'}},
            'R': {   'S': {   u'01': u'Some Text I.',
                              u'02': u'Some Text J.',
                              u'03': u'Some Text K.',
                              u'04': u'Some Text M.',
                              u'05': u'LSome Text N.'},
                     'U': {   u'01': u'Some Text O.',
                              u'02': u'Some Text P.',
                              u'03': u'Some Text Q.'}}}

私が求めている出力の例は次のとおりです。

<modes>
  <property P>
    <property S>
      <text>
        <order>'01'</order>
        <string>'Some Text A.'</string>
      </text>
      <text>
        <order>'02'</order>
        <string>'Some Text B.'</string>
      </text>
      ...
    </property S>

    <property U>
      <text>
        <order>'01'</order>
        <string>'Some Text G.'</string>
      </text>
      <text>
        <order>'02'</order>
        <string>'Some Text H.'</string>
      </text>    
    </property U>
  </property P>

  <property R>
      <property S>
      <text>
        <order>'01'</order>
        <string>'Some Text I.'</string>
      </text>
      <text>
        <order>'02'</order>
        <string>'Some Text J.'</string>
      </text>
      ...
    </property S>

    <property U>
      <text>
        <order>'01'</order>
        <string>'Some Text O.'</string>
      </text>
      <text>
        <order>'02'</order>
        <string>'Some Text P.'</string>
      </text>    
      ...
    </property U>
  </property R>
</modes>

XML としての正確な出力よりも、子を適切な親に配置できるように構造を反復する方法に関心があります。データの構造を変更することについてのアドバイスもいただければ幸いです。ありがとうジュリアン

4

2 に答える 2

1

私が見つけた方法は、辞書[キー]がdictでない場合はキー、値を出力し、そうでない場合は再帰呼び出しを出力する再帰関数を使用することでした

def _dict_to_xml(dictionary):
    returnlist = []
    for key in dictionary:
        if isinstance(dictionary[key],dict):
            returnlist.append(r'<node name="{name}">'.format(name=key))
            returnlist.append(_dict_to_xml(dictionary[key]))
            returnlist.append(r'</node>')
        else:
            returnlist.append(r'<order>{key}</order>'.format(key=key))
            returnlist.append(r'<string>{value}</string>'.format(value = dictionary[key]))
    return '\n'.join(returnlist)


def dict_to_xml(dictionary):
    return '<?xml version="1.0"?>\n'+_dict_to_xml(dictionary)+'</xml>'
于 2012-07-31T04:33:45.020 に答える
1

現在の構造と子を追加するノードを受け取る関数を作成します。構造内で再帰が発生した場合は、新しいノードとサブ構造を使用して関数を再帰します。

于 2012-07-31T04:16:51.580 に答える