答案:通过递归遍历字典,利用xml.etree.ElementTree将嵌套字典转换为XML字符串,支持列表与基本数据类型,结合minidom实现格式化输出。

将字典转换为XML字符串在处理数据交换、配置文件生成或API接口开发时非常常见。Python标准库中的 xml.etree.ElementTree 提供了轻量且高效的方式来构建和解析XML。下面通过实战示例,展示如何用它把字典转成XML字符串。
基本思路:递归构建Element树
字典可能是嵌套的,因此需要递归地遍历每个键值对,将键作为标签名,值作为文本内容或子节点。如果值是字典,则创建子元素;如果是列表,则为每个元素创建同名标签。
示例字典:
data = {
"person": {
"name": "张三",
"age": 30,
"address": {
"city": "北京",
"district": "朝阳区"
},
"hobbies": ["读书", "游泳", "编程"]
}
}
实现步骤
定义一个函数,接收字典并返回一个 Element 对象,然后使用 ElementTree 转为字符串。
立即学习“Python免费学习笔记(深入)”;
代码如下:
import xml.etree.ElementTree as ET from xml.dom import minidomdef dict_to_xml(tag, data): elem = ET.Element(tag) if isinstance(data, dict): for key, val in data.items(): child = dict_to_xml(key, val) elem.append(child) elif isinstance(data, list): for item in data: child = dict_to_xml('item', item) # 使用'item'作为列表项标签 elem.append(child) else: elem.text = str(data) return elem
示例数据
data = { "person": { "name": "张三", "age": 30, "address": { "city": "北京", "district": "朝阳区" }, "hobbies": ["读书", "游泳", "编程"] } }
转换为XML元素
root = dict_to_xml('root', data)
美化输出(可选)
def prettify(elem): rough_string = ET.tostring(elem, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ")
print(prettify(root))
输出结果
运行以上代码,会得到类似如下的格式化XML字符串:
张三 30 北京 朝阳区 - 读书
- 游泳
- 编程
注意事项与优化建议
实际使用中可能需要根据需求调整结构。比如:
- 避免所有列表项都叫
,可以传入自定义标签名。 - 处理特殊类型如
None、布尔值,建议统一转为字符串。 - 若需属性支持(如
),可在字典中约定以 @attr或_attr开头的键表示属性。 - 直接使用
ET.tostring(root, encoding='unicode')可获得不带XML声明的字符串,适合拼接场景。
基本上就这些。利用 xml.etree.ElementTree 结合递归逻辑,能灵活地将任意深度的字典转为结构清晰的XML字符串,无需第三方依赖,适合轻量级项目快速实现。










