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
相关产品推荐
相关产品推荐

