利用Python处理WebService返回值ArrayOfString
这周完成了第二个工具的开发,主要原理是调用第三方提供的公共的webservice接口,自己将每个webservice接口封装成了函数,输入参数即可以调用接口并获取到相应的查询信息。
该工具属于查询类工具,具有六个功能,分别如下图所示:
在做这个工具时,由于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])
处理后的结果:
下面介绍复杂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])
处理后的结果: