Python如何将字典转换为XML

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

Python本身没有内置函数直接把字典转成XML,但可以用标准库xml.etree.ElementTree手动构建,或借助第三方库如dicttoxml快速实现。关键在于理解字典结构与XML层级的对应关系,避免嵌套混乱或特殊字符报错。

用ElementTree手动生成(推荐,无依赖)

适合结构较简单、需精细控制XML格式的场景。核心思路是递归遍历字典,为每个键创建子元素,值设为文本内容,嵌套字典则递归生成子节点。

  • 根元素需单独创建,不能直接从字典顶层推导
  • 列表需统一处理为同名多个子元素(如...
  • 字符串中的&等需自动转义,ElementTree默认处理,无需手动html.escape
  • 示例:将{"root": {"name": "Alice", "age": 30}}转为Alice30

用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标签名不能含空格、冒号、数字开头,字典键若不合规需预处理;键名为xmlxmlns等保留字可能引发问题;时间对象、自定义类实例需先转为字符串。

  • 键名非法时,可用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,取决于你是否愿意多装一个包以及对输出格式的控制需求。