前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm

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

作者头像
10km
发布2019-05-25 22:01:40
1.1K0
发布2019-05-25 22:01:40
举报
文章被收录于专栏:10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433576

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中的类型映射从

代码语言:javascript
复制
xsd__date = #import "custom/struct_tm_date.h" | xsd__date

改为

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年08月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • typemap.dat的作用
  • 将xsd:date映射为struct tm
    • 修改typemap.dat
      • 重新生成c/c++代码
        • 包含时间的xsd:date
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档