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系列之从文件读取和保存数据
May 23 Python
python 列表降维的实例讲解
Jun 28 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
Python读写zip压缩文件的方法
Aug 29 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
pycharm sciview的图片另存为操作
Jun 01 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 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设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
pyqt和pyside开发图形化界面
2014/01/22 Python
详解python之配置日志的几种方式
2017/05/22 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
心理学专业毕业生推荐信范文
2013/11/21 职场文书
《春天来了》教学反思
2014/04/07 职场文书
班级管理经验交流材料
2015/11/02 职场文书