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 文件读写操作实例详解
Mar 12 Python
Python subprocess模块学习总结
Mar 13 Python
python字符串连接方式汇总
Aug 21 Python
Python显示进度条的方法
Sep 20 Python
python3抓取中文网页的方法
Jul 28 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
python实现键盘输入的实操方法
Jul 16 Python
Python selenium实现断言3种方法解析
Sep 08 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python复合条件下的字典排序
Dec 18 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
mysql+php分页类(已测)
2008/03/31 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python实现全局变量的两个解决方法
2014/07/03 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python 图片去噪的方法示例
2019/07/09 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
法学专业个人求职信
2013/09/26 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
《识字五》教学反思
2014/03/01 职场文书
敬老院活动总结
2014/04/28 职场文书
企业读书活动总结
2014/06/30 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis