Python字典转XML可用标准库xml.etree.ElementTree手动构建(灵活可控,支持嵌套、属性、命名空间)或第三方库dicttoxml(快捷简单,适合原型开发),需注意标签合法性、空值处理、中文编码及格式化。

Python本身没有内置的字典转XML功能,但可以用标准库 xml.etree.ElementTree 手动构建XML,或借助第三方库如 dicttoxml 快速实现。关键看你的需求:是否需要控制标签名、属性、嵌套结构、特殊字符处理,以及是否要兼容中文、空值、列表等。
用 xml.etree.ElementTree 手动构建(推荐,灵活可控)
适合对XML结构有明确要求的场景,比如接口数据格式固定、需加命名空间或属性。
- 从空根节点开始,递归遍历字典,用
subelement()添加子节点 - 字典的 key 变成标签名,value 变成文本内容;如果是嵌套字典,就递归创建子树
- 列表类型需单独处理——每个元素生成同名子节点(避免XML重复标签报错)
- 注意转义:ElementTree 会自动处理
<、&等,但 None 或 bytes 需提前转换为字符串
示例片段:
import xml.etree.ElementTree as ET
<p>def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
if isinstance(val, dict):
child = dict_to_xml(key, val)
elem.append(child)
elif isinstance(val, list):
for item in val:
child = dict_to_xml(key, item)
elem.append(child)
else:
child = ET.SubElement(elem, key)
child.text = str(val) if val is not None else ""
return elem</p><h1>使用</h1><p>data = {"person": {"name": "张三", "age": 30, "hobbies": ["读书", "游泳"]}}
root = dict_to_xml("root", data)
print(ET.tostring(root, encoding="unicode", method="xml"))</p>用 dicttoxml 库一键转换(简单快捷)
适合快速原型、调试或结构较扁平的字典。安装:pip install dicttoxml
立即学习“Python免费学习笔记(深入)”;
- 默认把字典键作为标签,值作为文本;列表自动转为多个同名节点
- 支持自定义根节点名、忽略空值、添加属性(如
attr_prefix)、编码设置 - 中文正常显示,但需指定
encoding="utf-8"再写入文件,否则可能乱码 - 不支持复杂逻辑(如条件节点、命名空间),也不保留原始数据类型(全转字符串)
示例:
from dicttoxml import dicttoxml
from xml.dom.minidom import parseString
<p>data = {"user": {"id": 1001, "status": "active", "tags": ["python", "xml"]}}
xml_bytes = dicttoxml(data, custom_root="response", attr_type=False)
dom = parseString(xml_bytes)
print(dom.toprettyxml(indent=" "))</p>注意事项和常见坑
不管用哪种方式,这几个点容易出错:
- XML标签名不能含空格、冒号(除非是命名空间)、点号或数字开头——字典key不合法时得预处理(如转下划线)
- 根节点必须唯一;若字典顶层是列表,需手动包一层(如
{"items": your_list}) - None 值默认变空字符串,但某些系统要求省略字段,这时要在递归前过滤掉 None
- 如果输出要给其他系统用,建议用
minidom.toprettyxml()格式化,或用ET.indent()(Python 3.9+)美化缩进
基本上就这些。手动建树稍费时但完全可控;用 dicttoxml 省事但定制性弱。按实际场景选一个就行。










