利用Python处理WebService返回值ArrayOfString

       这周完成了第二个工具的开发,主要原理是调用第三方提供的公共的webservice接口,自己将每个webservice接口封装成了函数,输入参数即可以调用接口并获取到相应的查询信息。

该工具属于查询类工具,具有六个功能,分别如下图所示:

利用Python处理WebService返回值ArrayOfString

       在做这个工具时,由于webservice返回的查询信息类型为ArrayOfString,需要针对这个数据类型进行处理,获取其中的数据信息,从而组合自己的输出格式进行查询的反馈,下面介绍利用Pyhton处理ArrayOfString,获取其中的数据。

首先,大家可以先看看ArrayOfString的数据类型是怎么样的,如下图:

1、较为简单的ArrayOfString:可以看成字典的形式

(ArrayOfString){
   string[] = 
      "你好",
      "nǐ hǎo",
      None,
      "hello;how are you",
      None,
 }

2、较为复杂的ArrayOfString:可以看成是字典中内嵌字典的形式

(getDomesticAirlinesTimeResult){
   diffgram = 
      (diffgram){
         Airlines = 
            (Airlines){
               AirlinesTime = 
                  (AirlinesTime){
                     _id = "AirlinesTime1"
                     _rowOrder = "0"
                     _hasChanges = "inserted"
                     Company = "日期错误"
                     AirlineCode = ""
                     StartDrome = ""
                     ArriveDrome = ""
                     StartTime = ""
                     ArriveTime = ""
                     Mode = ""
                     AirlineStop = "0"
                     Week = ""
                  }
            }
      }
 }

下面介绍简单Array Of String的处理方法:

针对Array Of String的数据类型,处理的思路是需要先把该数据类型转化成Pyhton可以处理的数据类型,例如dict或者是list,所在这里需要使用到suds库中的sudsobject,sudsobject中有个函数是asdict可以将Array Of String处理成dict或list。下面是我自己封装的函数(我是将其返回成了list,方便获取其中的数据):

from suds import sudsobject
def GetArrayOfStringValue(self, array,info):
    '''处理webservice返回的array of string,并获取返回值列表'''
    getarray = array
    getdict = sudsobject.asdict(getarray)
    getlist = getdict.get('%s'%info)
    return getlist

备注:上面的参数array是指Array Of String,info是指Array Of String当中的key值

实例如下:(根据上面的简单Array Of String进行处理)

commontools = CommonTools()------调用的公共函数的类,自己封装的,可以忽略
url=r'http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl'
# 若WebServices接口要求在被调用时显式地指定调用标准,需调用封装的方法
client = commontools.filter_api_standard(url)
getarray = client.service.TranslatorString(wordKey)
reslist=commontools.GetArrayOfStringValue(getarray,'string')------调用上面封装的方法,返回的list赋值给reslist
result='***************中英互译信息查询***************\n' \
       '[查询时间] %s\n' \
       '[待翻译信息] %s\n' \
       '[翻译信息查询] %s\n'%(commontools.NowDateTime(),reslist[0],reslist[3])

处理后的结果:

利用Python处理WebService返回值ArrayOfString

 下面介绍复杂Array Of String的处理方法:

由于复杂的ArrayOfString是类似字典中嵌套字典的形式,所以我们需要获取里面有价值的数据的话,就需要一层一层抛开或者说是转化,直到我们获取到相应的list获取dict。

还是利用我上面封装的函数,只是array参数和info参数需要根据不同层级的ArrayIOfString进行改变

封装的函数:

from suds import sudsobject
def GetArrayOfStringValue(self, array,info):
    '''处理webservice返回的array of string,并获取返回值列表'''
    getarray = array
    getdict = sudsobject.asdict(getarray)
    getlist = getdict.get('%s'%info)
    return getlist

备注:上面的参数array是指Array Of String,info是指Array Of String当中的key值

实例如下:(根据上面的复杂Array Of String进行处理)

getarray=self.SendRequest(startcity,arrivecity,year,month,day)------忽略不看
# 处理array of string复杂数据,最终获取成列表
getarray1 = commontools.GetArrayOfStringValue(getarray, 'diffgram')
getarray2 = commontools.GetArrayOfStringValue(getarray1, 'Airlines')
getarray3 = commontools.GetArrayOfStringValue(getarray2, 'AirlinesTime')
# 循环输出信息
for i in range(len(getarray3)):
    result = '**************从%s到%s航班信息查询**************\n' \
             '[航班信息序号]: %d\n' \
             '[航空公司]: %s\n' \
             '[航班号]: %s\n' \
             '[出发机场]: %s\n' \
             '[到达机场]: %s\n' \
             '[出发时间]: %s\n' \
             '[到达时间]: %s\n' \
             '[中途经停]: 中途要经停%s个站\n' \
             '[飞行周期]: %s\n\n' % (startcity, arrivecity,(i+1), getarray3[i][2], getarray3[i][3],
                                 getarray3[i][4], getarray3[i][5], getarray3[i][6], getarray3[i][7],
                                 getarray3[i][9], getarray3[i][10])

处理后的结果:

利用Python处理WebService返回值ArrayOfString