python自定义解析简单xml格式文件的方法
admin
2023-07-31 02:20:45
0

本文实例讲述了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>(.*?)\' % (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\'aaaaabbbbb\'
  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: aaaaabbbbb
xmldom: aaaaabbbbb
------------------------------
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程序设计有所帮助。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...