gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm

来源:互联网 发布:熊猫加速器mac版 编辑:程序博客网 时间:2024/06/15 14:07

typemap.dat的作用

在使用wsdl2h生成.h文件时,有一个参数-t 用于指定typemap.dat,如果你不指定这个参数,wsdl2h也能正常执行,后续soapcpp2也能正常生成c/c++代码.那么这个typemap.dat有什么用呢?

根据gsoap官网的解释,typename.dat是类型映射定义文件,用于定义schema 类型和c/c++类型的之间的对应关系,比如:
xsd:string对应c++的std::string,
xsd:xsd__double对应c/c++中的double
。。。

这些显而易见的类型映射都不需要我们手工指定。所以你在执行wsdl2h时即使不指定-t参数,wsdl2h会使用默认的typemap.dat,也能将schema 类型转换c/c++类型。
$gsoap/gosap/typemap.dat就是wsdl2h使用的默认类型映射文件。
打开这个文本文件,有详细的说明。内容太长就不全部贴出来了,根据说明,我们可以通过修改这个文件,改变schema 类型和c/c++ 类型之间默认的映射关系 。

将xsd:date映射为struct tm

现在就以xsd:date为例,来说说如何自定义typemap.dat

如果你的webservice接口中有传递xsd:date类型的数据,当你不加-t参数执行wsdl2h并用soapcpp2生成c++代码时。你会发现xsd:date类型的数据默认被转成了std::string类型。(我们的webservice是基于java的axis2。所以java.util.Date对象自动被映射成了xsd:date。到了gsoap客户端就成了std::string

如果你希望gsoap在进行数据序列化和反序列化时自动将xsd:date转为c/c++标准的struct tm结构,就需要修改或自定义typemap.dat,重新生成c/c++代码。具体的步骤如下。

修改typemap.dat

打开$gsoap/gosap/typemap.dat,搜索”xsd:date”找到下面这段被#注释的文本,如下图删除注释符。
这里写图片描述

参见《8.2 Customizing Data Bindings With The typemap.dat File》
typemap.dat就算修改完了,你可以将这一行保存到一个新文件中,也可以保存修改直接在后续使用这个文件。

重新生成c/c++代码

执行wsdl2h编译生成.h文件,用-t参数指定刚才修改的typemap.dat文件,我在这里是将修改的那一行数据保存到新文件mytypemap.dat

wsdl2h -t mytypemap.dat -o facedbservice.h http://gdface.wicp.net:15865/axis2/services/FaceDbService?wsdl

执行soapcpp2生成c/c++代码:

soapcpp2 -C -L -x -pfacedbservice -IJ:\gsoap-2.8\gsoap\import;J:\gsoap-2.8\gsoap facedbservice.h

这里-I参数指定了J:\gsoap-2.8\gsoap为gsoap的安装路径,这样,soapcpp2在编译的时候才能找到xsd__date = #import "custom/struct_tm_date.h" | xsd__date 中指定的$gsoap/gsoap/custom/struct_tm_date.h文件

$gsoap/gsoap/custom/struct_tm_date.c复制到你的项目代码目录下,并添加到工程文件中。
这里写图片描述
注意:
如果你生成的是c++代码,那么这个文件的后缀要改为cpp,否则会因为与#include 头文件中的c++定义冲突而无法编译

如果你在执行soapcpp2时使用了-p<prefix>参数,那么请打开struct_tm_date.cpp,如下图将#include <soapH.h>修改为#include <<prefix>H.h>
这里写图片描述

如果你的webservice处理xsd:date类型时没有时区(ZONE)信息,那么要在struct_tm_date.cpp编译选项中加入预处理器宏定义WITH_NOZONE(/D "WITH_NOZONE"),否则会因无法解析xsd:date类型的字符串而在运行时报错。
参见《9.11 Library Build Flags》
这里写图片描述
然后你就可以正常编译并使用gsoap的webservcie调用啦!

包含时间的xsd:date

按照schema标准,xsd:date类型的数据只包含日期,没有时间。如果你的webservice服务器进行了定制改装,xsd:date类型是包含完整的日期时间信息的(“yyyy-MM-dd’T’HH:mm:ss.SSSZ),(参见我的另一篇博客《解决axis2处理java.util.Date类型对象时丢弃时间部分的问题》),那么gsoap用struct_tm_date.c解析xsd:date类型的数据返回的struct tm结构中没有时间部分的信息。
解决这个问题的办法是struct_tm.c来代替struct_tm_date.c
将typemap.dat中的类型映射从

xsd__date = #import "custom/struct_tm_date.h" | xsd__date

改为

xsd__date = #import "custom/struct_tm.h" | xsd__dateTime

然后其他步骤如前一样如法炮制就可以了。
这里写图片描述

参考资料:
《XSD 日期及时间数据类型(Date and Time Data Types)》http://www.w3school.com.cn/schema/schema_dtypes_date.asp

0 0
原创粉丝点击