使用dict2xml转换嵌套字典为XML时键顺序异常如何解决?
问题原因
dict2xml库内部实现时默认对所有字典键执行字母升序排序,该逻辑没有对外暴露配置开关,即使传入collections.OrderedDict类型的数据也会被强制重新排序,因此会出现你观察到的键顺序异常问题。
方案1:修改dict2xml源码关闭排序
找到本地安装的dict2xml库源码文件(通常位于Python第三方包目录下的dict2xml/dict2xml.py),搜索遍历字典键的代码段,原代码一般类似:
for key in sorted(data.keys()): # 后续节点生成逻辑
将外层的sorted()去掉,修改为:
for key in data.keys():
修改后传入OrderedDict类型的数据即可保留你定义的键顺序。
方案2:使用Python标准库
xml.etree.ElementTree实现(无需第三方依赖) 自己实现递归转换逻辑,完全自主控制顺序,示例代码如下:
from collections import OrderedDict import xml.etree.ElementTree as ET from xml.dom import minidom def dict_to_xml(root_tag, data): root = ET.Element(root_tag) def build_node(parent, content): if isinstance(content, dict): for k, v in content.items(): child = ET.SubElement(parent, k) build_node(child, v) elif isinstance(content, list): for item in content: build_node(parent, item) else: parent.text = str(content) build_node(root, data) # 格式化输出 rough_string = ET.tostring(root, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ") # 测试用OrderedDict数据 data = OrderedDict([ ('a', 1), ('b', [2, 3]), ('c', OrderedDict([ ('z', [{'p':9}, {'o':10}]), ('e',7) ])) ]) print(dict_to_xml('all', data))
运行后会严格按照你定义的键顺序生成XML。
方案3:使用xmltodict第三方库
xmltodict库默认支持保留OrderedDict的顺序,使用方式如下:
- 安装命令:
pip install xmltodict - 示例代码:
from collections import OrderedDict import xmltodict data = OrderedDict([ ('a', 1), ('b', [2, 3]), ('c', OrderedDict([ ('z', [{'p':9}, {'o':10}]), ('e',7) ])) ]) xml_output = xmltodict.unparse({'all': data}, pretty=True, indent=" ") print(xml_output)
内容的提问来源于stack exchange,提问作者peter_parker
相关产品推荐
相关产品推荐

