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中as用法实例分析
Apr 30 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python编程实现归并排序
Apr 14 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
关于python字符串方法分类详解
Aug 20 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
Python values()与itervalues()的用法详解
Nov 27 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
python xlwt模块的使用解析
Apr 13 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
Python urlopen()函数 示例分享
2014/06/12 Python
python实现三次样条插值
2018/12/17 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
大学生个人求职信
2014/06/02 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android