Python实现对象转换为xml的方法示例
本文实例讲述了Python实现对象转换为xml的方法。分享给大家供大家参考,具体如下:
#-*-coding:UTF-8-*-
'''''
Createdon2010-4-20
@author:忧里修斯
'''
importxml.etree.ElementTreeasET
importxml.dom.minidomasminidom
fromaddrbook.domainimportPerson
classConverter(object):
'''''
实现Python对象与xml之间的相互转换
'''
root=None#根节点
def__init__(self):
pass
@staticmethod
defcreateRoot(rootTag):
'''''
创建根节点
'''
root=ET.Element(rootTag)
returnroot
@staticmethod
defgetXmlString(element,defaultEncoding='utf-8'):
'''''
根据节点返回格式化的xml字符串
'''
try:
rough_string=ET.tostring(element,defaultEncoding)
reparsed=minidom.parseString(rough_string)
returnreparsed.toprettyxml(indent="",encoding=defaultEncoding)
except:
print'getXmlString:传入的节点不能正确转换为xml,请检查传入的节点是否正确'
return''
@staticmethod
defclassToElements(classobj,rootTag=None):
'''''
根据传入的对象的实例,根据对象的属性生成节点,返回由节点组成的列表
classobj:对象的实例
rootTag:根节点名称
'''
attrs=None#保存对象的属性集
elelist=[]#节点列表
try:
attrs=classobj.__dict__.keys()#获取该对象的所有属性(即成员变量)
except:
print'classToElements:传入的对象非法,不能正确获取对象的属性'
ifattrs!=Noneandlen(attrs)>0:#属性存在
forattrinattrs:
attrvalue=getattr(classobj,attr)#属性值
#属性节点
attrE=ET.Element(attr)
attrE.text=attrvalue
#加入节点列表
elelist.append(attrE)
returnelelist
@staticmethod
defclassToXML(classobj,rootTag=None):
'''''
Python自定义模型类转换成xml,转换成功返回的是xml根节点,否则返回None
classobj:对象的实例
rootTag:根节点名称
'''
try:
classname=classobj.__class__.__name__#类名
ifrootTag!=None:
root=Converter.createRoot(rootTag)
else:
root=Converter.createRoot(classname)
elelist=Converter.classToElements(classobj,rootTag)
foreleinelelist:
root.append(ele)
returnroot
except:
print'classToXML:转换出错,请检查的传入的对象是否正确'
returnNone
@staticmethod
defcollectionToXML(listobj,rootTag='list'):
'''''
集合(列表、元组、字典)转换为xml,转换成功返回的是xml根节点,否则返回None
'''
try:
classname=listobj.__class__.__name__#类名
root=Converter.createRoot(rootTag)
ifisinstance(listobj,list)orisinstance(listobj,tuple):#列表或元组
iflen(listobj)>=0:
forobjinlistobj:#迭代列表中的对象
itemE=Converter.classToXML(obj)
root.append(itemE)
elifisinstance(listobj,dict):#字典
iflen(listobj)>=0:
forkeyinlistobj:#迭代字典中的对象
obj=listobj[key]
itemE=Converter.classToXML(obj)
itemE.set('key',key)
root.append(itemE)
else:
print'listToXML:转换错误,传入的对象:'+classname+'不是集合类型'
returnroot
except:
print'collectionToXML:转换错误,集合转换成xml失败'
returnNone
if__name__=='__main__':
p1=Person('dredfsam','男','133665')
p2=Person('dream','女','r')
p3=Person('得分','男','sdf')
personList={}
personList['p1']=p1
personList['p2']=p2
personList['p3']=p3
#personList.append(p1)
#personList.append(p2)
#personList.append(p3)
root=Converter.collectionToXML(personList)
printConverter.getXmlString(root)
#plist=(p1,p2,p3)#{'name':'sdf'}
#printtype(plist)
#printtype(plist),isinstance(plist,list)
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线