python自定义解析简单xml格式文件的方法

 更新时间:2015年05月11日 15:51:26   作者:像风一样的自由  
这篇文章主要介绍了python自定义解析简单xml格式文件的方法,涉及Python解析XML文件的相关技巧,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • 浅谈keras中的后端backend及其相关函数(K.prod,K.cast)

    浅谈keras中的后端backend及其相关函数(K.prod,K.cast)

    这篇文章主要介绍了浅谈keras中的后端backend及其相关函数(K.prod,K.cast),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python实现apahce网站日志分析示例

    python实现apahce网站日志分析示例

    这篇文章主要介绍了python实现apahce网站日志分析示例,需要的朋友可以参考下
    2014-04-04
  • pytorch 求网络模型参数实例

    pytorch 求网络模型参数实例

    今天小编就为大家分享一篇pytorch 求网络模型参数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python列表中删除重复元素的三种方法

    python列表中删除重复元素的三种方法

    本文主要介绍了python列表中删除重复元素的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • python使用MkDocs自动生成文档的操作方法

    python使用MkDocs自动生成文档的操作方法

    python代码注释风格有很多,比较主流的有 reStructuredText风格、numpy风格、Google风格,自动生成文档的工具也有很多,常见的有:Pydocs,Sphinx和MkDocs,本文给大家介绍了python使用MkDocs自动生成文档的操作方法,需要的朋友可以参考下
    2024-06-06
  • python数据可视化之初探 Seaborn

    python数据可视化之初探 Seaborn

    Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级别的接口,使得创建美观的统计图形变得非常简单,在这篇文章中,我们将讨论 Seaborn 的基础使用方法,包括如何创建各种常见的统计图形
    2023-07-07
  • python seaborn heatmap可视化相关性矩阵实例

    python seaborn heatmap可视化相关性矩阵实例

    这篇文章主要介绍了python seaborn heatmap可视化相关性矩阵实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python抢购脚本的编写方法

    Python抢购脚本的编写方法

    本文给大家分享一个秒杀抢购脚本,帮助大家双十二抢购心爱的礼物,步骤很简单,下面小编给大家分享基于Python抢购脚本的编写方法,感兴趣的朋友一起看看吧
    2021-11-11
  • 用python登录Dr.com思路以及代码分享

    用python登录Dr.com思路以及代码分享

    如今一般的大学校园或者公寓都是通过客户端来限制路由器使用,基本上都是Dr.com客户端,有的是登录样式,有的是插件样式。下面我们来说说python定制自己的客户端
    2014-06-06
  • python读写json文件的简单实现

    python读写json文件的简单实现

    这篇文章主要介绍了python读写json文件的简单实现,实例分析了各种读写json的方法和技巧,有兴趣的可以了解一下
    2017-04-04

最新评论