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 相关文章推荐
pygame学习笔记(5):游戏精灵
Apr 15 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python聊天室实例程序分享
Jan 05 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
python解析xml简单示例
Jun 21 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
Django实现网页分页功能
Oct 31 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
python爬虫快速响应服务器的做法
Nov 24 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
Django视图类型总结
Feb 17 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实现图片缩放功能类
2013/12/18 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python代码编写计算器小程序
2020/03/30 Python
python3实现微型的web服务器
2019/09/03 Python
python自动生成model文件过程详解
2019/11/02 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
opencv实现图像平移效果
2021/03/24 Python
小学生感恩演讲稿
2014/04/25 职场文书
骨干教师考核方案
2014/05/09 职场文书
工作检讨书怎么写
2014/10/10 职场文书
党员评议个人总结
2014/10/20 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
英文版辞职信
2015/02/28 职场文书
举起手来观后感
2015/06/09 职场文书
禁毒主题班会教案
2015/08/14 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python