如何用Python将字典转换为xml字符串 xml.etree.ElementTree实战

答案:通过递归遍历字典,利用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

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

示例数据

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字符串,无需第三方依赖,适合轻量级项目快速实现。