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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM