如何将含嵌套对象的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
相关产品推荐
相关产品推荐

