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极简代码实现杨辉三角示例代码
Nov 15 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
python库matplotlib绘制坐标图
Oct 18 Python
解决python 上传图片限制格式问题
Oct 30 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
numba提升python运行速度的实例方法
Jan 25 Python
Pytorch可视化的几种实现方法
Jun 10 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP中设置时区方法小结
2012/06/03 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
javascript连续赋值问题
2015/07/08 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
Python进度条的制作代码实例
2019/08/31 Python
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
写给女生的道歉信
2014/01/14 职场文书
餐厅总厨求职信
2014/03/04 职场文书
国际贸易系求职信
2014/08/09 职场文书
前台接待员岗位职责
2015/04/15 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
MYSQL 运算符总结
2021/11/11 MySQL
HTML中的表格元素介绍
2022/02/28 HTML / CSS
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS