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开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
Python反射的用法实例分析
Feb 11 Python
python读写LMDB文件的方法
Jul 02 Python
Python比较配置文件的方法实例详解
Jun 06 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
python获取array中指定元素的示例
Nov 26 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
python 用pandas实现数据透视表功能
Dec 21 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
详解Django中 render() 函数的使用方法
Apr 22 Python
Python 一键获取电脑浏览器的账号密码
May 11 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实现多条件查询实例代码
2010/07/17 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
layUI实现列表查询功能
2019/07/27 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
初学python数组的处理代码
2011/01/04 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
深入解析Python中的集合类型操作符
2015/08/19 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
详解python程序中的多任务
2020/09/16 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
怎样客观的做好自我评价
2013/12/28 职场文书
表彰会主持词
2014/03/26 职场文书
十佳护士先进事迹
2014/05/08 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
前台接待岗位职责
2015/02/03 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
如何用python插入独创性声明
2021/03/31 Python