将字典转换为XML

时间:2012-07-31 04:12:20

标签: python dictionary

我正在尝试使用以下结构从字典中的值创建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。任何关于改变数据结构的建议也会受到赞赏,因为我觉得自己已经把自己画成了一个角落! 谢谢朱利安

2 个答案:

答案 0 :(得分:1)

编写一个将采用当前结构的函数以及一个添加子节点的节点。当您在结构中遇到递归时,使用新节点和子结构递归函数。

答案 1 :(得分:1)

我找到的方法是使用递归函数,如果dictionary [key]不是dict,则打印key,value,否则打印递归调用

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>'