python自定义解析简单xml格式文件的方法


Posted in Python onMay 11, 2015

本文实例讲述了python自定义解析简单xml格式文件的方法。分享给大家供大家参考。具体分析如下:

因为公司内部的接口返回的字串支持2种形式:php数组,xml;结果php数组python不能直接用,而xml字符串的格式不是标准的,所以也不能用标准模块解析。【不标准的地方是某些节点会的名称是以数字开头的】,所以写个简单的脚步来解析一下文件,用来做接口测试。

#!/usr/bin/env python
#encoding: utf-8
import re
class xmlparse:
  def __init__(self, xmlstr):
    self.xmlstr = xmlstr
    self.xmldom = self.__convet2utf8()
    self.xmlnodelist = []
    self.xpath = ''
  def __convet2utf8(self):
    headstr = self.__get_head()
    xmldomstr = self.xmlstr.replace(headstr, '')
    if 'gbk' in headstr: 
      xmldomstr = xmldomstr.decode('gbk').encode('utf-8')
    elif 'gb2312' in headstr:
      xmldomstr = self.xmlstr.decode('gb2312').encode('utf-8')
    return xmldomstr
  def __get_head(self):
    headpat = r'<\?xml.*\?>'
    headpatobj = re.compile(headpat)
    headregobj = headpatobj.match(self.xmlstr)
    if headregobj:
      headstr = headregobj.group()
      return headstr
    else:
      return ''
  def parse(self, xpath):
    self.xpath = xpath
    xpatlist = []
    xpatharr = self.xpath.split('/')
    for xnode in xpatharr:
      if xnode:
        spcindex = xnode.find('[')
        if spcindex > -1:
          index = int(xnode[spcindex+1:-1])
          xnode = xnode[:spcindex]
        else:
          index = 0;
        temppat = ('<%s>(.*?)</%s>' % (xnode, xnode),index)
        xpatlist.append(temppat)
    xmlnodestr = self.xmldom
    for xpat,index in xpatlist:
      xmlnodelist = re.findall(xpat,xmlnodestr)
      xmlnodestr = xmlnodelist[index]
      if xmlnodestr.startswith(r'<![CDATA['):
        xmlnodestr = xmlnodestr.replace(r'<![CDATA[','')[:-3]
    self.xmlnodelist = xmlnodelist
    return xmlnodestr
if '__main__' == __name__:
  xmlstr = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?><resultObject><a><product_id>aaaaa</product_id><product_name><![CDATA[bbbbb]]></a><b><product_id>bbbbb</product_id><product_name><![CDATA[bbbbb]]></b></product_name></resultObject>'
  xpath1 = '/product_id'
  xpath2 = '/product_id[1]'
  xpath3 = '/a/product_id'
  xp = xmlparse(xmlstr)
  print 'xmlstr:',xp.xmlstr
  print 'xmldom:',xp.xmldom
  print '------------------------------'
  getstr = xp.parse(xpath1)
  print 'xpath:',xp.xpath
  print 'get list:',xp.xmlnodelist
  print 'get string:', getstr
  print '------------------------------'
  getstr = xp.parse(xpath2)
  print 'xpath:',xp.xpath
  print 'get list:',xp.xmlnodelist
  print 'get string:', getstr
  print '------------------------------'
  getstr = xp.parse(xpath3)
  print 'xpath:',xp.xpath
  print 'get list:',xp.xmlnodelist
  print 'get string:', getstr

运行结果:

xmlstr: <?xml version="1.0" encoding="utf-8" standalone="yes" ?><resultObject><a><product_id>aaaaa</product_id><product_name><![CDATA[bbbbb]]></a><b><product_id>bbbbb</product_id><product_name><![CDATA[bbbbb]]></b></product_name></resultObject>
xmldom: <resultObject><a><product_id>aaaaa</product_id><product_name><![CDATA[bbbbb]]></a><b><product_id>bbbbb</product_id><product_name><![CDATA[bbbbb]]></b></product_name></resultObject>
------------------------------
xpath: /product_id
get list: ['aaaaa', 'bbbbb']
get string: aaaaa
------------------------------
xpath: /product_id[1] 
get list: ['aaaaa', 'bbbbb']
get string: bbbbb
------------------------------
xpath: /a/product_id
get list: ['aaaaa']
get string: aaaaa

因为返回的xml格式比较简单,没有带属性的节点,所以处理起来就比较简单了。但测试还是发现有一个bug。即当相同节点嵌套时会出现正则匹配出问题,该问题的可以通过避免在xpath中出现有嵌套节点的名称来解决,否则只有重写复杂的机制了。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
Python类方法__init__和__del__构造、析构过程分析
Mar 06 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
python元组和字典的内建函数实例详解
Oct 22 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
5道关于python基础 while循环练习题
Nov 27 Python
python引用DLL文件的方法
May 11 #Python
深入解析Python中的WSGI接口
May 11 #Python
详细解析Python中__init__()方法的高级应用
May 11 #Python
从Python的源码来解析Python下的freeblock
May 11 #Python
详解Python的Django框架中的templates设置
May 11 #Python
Python素数检测的方法
May 11 #Python
Python中IPYTHON入门实例
May 11 #Python
You might like
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
JS启动应用程序的一个简单例子
2008/05/11 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python文件选择对话框的操作方法
2019/06/27 Python
猫咪家具:CatsPlay
2018/11/03 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
教师教学评估方案
2014/05/09 职场文书
2014年城管工作总结
2014/11/20 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫