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编程中一些重用与缩减的建议
Apr 14 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
浅析python递归函数和河内塔问题
Apr 18 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
python ChainMap的使用和说明详解
Jun 11 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
wxpython布局的实现方法
Nov 01 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 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学习之PHP运算符
2006/10/09 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP微信红包API接口
2015/12/05 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python中的for循环
2018/09/28 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
关于python中的xpath解析定位
2020/03/06 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
Python自带的IDE在哪里
2020/07/01 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书