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