Python中将字典写入XML需手动构建XML树:扁平字典用ElementTree逐键值创建子元素;嵌套结构需递归处理字典、列表和纯值;第三方库dicttoxml可自动处理并支持自定义选项。

Python中把字典写入XML文件,核心思路是:先将字典结构映射为XML树(常用xml.etree.ElementTree),再序列化保存。没有直接的“字典→XML”内置函数,需手动构建元素并递归处理嵌套结构。
用ElementTree构建简单字典的XML
适用于扁平字典(无嵌套、无列表)。手动创建根节点,遍历字典键值对生成子元素:
import xml.etree.ElementTree as ETdata = {"name": "Alice", "age": "30", "city": "Beijing"}
root = ET.Element("person") for key, value in data.items(): child = ET.SubElement(root, key) child.text = str(value)
tree = ET.ElementTree(root) tree.write("output.xml", encoding="utf-8", xml_declaration=True)
生成的output.xml内容如下:
立即学习“Python免费学习笔记(深入)”;
Alice 30 Beijing
处理嵌套字典和列表
复杂数据需递归函数。关键点:区分字典(建子元素)、列表(对每个项重复处理)、纯值(设为文本):
- 遇到字典:为每个键创建子元素,递归处理其值
- 遇到列表:为每个元素生成同名子节点(如
item或按上下文命名) - 遇到字符串/数字:设为当前元素的
.text
示例函数:
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) # 列表项复用key作标签名
elem.append(child)
else:
child = ET.Element(key)
child.text = str(val)
elem.append(child)
return elem
示例数据
data = {
"book": {
"title": "Python Guide",
"author": ["Alice", "Bob"],
"price": 49.99,
"tags": [{"name": "programming"}, {"name": "beginner"}]
}
}
root = dict_to_xml("library", data)
tree = ET.ElementTree(root)
tree.write("book.xml", encoding="utf-8", xml_declaration=True)
使用第三方库简化(如dicttoxml)
安装:pip install dicttoxml
优点:自动处理嵌套、列表、类型转换;支持自定义根名、忽略空值等。
from dicttoxml import dicttoxml from xml.dom.minidom import parseStringdata = {"name": "Alice", "hobbies": ["reading", "coding"]}
xml = dicttoxml(data, custom_root="person", attr_type=False) dom = parseString(xml) with open("output.xml", "w", encoding="utf-8") as f: f.write(dom.toprettyxml(indent=" "))
注意:dicttoxml默认给所有值加type属性(如),设attr_type=False可禁用。
注意事项和常见问题
- XML标签名不能含空格、特殊字符或以数字开头——字典键需预处理(如替换空格为下划线)
- 键名重复时(如列表中多个同名字典),ElementTree会生成多个同名子元素,符合XML规范
- 中文需指定
encoding="utf-8"并开启xml_declaration=True,避免乱码 - 若字典含
None,需提前转为空字符串或跳过,否则.text = None会报错










