C++调用webservice

tomorrow~ 2016-11-16 02:05:49
webservice的返回为
<getdataResult>
<xsd:schema>schema</xsd:schema>xml</getdataResult>
</getdataResponse>
请问这种该怎么去解析它,显示它呢,能不能转换成string的
...全文
460 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomorrow~ 2016-11-20
  • 打赏
  • 举报
回复
引用 15 楼 10km的回复:
[quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
如果上面的代码是用gsoap生成的,那么,_ns1__dataResponse中的_return成员就是返回值,不需要再xml解析 参见我的gsoap调用代码:
std::vector<ns4__CodeInfo *> detectFace(uint8_t *pImgData,size_t nSize) {
	soap soap;
	//soap_register_plugin(&soap, plugin);

	_ns1__sdk_USCOREdetectFace param;
	_ns1__sdk_USCOREdetectFaceResponse ret;

	xsd__base64Binary b;
	b.soap = &soap;
	b.__ptr = pImgData;
	b.__size = (int)nSize;
        // 设置调用参数
	param.imgData = &b;
       // 调用gosap生成代码实现Webservice调用
	soap_call___ns1__sdk_USCOREdetectFace(&soap, soap_endpoint, NULL, ¶m, ret);
       // 判断调用是否成功,如果不为SOAP_OK则进行错误处理,成功则返回结果(数组)
	if (soap.error != SOAP_OK) {
		soap_fault(&soap);
		SOAP_ENV__Detail* detail = getFaultDetail(soap);
		if (detail) {
			if (detail->ns1__FaceDbServiceDeleteImgFail) {
				std::cout << "FaceDbServiceDeleteImgFail:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceDuplicateReord) {
				std::cout << *detail->ns1__FaceDbServiceDuplicateReord->DuplicateReord->message << std::endl;
			}
			else if (detail->ns1__FaceDbServiceImageError) {
				std::cout << "FaceDbServiceImageError:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceNotFaceDetected) {
				std::cout << "FaceDbServiceNotFaceDetected:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceNotFoundBean) {
				std::cout << "FaceDbServiceNotFoundBean:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceServiceRuntime) {
				std::cout << *detail->ns1__FaceDbServiceServiceRuntime->ServiceRuntime->serverStackTraceMessage << std::endl;
			}
			else {
				const char* ptr = *soap_faultdetail(&soap);
				if (ptr)
					std::cout << ptr << std::endl;
				ptr = *soap_faultstring(&soap);
				if (ptr)
					std::cout << ptr << std::endl;
			}
		}
	}
        //  返回结果
	return ret.return_;
}
引用 13 楼 CSDN______ 的回复:
[quote=引用 12 楼 10km的回复:][quote=引用 11 楼 tomorrow~的回复:][quote=引用 9 楼 10km的回复:][quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote] 不知道你gsoap生成代码的方式是怎样的 但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote] 我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢[/quote] 下面是我生成gsoap C/C++代码的完整批处理脚本供你参考. gsoapgen.bat

ECHO OFF
SETLOCAL
REM bat所在路径(%~dp0)为工作路径
SET work_dir=%~dp0
PUSHD %work_dir%
REM 定义gsoap根路径
SET GSOAP_HOME=gsoap-2.8
REM 将gsoap编译器加入搜索路径
SET PATH=%GSOAP_HOME%\gsoap\bin\win32;%PATH%
REM 定义wsdl文件位置
SET wsdl=..\webservice\build\wsdl\FaceDbService.wsdl
IF NOT EXIST %wsdl% (
        REM wsdl文件不存在则报错退出
	ECHO NOT FOUND %wsdl%
	POPD
	EXIT /B 1 
)
REM 第一个命令行参数为-c时生成纯C代码,默认生成C++代码
REM %output% 指定输出路径
REM %suffix% c/c++代码文件后缀
IF "%1" == "-c" (
	SET lanaguage=-c 
	SET output=gsoap_c\
	SET suffix=.c
) ELSE (
	SET lanaguage=-c++
	SET output=gsoap\
	SET suffix=.cpp
)


REM -t 指定自定义类型映射文件(因为我对Data日期类型有特殊处理所以需要个性默认的类型定义映射)
REM -o 指定输出文件夹
REM %lanaguage%指定生成的代码类型(c/c++)
wsdl2h %lanaguage% -t mytypemap.dat -o %output%facedbservice.h %wsdl%

REM %lanaguage%指定生成的代码类型(c/c++)
REM -d 指定输出文件输出路径
REM -C 只生成Client端代码
REM -L 不生成soapClientLib/soapServerLib代码
REM -x 不生成xml示例消息文件 
REM -I 指定import路径
soapcpp2 %lanaguage% -d %output% -C -L -x -pfacedbservice -I%GSOAP_HOME%\gsoap\import;%GSOAP_HOME%\gsoap %output%facedbservice.h


REM 将stdsoap2.h和stdsoap2.cpp/c也一并复制到输出文件夹
copy %GSOAP_HOME%\gsoap\stdsoap2.h %output%
copy %GSOAP_HOME%\gsoap\stdsoap2%suffix% %output%
POPD
ENDLOCAL
[/quote] 嗯嗯,很感谢你,我今天再摸索摸索,我就是用gsoap生成的,我看了你的博客,我们方法大体差不多,中间有一些是差不多的
tomorrow~ 2016-11-19
  • 打赏
  • 举报
回复
引用 9 楼 10km的回复:
[quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果
tomorrow~ 2016-11-19
  • 打赏
  • 举报
回复
引用 8 楼 10km的回复:
前阵子正好搞过c++ webservice开发,我来说一下。 用gsoap是目前应用最广泛也最方便的c++ webservice解决方案, 使用gsoap来开发webservice应用,你基本不用关心xml解析网络通信这些乱七八糟的事儿,gsoap在底层都实现了,你只需要像普通api一样调用gsoap生成的函数就可以了。 关于gsoap,网上有无数教程可以看,入门很快的。 我也写过几篇关于gsoap的博客,参见《gsoap入门:C/C++代码生成及编译》
嗯嗯要去看看,学习啊
10km 2016-11-19
  • 打赏
  • 举报
回复
引用 6 楼 CSDN______ 的回复:
返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
如果上面的代码是用gsoap生成的,那么,_ns1__dataResponse中的_return成员就是返回值,不需要再xml解析 参见我的gsoap调用代码:
std::vector<ns4__CodeInfo *> detectFace(uint8_t *pImgData,size_t nSize) {
	soap soap;
	//soap_register_plugin(&soap, plugin);

	_ns1__sdk_USCOREdetectFace param;
	_ns1__sdk_USCOREdetectFaceResponse ret;

	xsd__base64Binary b;
	b.soap = &soap;
	b.__ptr = pImgData;
	b.__size = (int)nSize;
        // 设置调用参数
	param.imgData = &b;
       // 调用gosap生成代码实现Webservice调用
	soap_call___ns1__sdk_USCOREdetectFace(&soap, soap_endpoint, NULL, ¶m, ret);
       // 判断调用是否成功,如果不为SOAP_OK则进行错误处理,成功则返回结果(数组)
	if (soap.error != SOAP_OK) {
		soap_fault(&soap);
		SOAP_ENV__Detail* detail = getFaultDetail(soap);
		if (detail) {
			if (detail->ns1__FaceDbServiceDeleteImgFail) {
				std::cout << "FaceDbServiceDeleteImgFail:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceDuplicateReord) {
				std::cout << *detail->ns1__FaceDbServiceDuplicateReord->DuplicateReord->message << std::endl;
			}
			else if (detail->ns1__FaceDbServiceImageError) {
				std::cout << "FaceDbServiceImageError:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceNotFaceDetected) {
				std::cout << "FaceDbServiceNotFaceDetected:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceNotFoundBean) {
				std::cout << "FaceDbServiceNotFoundBean:" << *soap_faultdetail(&soap) << std::endl;
			}
			else if (detail->ns1__FaceDbServiceServiceRuntime) {
				std::cout << *detail->ns1__FaceDbServiceServiceRuntime->ServiceRuntime->serverStackTraceMessage << std::endl;
			}
			else {
				const char* ptr = *soap_faultdetail(&soap);
				if (ptr)
					std::cout << ptr << std::endl;
				ptr = *soap_faultstring(&soap);
				if (ptr)
					std::cout << ptr << std::endl;
			}
		}
	}
        //  返回结果
	return ret.return_;
}
引用 13 楼 CSDN______ 的回复:
[quote=引用 12 楼 10km的回复:][quote=引用 11 楼 tomorrow~的回复:][quote=引用 9 楼 10km的回复:][quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote] 不知道你gsoap生成代码的方式是怎样的 但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote] 我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢[/quote] 下面是我生成gsoap C/C++代码的完整批处理脚本供你参考. gsoapgen.bat

ECHO OFF
SETLOCAL
REM bat所在路径(%~dp0)为工作路径
SET work_dir=%~dp0
PUSHD %work_dir%
REM 定义gsoap根路径
SET GSOAP_HOME=gsoap-2.8
REM 将gsoap编译器加入搜索路径
SET PATH=%GSOAP_HOME%\gsoap\bin\win32;%PATH%
REM 定义wsdl文件位置
SET wsdl=..\webservice\build\wsdl\FaceDbService.wsdl
IF NOT EXIST %wsdl% (
        REM wsdl文件不存在则报错退出
	ECHO NOT FOUND %wsdl%
	POPD
	EXIT /B 1 
)
REM 第一个命令行参数为-c时生成纯C代码,默认生成C++代码
REM %output% 指定输出路径
REM %suffix% c/c++代码文件后缀
IF "%1" == "-c" (
	SET lanaguage=-c 
	SET output=gsoap_c\
	SET suffix=.c
) ELSE (
	SET lanaguage=-c++
	SET output=gsoap\
	SET suffix=.cpp
)


REM -t 指定自定义类型映射文件(因为我对Data日期类型有特殊处理所以需要个性默认的类型定义映射)
REM -o 指定输出文件夹
REM %lanaguage%指定生成的代码类型(c/c++)
wsdl2h %lanaguage% -t mytypemap.dat -o %output%facedbservice.h %wsdl%

REM %lanaguage%指定生成的代码类型(c/c++)
REM -d 指定输出文件输出路径
REM -C 只生成Client端代码
REM -L 不生成soapClientLib/soapServerLib代码
REM -x 不生成xml示例消息文件 
REM -I 指定import路径
soapcpp2 %lanaguage% -d %output% -C -L -x -pfacedbservice -I%GSOAP_HOME%\gsoap\import;%GSOAP_HOME%\gsoap %output%facedbservice.h


REM 将stdsoap2.h和stdsoap2.cpp/c也一并复制到输出文件夹
copy %GSOAP_HOME%\gsoap\stdsoap2.h %output%
copy %GSOAP_HOME%\gsoap\stdsoap2%suffix% %output%
POPD
ENDLOCAL
10km 2016-11-19
  • 打赏
  • 举报
回复
引用 13 楼 tomorrow~的回复:
[quote=引用 12 楼 10km的回复:][quote=引用 11 楼 tomorrow~的回复:][quote=引用 9 楼 10km的回复:][quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote] 不知道你gsoap生成代码的方式是怎样的 但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote] 我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢[/quote] 不知道你的WSDL内容 没办法判断, 但是我好像有印象有一次我生成GSOAP代码时填错了参数生成代码好像跟你的类似
tomorrow~ 2016-11-19
  • 打赏
  • 举报
回复
引用 12 楼 10km的回复:
[quote=引用 11 楼 tomorrow~的回复:][quote=引用 9 楼 10km的回复:][quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote] 不知道你gsoap生成代码的方式是怎样的 但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作[/quote] 我用的是网上查的,在cmd里用wsdl2h -o test.h +wsdl地址,生成头文件的这种方法,有的返回值定义的是string的,我用cout<<*Response.result来显示返回值是成功的,但这个返回值类型是我前面发的那样,它的类型是一个类名定义的,而这个类又定义了两个char *的参数。你是用的哪种方法呢
10km 2016-11-19
  • 打赏
  • 举报
回复
引用 11 楼 tomorrow~的回复:
[quote=引用 9 楼 10km的回复:][quote=引用 6 楼 CSDN______ 的回复:] 返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?[/quote] 对,就是的,在这里卡了有很长时间,我把所有能想到的变量列出来监视,仍然无果[/quote] 不知道你gsoap生成代码的方式是怎样的 但是我生成的gsoap代码的返回对象xxxxRespone中_return就是解析好的返回值,没有再需要自己解析xml的工作
tomorrow~ 2016-11-18
  • 打赏
  • 举报
回复
返回的定义是
class _ns1__dataResponse{public:
_ns1__dataResponse_dataResult *dataResult;
struct soap soap;}
class _ns1__dataResponse_dataResult{public:
char *a;
char *b;}
怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
10km 2016-11-18
  • 打赏
  • 举报
回复
引用 6 楼 CSDN______ 的回复:
返回的定义是 class _ns1__dataResponse{public: _ns1__dataResponse_dataResult *dataResult; struct soap soap;} class _ns1__dataResponse_dataResult{public: char *a; char *b;} 怎么去把这个char*的内容存下来呢,去解析,tinyxml的库我下了,然后试着去分析没成功
楼主的gsoap是生成的c接口吧?
10km 2016-11-18
  • 打赏
  • 举报
回复
前阵子正好搞过c++ webservice开发,我来说一下。 用gsoap是目前应用最广泛也最方便的c++ webservice解决方案, 使用gsoap来开发webservice应用,你基本不用关心xml解析网络通信这些乱七八糟的事儿,gsoap在底层都实现了,你只需要像普通api一样调用gsoap生成的函数就可以了。 关于gsoap,网上有无数教程可以看,入门很快的。 我也写过几篇关于gsoap的博客,参见《gsoap入门:C/C++代码生成及编译》
赵4老师 2016-11-18
  • 打赏
  • 举报
回复
百度相关关键字。比如“CPP源代码 tinyxml”
linlinxi007 2016-11-17
  • 打赏
  • 举报
回复
返回应该是char* 或const char*吧。可以直接存到string里。至于如何解析,可以用libxml或tinyxml这种第三方库解析具体字段。
tomorrow~ 2016-11-17
  • 打赏
  • 举报
回复
大家帮帮忙啊,有没有遇到这个的,讲讲方法思路也很好啊
赵4老师 2016-11-16
  • 打赏
  • 举报
回复
只是建议,具体还需要自己参考相关博文和代码编译链接调试。
tomorrow~ 2016-11-16
  • 打赏
  • 举报
回复
它返回的是xml文档还是xml文档里面的内容呢
赵4老师 2016-11-16
  • 打赏
  • 举报
回复
使用XMLparse

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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