Python实现对象转换为xml的方法示例


Posted in Python onJune 08, 2017

本文实例讲述了Python实现对象转换为xml的方法。分享给大家供大家参考,具体如下:

# -*- 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)#{'name':'sdf'}
#  print type(plist)
#  print type(plist),isinstance(plist, list)
Python 相关文章推荐
python的urllib模块显示下载进度示例
Jan 17 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python中动态创建类实例的方法
Mar 24 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
python的range和linspace使用详解
Nov 27 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Python OrderedDict字典排序方法详解
May 21 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 #Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 #Python
Python3 socket同步通信简单示例
Jun 07 #Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 #Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 #Python
Python中音频处理库pydub的使用教程
Jun 07 #Python
python中defaultdict的用法详解
Jun 07 #Python
You might like
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
js实现select下拉框选择
2020/01/11 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python使用super()出现错误解决办法
2017/08/14 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
对python中的装包与解包实例详解
2019/08/24 Python
python判断链表是否有环的实例代码
2020/01/31 Python
python中re模块知识点总结
2021/01/17 Python
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
社区八一活动方案
2014/02/03 职场文书
草船借箭教学反思
2014/02/03 职场文书
火锅店营销方案
2014/02/26 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
实习单位评语
2014/04/26 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
公司仓库管理制度
2015/08/04 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
导游词之无锡东林书院
2019/12/11 职场文书