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通过pip更新所有已安装的包实现方法
May 19 Python
python绘制双柱形图代码实例
Dec 14 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
Python3.7中安装openCV库的方法
Jul 11 Python
python实现一个简单的ping工具方法
Jan 31 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
Python Selenium截图功能实现代码
Apr 26 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
python3美化表格数据输出结果的实现代码
Apr 14 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
xajax写的留言本
2006/11/25 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
Python3非对称加密算法RSA实例详解
2018/12/06 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
法国春天百货官网:Printemps.com
2020/06/29 全球购物
error和exception有什么区别
2012/10/02 面试题
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
总账会计岗位职责
2014/03/13 职场文书
火箭队口号
2014/06/18 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
python not运算符的实例用法
2021/06/30 Python