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之不要红头文件(1)
Sep 28 Python
python学习之编写查询ip程序
Feb 27 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
django中forms组件的使用与注意
Jul 08 Python
在django模板中实现超链接配置
Aug 21 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
Pytorch 高效使用GPU的操作
Jun 27 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
PHP中动态HTML的输出技术
2006/10/09 PHP
织梦模板标记简介
2007/03/11 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
PyCharm 常用快捷键和设置方法
2017/12/20 Python
python实现矩阵打印
2019/03/02 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
团支书的期末学习总结自我评价
2013/11/01 职场文书
自主招生自荐书
2013/11/29 职场文书
实习心得体会
2014/01/02 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
文体活动实施方案
2014/03/27 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
java设计模式--七大原则详解
2021/07/21 Java/Android