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

Python中自定义对象序列化为XML字符串的技术咨询

如何将Python自定义对象序列化为XML字符串

别担心,新手碰到这种问题太正常了!Python里的XML序列化确实不像JSON那样开箱即用,但有好几条路能搞定,我给你捋两个最实用的方法:

方法一:用Python标准库 xml.etree.ElementTree (无需额外安装)

这个方法完全依赖Python自带工具,不需要装任何第三方包。核心思路是手动把对象的属性映射成XML节点,步骤清晰可控:

import xml.etree.ElementTree as ET
from xml.dom import minidom

# 先补全你的类(添加初始化方法让逻辑更规范)
class Purchase:
    def __init__(self):
        self._shortPurchaseDesc = ""
    
    @property
    def shortPurchaseDesc(self):
        return self._shortPurchaseDesc
    
    @shortPurchaseDesc.setter
    def shortPurchaseDesc(self, value):
        self._shortPurchaseDesc = value

class Result():
    def __init__(self):
        self._resultCode = ""
    
    @property
    def resultCode(self):
        return self._resultCode
    
    @resultCode.setter
    def resultCode(self, value):
        self._resultCode = value

# 通用序列化函数
def serialize_to_xml(obj, root_tag):
    # 创建XML根节点
    root = ET.Element(root_tag)
    # 遍历对象的公开属性(过滤掉私有属性和方法)
    for attr_name in [attr for attr in dir(obj) if not attr.startswith('_') and not callable(getattr(obj, attr))]:
        attr_value = getattr(obj, attr_name)
        # 为每个属性创建子节点
        child_node = ET.SubElement(root, attr_name)
        child_node.text = str(attr_value)
    # 把XML转换成美观的格式化字符串
    rough_xml = ET.tostring(root, 'utf-8')
    formatted_xml = minidom.parseString(rough_xml).toprettyxml(indent="  ")
    return formatted_xml

# 测试示例
if __name__ == "__main__":
    my_purchase = Purchase()
    my_purchase.shortPurchaseDesc = "Purchase a wireless mouse"
    
    my_result = Result()
    my_result.resultCode = "SUCCESS"
    
    print("Purchase 对象序列化结果:\n", serialize_to_xml(my_purchase, "Purchase"))
    print("\nResult 对象序列化结果:\n", serialize_to_xml(my_result, "Result"))

运行后会输出格式化好的XML,比如Purchase的输出大概是:

<?xml version="1.0" ?>
<Purchase>
  <shortPurchaseDesc>Purchase a wireless mouse</shortPurchaseDesc>
</Purchase>

方法二:用第三方库简化操作(比如 dicttoxml)

如果觉得手动构建节点太繁琐,可以先把对象转成字典,再借助第三方库一键生成XML。首先需要安装依赖:

pip install dicttoxml

然后用下面的代码快速实现序列化:

import dicttoxml
from xml.dom import minidom

# 复用上面的Purchase和Result类,此处省略

# 把对象转成字典的工具函数
def obj_to_dict(obj):
    return {attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith('_') and not callable(getattr(obj, attr))}

# 基于dicttoxml的序列化函数
def serialize_with_dicttoxml(obj, root_tag):
    obj_dict = obj_to_dict(obj)
    # 生成XML字节串,指定根节点名称,关闭类型属性
    xml_bytes = dicttoxml.dicttoxml(obj_dict, custom_root=root_tag, attr_type=False)
    # 格式化输出
    formatted_xml = minidom.parseString(xml_bytes).toprettyxml(indent="  ")
    return formatted_xml

# 测试示例
if __name__ == "__main__":
    my_purchase = Purchase()
    my_purchase.shortPurchaseDesc = "Buy a mechanical keyboard"
    print(serialize_with_dicttoxml(my_purchase, "Purchase"))

这个方法更简洁,适合属性较多或者需要快速开发的场景。

小补充

如果你的对象存在嵌套结构(比如Result类里包含一个Purchase实例),只需要在序列化函数里加个递归判断,就能自动处理嵌套对象;如果需要支持XML属性、命名空间等复杂结构,可以试试功能更强大的lxml库(同样需要额外安装)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:03:31