环境:
我使用的WSDL(服务器)有以下架构子部分(我试图用纯文本清楚地写出来) -
[第1小节]
searchRequest: (searchRequest){
userIdentification = (userIdentification){
username = ""
password = ""
}
itineraryArr = (itineraryArray){
_arrayType = ""
_offset = ""
_id = ""
_href = ""
_arrayType = ""
}
...
...
[第2小节]
itinerary: (itinerary){
departurePoint = (locationPoint){
locationId = None
radius = None
}
arrivalPoint = (locationPoint){
locationId = None
radius = None
}
...
...
'userIdentification'(这是一种“简单”类型)
没有问题但是,'itineraryArr'是一个'行程'数组,我不知道如何使用python创建XML数组。
我尝试了几种组合,例如
itinerary0 = self.client.factory.create('itinerary')
itineraryArray = self.client.factory.create('itineraryArray')
itineraryArray = [itinerary0]
searchRequest.itineraryArr = itineraryArray
但我的所有试验都导致了相同的服务器错误 -
Server raised fault: 'Cannot use object of type itinerary as array'
(Fault){
faultcode = "SOAP-ENV:Server"
faultstring = "Cannot use object of type itinerary as array"
}
答案 0 :(得分:6)
我的情况相同,使用RPC /编码样式WS和包含soap数组的方法。打印请求(request = client.factory.create('Request')
)给出:
(Request){
requestid = None
option =
(ArrayOfOption){
_arrayType = ""
_offset = ""
_id = ""
_href = ""
_arrayType = ""
}
}
Jacques(1request.option.append(option1)1)给出的解决方案不起作用,因为它以错误消息ArrayOfOption instance has no attribute append
结束。
mcauth给出的解决方案如下:
array = client.factory.create('ArrayOfOption')
array.item = [option1, option2, option3, option4, option5, option6]
request.option=array
它的工作原理如此,因为生成的SOAP消息不显示arrayType
属性:
<option xsi:type="ns3:ArrayOfOption">
我找到的最佳解决方案也是最简单的:
request.option = [option1, option2, option3, option4, option5, option6]
它以良好的SOAP消息结束:
<option xsi:type="ns0:ArrayOfOption" ns3:arrayType="ns0:Option[6]">
正如服务器端WS所期望的那样。
答案 1 :(得分:4)
我相信你要找的是:
itinerary0 = self.client.factory.create('itinerary')
itineraryArray = self.client.factory.create('itineraryArray')
print itineraryArray
itineraryArray.itinerary.append(itinerary0)
我必须自己这样做;)是什么帮助我发现它是打印到控制台。那可能会给你以下几点:
(itineraryArray){
itinerary[] = <empty>
}
干杯,雅克
答案 2 :(得分:2)
对于这种类型的结构,我在数组对象上设置了一个名为“item”的属性,然后将列表成员附加到它。类似的东西:
itineraryArray = self.client.factory.create('itineraryArray')
itineraryArray.item = [itinerary0]
即使对于具有多个级别的复杂呼叫,也可以解析和传递。