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发送arp欺骗攻击代码分析
Jan 16 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
Python isinstance函数介绍
Apr 14 Python
Python基础教程之异常详解
Jan 10 Python
Python 下载及安装详细步骤
Nov 04 Python
python文字转语音的实例代码分析
Nov 12 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
图文详解matlab原始处理图像几何变换
Jul 09 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/05/04 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
layui表格数据重载
2019/07/27 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
深入理解Python中的元类(metaclass)
2015/02/14 Python
python实现学生管理系统
2018/01/11 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
python已协程方式处理任务实现过程
2019/12/27 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
优秀导游先进事迹材料
2014/01/25 职场文书
电台编导求职信
2014/05/06 职场文书
青春演讲稿范文
2014/05/08 职场文书
大学同学会活动方案
2014/08/20 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
给上级领导的感谢信
2015/01/22 职场文书
信仰观后感
2015/06/03 职场文书
初中数学教学反思范文
2016/02/17 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js