答案:通过递归遍历字典,利用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 转为字符串。
代码如下:
import xml.etree.ElementTree as ET
from xml.dom import minidom
<p>def 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</p><h1>示例数据</h1><p>data = {
"person": {
"name": "张三",
"age": 30,
"address": {
"city": "北京",
"district": "朝阳区"
},
"hobbies": ["读书", "游泳", "编程"]
}
}</p><h1>转换为XML元素</h1><p>root = dict_to_xml('root', data)</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill11526" title="Python Hardener"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Python Hardener" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill11526" title="Python Hardener" class="overflowclass">Python Hardener</a>
<p class="overflowclass">通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。</p>
</div>
<a rel="nofollow" href="/xiazai/skill11526" title="Python Hardener" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h1>美化输出(可选)</h1><p>def prettify(elem):
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")</p><p>print(prettify(root))</p>
输出结果
运行以上代码,会得到类似如下的格式化XML字符串:
<?xml version="1.0" encoding="utf-8"?><root><person><name>张三</name><age>30</age><address> <city>北京</city><district>朝阳区</district> </address><hobbies><item>读书</item><item>游泳</item><item>编程</item></hobbies></person></root>
注意事项与优化建议
实际使用中可能需要根据需求调整结构。比如:
- 避免所有列表项都叫
,可以传入自定义标签名。 - 处理特殊类型如
None、布尔值,建议统一转为字符串。 - 若需属性支持(如
),可在字典中约定以 @attr或_attr开头的键表示属性。 - 直接使用
ET.tostring(root, encoding='unicode')可获得不带XML声明的字符串,适合拼接场景。
基本上就这些。利用 xml.etree.ElementTree 结合递归逻辑,能灵活地将任意深度的字典转为结构清晰的XML字符串,无需第三方依赖,适合轻量级项目快速实现。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










