Python对象与xml文件的转换和输出

需求:Python编程中,常常需要将object进行xml文件的输出,当需要实现object包含列表和数组的情况下时,下面提供方法:

1.通过dict将object输出为xml:

用内置方法__dict__可以将对象转换为字典,对于对象中包含对象的情况,可以使用递归实现同样转换为字典

 

2.转换为dict后,用dicttoxml库实现将dict转换为xml格式string

 

3.转换xml为常用的缩进格式,可以用以下几种方案:

  (1)使用python xml lib:xml.dom.minidom中的pretty print,不推荐,对于text为空的情况不能正确输出

    (2) 使用lxml 中的etree输出属性pretty_print,用法如下:

1 from lxml import etree
2 xml_str = "<parent><child>text</child><child>other text</child></parent>"
3 root = etree.fromstring(xml_str)
4 print etree.tostring(root, pretty_print=True)

  (3)使用XmlFormatter

  参考:https://pypi.org/project/xmlformatter/0.1.1/

复制代码
 1 # coding=utf-8
 2 
 3 import dicttoxml
 4 import xmlformatter
 5 
 6 
 7 class A:
 8     def __init__(self):
 9         self.ax = 0
10         self.ay = B()
11         self.az = 0
12 
13 
14 class B:
15     def __init__(self):
16         self.bx = 0
17         self.by = 0
18         self.bz = []
19 
20 
21 class C:
22     def __init__(self):
23         self.cn = 0
24         self.cstr = ""
25 
26 
27 def convert2dict(object):
28     try:
29         root_dict = object.__dict__
30         for key in root_dict.keys():
31             val = root_dict[key]
32             if isinstance(val, list):
33                 converted_list = []
34                 for item in val:
35                     converted_list.append(convert2dict(item))
36                 val = converted_list
37             root_dict[key] = convert2dict(val)
38         return root_dict
39     except:
40         return object
41 
42 
43 if __name__ == '__main__':
44     a = A()
45     b = B()
46     c1 = C()
47     c2 = C()
48     a.ay = b
49     b.bz.append(c1)
50     b.bz.append(c2)
51     dict_a = convert2dict(a)
52     xml = dicttoxml.dicttoxml(dict_a, attr_type=False)  # attr_type设置输出xml是否含有type
53     formatter = xmlformatter.Formatter(indent="1", indent_char='\t', preserve=["literal"])
54     xml_format = formatter.format_string(xml)
55     print xml_format
复制代码

输出:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <ay>
        <bx>0</bx>
        <by>0</by>
        <bz>
            <item>
                <cstr></cstr>
                <cn>0</cn>
            </item>
            <item>
                <cstr></cstr>
                <cn>0</cn>
            </item>
        </bz>
    </ay>
    <ax>0</ax>
    <az>0</az>
</root>
复制代码

 

posted @   Asp1rant  阅读(2641)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示