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>

 

转载于:https://www.cnblogs.com/Asp1rant/p/11311770.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值