Python无内置字典转XML函数,可用xml.etree.ElementTree手动构建(推荐,无依赖)或dicttoxml库一键转换;需注意键名合法性、特殊字符转义、列表与嵌套处理。

Python本身没有内置函数直接把字典转成XML,但可以用标准库xml.etree.ElementTree手动构建,或借助第三方库如dicttoxml快速实现。关键在于理解字典结构与XML层级的对应关系,避免嵌套混乱或特殊字符报错。
用ElementTree手动生成(推荐,无依赖)
适合结构较简单、需精细控制XML格式的场景。核心思路是递归遍历字典,为每个键创建子元素,值设为文本内容,嵌套字典则递归生成子节点。
- 根元素需单独创建,不能直接从字典顶层推导
- 列表需统一处理为同名多个子元素(如
)- ...
- 字符串中的
、&等需自动转义,ElementTree默认处理,无需手动html.escape - 示例:将
{"root": {"name": "Alice", "age": 30}}转为Alice 30
用dicttoxml库一键转换(最省事)
安装:pip install dicttoxml。一行代码即可,自动处理嵌套、列表、类型转换(如数字不加引号)、中文编码。
- 基础用法:
xml = dicttoxml.dicttoxml(data, custom_root='root', attr_type=False) -
attr_type=False禁用类型属性(否则会加type="int"等) - 中文正常显示,但输出是bytes,需解码:
xml.decode('utf-8') - 对空字典、None值有默认行为(如转为空标签),可传
ignore_none=True跳过
注意事项和常见坑
XML标签名不能含空格、冒号、数字开头,字典键若不合规需预处理;键名为xml、xmlns等保留字可能引发问题;时间对象、自定义类实例需先转为字符串。
立即学习“Python免费学习笔记(深入)”;
- 键名非法时,可用
re.sub(r'[^a-zA-Z0-9_]', '_', key)清洗 - 列表元素为字典时,
dicttoxml默认用item作标签名,可通过item_func参数自定义 - ElementTree生成后,用
ET.tostring(root, encoding='unicode', method='xml')获取字符串
简单封装一个安全转换函数
兼顾可控性与便捷性,处理常见异常:
def dict_to_xml(data, root_name="root"):import xml.etree.ElementTree as ET
def _build(element, obj):
if isinstance(obj, dict):
for k, v in obj.items():
child = ET.SubElement(element, k)
_build(child, v)
elif isinstance(obj, list):
for item in obj:
child = ET.SubElement(element, "item")
_build(child, item)
else:
element.text = str(obj)
root = ET.Element(root_name)
_build(root, data)
return ET.tostring(root, encoding='unicode')
# 使用:print(dict_to_xml({"user": {"id": 123, "tags": ["py", "xml"]}}))
不复杂但容易忽略细节,选ElementTree还是dicttoxml,取决于你是否愿意多装一个包以及对输出格式的控制需求。










