You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套对象的Python对象序列化为指定格式XML?

解决dataclass转XML的嵌套对象与根标签问题

要实现你想要的XML格式,需要解决两个核心问题:展开嵌套的dataclass对象为字典,以及指定XML根标签。以下是具体实现步骤:

1. 递归转换dataclass为嵌套字典

dict2xml只能处理纯字典结构,直接用__dict__获取的嵌套Address对象会被转成字符串表示。我们需要写一个递归函数,把所有嵌套的dataclass实例都转换成对应的字典:

from dataclasses import dataclass, is_dataclass
from dict2xml import dict2xml

@dataclass
class Address:
    line1: str
    city: str
    state: str
    zip: str

@dataclass
class Person:
    first_name: str
    last_name: str
    address: Address

def dataclass_to_dict(obj):
    if is_dataclass(obj):
        return {field.name: dataclass_to_dict(getattr(obj, field.name)) for field in obj.__dataclass_fields__.values()}
    elif isinstance(obj, list):
        return [dataclass_to_dict(item) for item in obj]
    else:
        return obj

2. 生成带根标签的格式化XML

使用转换后的嵌套字典调用dict2xml,通过root参数指定根标签<Person>,并设置indent参数生成缩进格式的XML:

# 创建测试实例
address = Address(line1='line1', city='city1', state='state1', zip='12345')
person = Person(first_name='firstname', last_name='lastname', address=address)

# 转换为嵌套字典
person_dict = dataclass_to_dict(person)

# 生成XML
xml_output = dict2xml(person_dict, root='Person', indent='    ')
print(xml_output)

输出结果

运行上述代码后,会生成你期望的XML格式:

<Person>
    <address>
        <line1>line1</line1>
        <city>city1</city>
        <state>state1</state>
        <zip>12345</zip>
    </address>
    <first_name>firstname</first_name>
    <last_name>lastname</last_name>
</Person>

关键说明

  • 递归转换函数:遍历dataclass的所有字段,对每个字段值递归处理,确保嵌套的dataclass也被转成字典,而不是字符串表示。
  • root参数:dict2xml默认不生成根标签,通过指定root='Person'可以添加外层的<Person>标签。
  • indent参数:设置缩进字符串(比如4个空格),让XML结构更清晰易读。

内容的提问来源于stack exchange,提问作者Joel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:10:32