在Python开发中,经常需要将内存中的字典数据结构转换为XML格式,用于接口数据传输、配置文件存储等场景。XML作为通用的数据交换格式,和字典的键值对结构有天然的对应关系,转换过程并不复杂。

基础转换思路
字典转XML的核心逻辑是将字典的键作为XML的节点名,对应的值作为节点的内容或者子节点。如果是简单的一层字典,直接遍历键值对拼接XML字符串即可实现。
手动拼接简单字典转XML
对于没有嵌套的扁平字典,我们可以通过字符串拼接的方式生成XML内容,这种方式不需要依赖额外的库,适合简单场景使用。
import xml.etree.ElementTree as ET
def dict_to_xml_simple(data_dict, root_name="root"):
# 创建根节点
root = ET.Element(root_name)
# 遍历字典键值对
for key, value in data_dict.items():
# 创建子节点
child = ET.SubElement(root, key)
# 设置节点文本内容
child.text = str(value)
# 生成XML字符串
xml_str = ET.tostring(root, encoding="utf-8").decode("utf-8")
return xml_str
# 测试扁平字典
simple_dict = {"name": "张三", "age": "25", "city": "北京"}
result = dict_to_xml_simple(simple_dict)
print(result)
处理嵌套字典的转换
实际开发中字典往往存在多层嵌套,这时候需要递归处理每一层的字典,将嵌套的字典转换为XML的子节点结构。
递归实现嵌套字典转XML
递归方法可以适配任意层级的嵌套字典,自动将每一层的键值对转换为对应的XML节点层级。
import xml.etree.ElementTree as ET
def dict_to_xml_recursive(data_dict, parent_node):
for key, value in data_dict.items():
# 如果值是字典,递归处理
if isinstance(value, dict):
child_node = ET.SubElement(parent_node, key)
dict_to_xml_recursive(value, child_node)
else:
# 普通值直接作为节点文本
child_node = ET.SubElement(parent_node, key)
child_node.text = str(value)
def generate_xml_from_dict(data_dict, root_name="root"):
root = ET.Element(root_name)
dict_to_xml_recursive(data_dict, root)
# 美化XML输出
from xml.dom import minidom
rough_string = ET.tostring(root, encoding="utf-8")
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
# 测试嵌套字典
nested_dict = {
"user": {
"basic": {
"name": "李四",
"age": "30"
},
"contact": {
"phone": "13800138000",
"email": "test@ipipp.com"
}
}
}
xml_result = generate_xml_from_dict(nested_dict)
print(xml_result)
生成XML文件
得到XML字符串之后,只需要将其写入到文件中,就可以完成XML文件的生成,注意写入时指定编码为utf-8避免中文乱码。
def save_xml_to_file(xml_content, file_path):
with open(file_path, "w", encoding="utf-8") as f:
f.write(xml_content)
print(f"XML文件已保存到{file_path}")
# 将之前的嵌套字典结果保存到文件
save_xml_to_file(xml_result, "output.xml")
特殊场景处理
转换过程中可能会遇到特殊字符、列表类型的值等场景,需要做对应的适配处理。
特殊字符转义
XML中有五个特殊字符需要转义:<、>、&、"、',如果字典的值包含这些字符,需要先进行转义再写入节点,否则生成的XML会格式错误。ElementTree库会自动处理这些转义,使用它生成XML不需要手动处理。
列表类型值的处理
如果字典的值包含列表,通常可以将列表的每个元素作为同名子节点,比如{"hobbies": ["读书", "运动"]}可以转换为多个<hobbies>节点。
import xml.etree.ElementTree as ET
def dict_to_xml_with_list(data_dict, parent_node):
for key, value in data_dict.items():
if isinstance(value, dict):
child_node = ET.SubElement(parent_node, key)
dict_to_xml_with_list(value, child_node)
elif isinstance(value, list):
# 列表每个元素生成一个同名子节点
for item in value:
child_node = ET.SubElement(parent_node, key)
child_node.text = str(item)
else:
child_node = ET.SubElement(parent_node, key)
child_node.text = str(value)
def generate_xml_with_list(data_dict, root_name="root"):
root = ET.Element(root_name)
dict_to_xml_with_list(data_dict, root)
from xml.dom import minidom
rough_string = ET.tostring(root, encoding="utf-8")
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
# 测试包含列表的字典
dict_with_list = {
"user": "王五",
"hobbies": ["跑步", "绘画", "编程"],
"address": {
"city": "上海",
"street": "南京路100号"
}
}
list_xml = generate_xml_with_list(dict_with_list)
print(list_xml)
第三方库方案
如果不想自己实现转换逻辑,也可以使用第三方库比如dicttoxml快速完成转换,只需要安装库后调用对应方法即可。
# 先安装库:pip install dicttoxml
import dicttoxml
from xml.dom.minidom import parseString
def dict_to_xml_by_lib(data_dict, root_name="root"):
xml_bytes = dicttoxml.dicttoxml(data_dict, root=False)
# 添加自定义根节点
root = f"<{root_name}>{xml_bytes.decode('utf-8')}</{root_name}>"
dom = parseString(root)
return dom.toprettyxml(indent=" ")
test_dict = {"id": 1, "name": "测试", "score": 95}
lib_result = dict_to_xml_by_lib(test_dict)
print(lib_result)
PythondictXMLxml_generation修改时间:2026-06-20 21:27:31