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
- gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm
- 字符串转为Date类型
- String转为Date类型
- SpringMVC映射Date类型
- js string转为date类型
- 将String类型Date
- 将string转为HtmlElement类型
- 将Entity转为Map类型
- 如何将IntPtr类型转为Image类型
- 将String类型转为int类型
- 将任意类型转为number类型
- 使用org.eclipse.xsd.XSDEnumerationFacet生成枚举类型的Schema
- json返回date类型转为字符串
- DB2中将date类型转为字符串
- json返回date类型转为字符串
- esayui时间Date转为String类型
- time_t和struct tm类型的相互转换
- C++的time_t 和 struct tm 类型【s
- Linux命令行与shell编程笔记 第10章
- 几种情况下Activity的生命周期
- android布局属性汇总
- 通过ServletContext实现Servlet之间共享数据
- PS基础及选框工具笔记(CS6)
- gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm
- bzoj2151(贪心,stl->堆和pair
- 从头到尾解析Hash 表算法
- The object of type 'RectTransform' has been destroyed but you are still trying to access it
- View去锯齿,在有些机器需要在图层的软件层才能实现
- 简单实现标题栏悬浮状态,使用PullToRefreshListView上拉加载下拉刷新
- mac电脑中javaweb不用odbc来连接access 数据库
- 史上最全的英语连读规则一网打尽
- hdu 1849 Rabbit and Grass(Nim博弈入门)