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写的一个wordpress的采集程序
Feb 27 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
python实现zabbix发送短信脚本
Sep 17 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
PyQt5组件读取参数的实例
Jun 25 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
基于python实现地址和经纬度转换
May 19 Python
keras 读取多标签图像数据方式
Jun 12 Python
python温度转换华氏温度实现代码
Dec 06 Python
python如何读取.mtx文件
Apr 22 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
高效的jquery数字滚动特效
2015/12/17 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
Python中Django发送带图片和附件的邮件
2017/03/31 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python-str,list,set间的转换实例
2018/06/27 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
大学生蛋糕店创业计划书
2014/01/13 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
承兑汇票延期证明
2015/06/23 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
校长新学期寄语2016
2015/12/04 职场文书