Python實現物件轉換為xml的方法示例

2022-10-04 21:09:34 字數 3657 閱讀 7819

# -*- coding:utf-8 -*-

'''''

created on 2010-4-20

@author: 憂裡修斯

'''import xml.etree.elementtree as et

import xml.dom.minidom as minidom

from addrbook.domain import person

class converter(object):

'''''

實現python物件與xml之間的相互轉換

'''root = none#根節點

def __init__(self):

pass

@staticmethod

def createroot(roottag):

'''''

建立根節點

'''root = et.element(roottag)

return root

@staticmethod

def getxmlstring(element,defaultencoding='utf-8'):

'''''

根據節點返回格式化的xml字串

'''try:

rough_string = et.tostring(element, defaultencoding)

reparsed = minidom.parsestring(rough_string)

return reparsed.toprettyxml(indent=" " , encoding=defaultencoding)

except:

print 'getxmlstring:傳入的節點不能正確轉換為xml,請檢查傳入的節點是否正確'

return ''

@staticmethod

def classtoelements(classobj,roottag=none):

'''''

根據傳入的物件的例項,根據物件的屬性生成節點,返回由節點組成的列表

classobj:物件的例項程式設計客棧

roottag:根節點名稱

'''attrs = none#儲存物件的屬性集

elelist = #節點列表

try:

attrs = classobj.__dict__.keys()#獲取該物件的所有屬性(即成員變數)

except:

print 'classtoelements:傳入的物件非法,不能正確獲取物件的屬性'

if attrs != none and len(attrs) > 0:#屬性存在

for attr in attrs:

attrvalue = getattr(classobj, attr)#屬性值

#屬性節點

attre = et.element(attr)

程式設計客棧 attre.text = attrvalue

#加入節點列表

elelist.append(attre)

return elelist

@staticmethod

def classtoxml(classobj,roottag=none):

'''''

python自定義模型類轉換成xml,轉換成功返回的是xml根節點,否則返回none

classobj:物件的例項

roottag:根節點名稱

'''try:

classname = classobj.__class__.__name__ #類名

if roottag != none:

root = converter.createroot(roottag)

else:

root = converter.createroot(classname)

elelist = converter.classtoelements(classobj, roottag)

for ele in elelist:

root.append(ele)

return root

except:

print 'classtoxml:轉換出錯,請檢查的傳入的物件是否正確'

return none

@staticmethod

def collectiontoxml(listobj,roottag='list'):

'''''

集合(列表、元組、字典)轉換為xml,轉換成功返回的是xml根節點,否則返回none

'''try:

classname = listobj.__class__.__name__ #類名

root = converter.createroot(roottag)

if isinstance(listobj, list) or isinstance(listobj, tuple):#列表或元組

if len(listobj) >= 0:

for obj in listobj:#迭代列表中的物件

iteme = converter.classtoxml(obj)

root.append(iteme)

elif isinstance(listobj, dict):#字典

if len(listobj) >= 0:

for key in listobj:#迭代字典中的物件

obj = listobj[key]

iteme = converter.classtoxml(obj)

iteme.set('key', key)

root.append(iteme)

else:

print 'listtoxml:轉換錯誤,傳入的物件:'+classname+'不是集合型別'

return root

except:

print 'collectiontoxml:轉換錯誤,集合轉換成xml失敗'

return none

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)

print converter.getxmlstring(root)

# plist = (p1,p2,p3)#

# print type(plist)

# print type(plist),isinstance(plist, list)

ps:這裡再為大家提供幾款關於xml操作的**工具供大家參考使用:

**xml/json互相轉換工具:

**格式化xml/**壓縮xml:

xml**壓縮/格式化工具:

xml****格式化美化工具:

json轉換為物件

將json字串轉化為物件 param jsondata json串 param beantype 轉換物件 return 轉換好的物件 throws ioexception throws jsonparseexception return t 轉換中可能遇到的情況 轉換時json中的字段沒按照駝峰式...

python實現羅馬數字轉換為整數

輸入 iii 輸出 3 輸入 iv 輸出 4 輸入 ix 輸出 9 輸入 lviii 輸出 58 解釋 l 50,v 5,iii 3.輸入 mcmxciv 輸出 1994 解釋 m 1000,cm 900,xc 90,iv 4.其實實現的思路很簡單,我們就先建立羅馬數字與阿拉伯數字對應的字典,然後再...

將List轉換為Json物件

將list轉換為json物件,分別有兩個json的jar包 1 org.json.jsonarray包 2 net.sf.json.jsonarray包 兩個jsonarray分別實現方式 1 org.json.jsonarray包 2 net.sf.json.jsonarray包 此包下json物...