国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python自定義解析簡單xml格式文件的方法

2019-11-25 17:29:40
字體:
來源:轉載
供稿:網友

本文實例講述了python自定義解析簡單xml格式文件的方法。分享給大家供大家參考。具體分析如下:

因為公司內部的接口返回的字串支持2種形式:php數組,xml;結果php數組python不能直接用,而xml字符串的格式不是標準的,所以也不能用標準模塊解析?!静粯藴实牡胤绞悄承┕濣c會的名稱是以數字開頭的】,所以寫個簡單的腳步來解析一下文件,用來做接口測試。

#!/usr/bin/env python#encoding: utf-8import reclass 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 xmlnodestrif '__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_idget list: ['aaaaa', 'bbbbb']get string: aaaaa------------------------------xpath: /product_id[1] get list: ['aaaaa', 'bbbbb']get string: bbbbb------------------------------xpath: /a/product_idget list: ['aaaaa']get string: aaaaa

因為返回的xml格式比較簡單,沒有帶屬性的節點,所以處理起來就比較簡單了。但測試還是發現有一個bug。即當相同節點嵌套時會出現正則匹配出問題,該問題的可以通過避免在xpath中出現有嵌套節點的名稱來解決,否則只有重寫復雜的機制了。

希望本文所述對大家的Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天津市| 三门县| 噶尔县| 陕西省| 福安市| 平泉县| 灌阳县| 广汉市| 大丰市| 南投县| 襄垣县| 兰州市| 北海市| 栾城县| 鹤山市| 鹿泉市| 文水县| 浑源县| 吉首市| 交口县| 峨眉山市| 和硕县| 岫岩| 富民县| 富顺县| 南部县| 平乡县| 阿勒泰市| 福海县| 石阡县| 久治县| 和政县| 达州市| 舞阳县| 左权县| 利川市| 乐都县| 虎林市| 远安县| 青河县| 岑溪市|