【VC+gSOAP_求救】gSOAP客户端程序需要接收多组返回数据

山书生 2010-06-29 04:58:26
<NS1:Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/">
<MsgId>414d51204d425f42524f4b45525f514db52b064c252bb383</MsgId>
<NS1:Body>
<ns:ivrQueryOrderInfoResponse xmlns:ns="http://bean.mediaPlatform.webreq.suning.com/wsdl/">
<output1>
<serviceInfo>
<saleOrder>0200012822</saleOrder>
<orderType>ZS01</orderType>
<serviceDate>2009-10-02</serviceDate>
<serviceTime>16:48:37</serviceTime>
<maintenanceRank/>
<maintenanceTime>00:00:00</maintenanceTime>
<workerTel/>
<workerName>KY1</workerName>
</serviceInfo>
<serviceInfo>
<saleOrder>0200012822</saleOrder>
<orderType>ZS01</orderType>
<serviceDate>2009-10-02</serviceDate>
<serviceTime>16:48:37</serviceTime>
<maintenanceRank/>
<maintenanceTime>00:00:00</maintenanceTime>
<workerTel/>
<workerName>KY1</workerName>
</serviceInfo>
<serviceInfo>
<saleOrder>0200012822</saleOrder>
<orderType>ZS01</orderType>
<serviceDate>2009-09-30</serviceDate>
<serviceTime>16:32:41</serviceTime>
<maintenanceRank/>
<maintenanceTime>00:00:00</maintenanceTime>
<workerTel/>
<workerName/>
</serviceInfo>
</output1>
</ns:ivrQueryOrderInfoResponse>
</NS1:Body>
</NS1:Envelope>
2010-06-22 16:24:26,375 [MB_BROKER.DetermineService] INFO


接收如上数据组。这是server段返回给client的信息,有三组serviceInfo【多少组不是固定的】,但是如下代码我soap_call之后soap.output只能用接收到一组serviceInfo。求教该如何做???

...全文
318 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zentaichang 2011-03-23
  • 打赏
  • 举报
回复
struct student
{
int sid; /* required element of type xsd:int */
char *name; /* optional element of type xsd:string */
char *phone; /* optional element of type xsd:string */
};
struct _ns__tbl_GetInitialDataResponse
{
int __size; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* sequence of elements <ptrStu> */
struct student **ptrStu; /* optional element of type student */
};

int ns__getReInitialData(struct soap *soap, struct _ns__tbl_GetInitialData *structData, struct _ns__tbl_GetInitialDataResponse *Response)
{
int i=0;

Response->__size=20; // <== 重點在這裡 要給訂個數才會取得幾組Response->ptrStu
Response->ptrStu=(struct student **)soap_malloc(soap, sizeof(struct student *));

for(i=0;i<Response->__size;i++)
{
Response->ptrStu[i]=(struct student *)soap_malloc(soap, sizeof(struct student));
Response->ptrStu[i]->name=(char *)soap_malloc(soap, 32);
Response->ptrStu[i]->phone=(char *)soap_malloc(soap, 32);

memset(Response->ptrStu[i]->name, 0, 32);
memset(Response->ptrStu[i]->phone, 0, 32);
Response->ptrStu[i]->sid=111;
strcpy(Response->ptrStu[i]->name,"A");
strcpy(Response->ptrStu[i]->phone,"B");
}


return SOAP_OK;

}
山书生 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yui 的回复:]
大多数情况下不应该改gSOAP生成的任何东西,感觉soapoutput的使用上不太正常,它不是一个指针啊
[/Quote]
呵呵,yui也用过gSOAP?
yui 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taizans 的回复:]

引用 3 楼 yui 的回复:
大多数情况下不应该改gSOAP生成的任何东西,感觉soapoutput的使用上不太正常,它不是一个指针啊

呵呵,yui也用过gSOAP?
[/Quote]

我写了一篇博文,里面的用例也是多组返回数据,我是用libxml2处理的

http://blog.csdn.net/yui/archive/2010/07/26/5767494.aspx
山书生 2010-07-19
  • 打赏
  • 举报
回复
看gSOAP的帮助文档,原意是送多值或收多值都要调整h文件定义的收发参数结构的。
只是这里存在多组返回值的情况,不知道应该怎么处理。

按照一组的返回方式,接收是成功的;就是多组的时候,不知道怎么应对~ :(
yui 2010-07-19
  • 打赏
  • 举报
回复
大多数情况下不应该改gSOAP生成的任何东西,感觉soapoutput的使用上不太正常,它不是一个指针啊
山书生 2010-06-29
  • 打赏
  • 举报
回复
以上我第一个怀疑,改了没效。
看了web service的Wsdl文件之后,发现有很多xsd::string字样,还有miniOccurs=0,不知道是否跟这个相关?!

<xsd:sequence>
<xsd:element minOccurs="0" name="saleOrder" type="xsd:string" />
<xsd:element minOccurs="0" name="orderType" type="xsd:string" />
<xsd:element minOccurs="0" name="serviceDate" type="xsd:string" />
<xsd:element minOccurs="0" name="serviceTime" type="xsd:string" />
<xsd:element minOccurs="0" name="maintenanceRank" type="xsd:string" />
<xsd:element minOccurs="0" name="maintenanceTime" type="xsd:string" />
<xsd:element minOccurs="0" name="workerTel" type="xsd:string" />
<xsd:element minOccurs="0" name="workerName" type="xsd:string" />
</xsd:sequence>

而且,其中,是否跟
Wsdl2h -s -o MediaPlatformService.h MediaPlatformService.wsdl
的-s【不采用STL】有关系
山书生 2010-06-29
  • 打赏
  • 举报
回复
//////// soapStub.h ...
//......
class SOAP_CMAC ns3__ivrQueryOrderInfoserviceInfo
{
public:
char *saleOrder; /* optional element of type xsd:string */
char *orderType; /* optional element of type xsd:string */
char *serviceDate; /* optional element of type xsd:string */
char *serviceTime; /* optional element of type xsd:string */
char *maintenanceRank; /* optional element of type xsd:string */
char *maintenanceTime; /* optional element of type xsd:string */
char *workerTel; /* optional element of type xsd:string */
char *workerName; /* optional element of type xsd:string */
struct soap *soap; /* transient */
public:
//......
ns3__ivrQueryOrderInfoserviceInfo() : saleOrder(NULL), orderType(NULL), serviceDate(NULL), serviceTime(NULL), maintenanceRank(NULL), maintenanceTime(NULL), workerTel(NULL), workerName(NULL), soap(NULL) { }
virtual ~ns3__ivrQueryOrderInfoserviceInfo() { }
};
//......
class SOAP_CMAC ns3__ivrQueryOrderInfoResponse
{
public:
int __sizeserviceInfo; /* sequence of elements <serviceInfo> */
ns3__ivrQueryOrderInfoserviceInfo **serviceInfo; /* optional element of type ns3:ivrQueryOrderInfoserviceInfo */
struct soap *soap; /* transient */
public:
//......
ns3__ivrQueryOrderInfoResponse() : __sizeserviceInfo(0), serviceInfo(NULL), soap(NULL) { }
virtual ~ns3__ivrQueryOrderInfoResponse() { }
};
//......

//////// .cpp code...
char *orderType = new char[256]; //soap输出的值
//调用Webservice
if(soap_call___ns1__ivrQueryOrderInfo(&soap,server,NULL,&soapinput,&soapoutput) == SOAP_OK)
{
int sizeserviceInfo;

response = *soapoutput.output1;
sizeserviceInfo = (int) response.__sizeserviceInfo;
serviceInfo = **response.serviceInfo;
strcpy(orderType,serviceInfo.orderType);
return 1;
}


我在使用gSOAP Wsdl2h生成h文件之后做了如下修改,再使用Soapcpp2生成相关cpp和h文件,还是一样只能接收一组serviceInfo
>Wsdl2h -s -o MediaPlatformService.h  MediaPlatformService.wsdl
******** ********
////////MediaPlatformService.h ...
/// Pointer to array of length 0..unbounded //// line 245
ns3__ivrQueryOrderInfoserviceInfo* *serviceInfo 9;//changed 0 to 9 at 20100629 Sam.
/// Pointer to array of length 0..unbounded //// line 278
ns3__ivrQueryDeliveryinfodeliveryInfo* *deliveryInfo 9;//changed 0 to 9 at 20100629 Sam.
******** ********
>Soapcpp2 -C MediaPlatformService.h

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧