分类: LINUX
2009-08-27 15:08:40
gSOAP 2.7.11 用户指导
Robert
van Engelen
Florida State University
and Genivia,
Inc.
engelen@acm.org
2009年3月17日
1.4 XML C/C++ 数据绑定:影射WSDL和XSD到C/C++
gSOAP
允许任何的C/C++数据类型转换成XML,反之亦然(极少例外)。同样地,一个XML
schema(XSD
文件)能被转换成一系列C/C++
的定义性文件,这些文件很容易被包含进你的应用软件中,从而让你对XML的操作比在DOM或者SAX更方便。实际上,每个在XML
schema定义的XML元素都有一个相对应的C/C++数据类型。在XML
Schema的XML元素和类成员之间被创建一个自动映射用来存储这些数据到内存中。不需要定义DOM遍历和SAX事件。另外,XML和C/C++
数据邦定使得XML操作更安全。换句话说,这类安全只需要确保XML文档能被解释和创建。
我们用一个简单的例子来演示。假如我们有一个书的记录的XML文档:
用来把上面的XML文档映射到一个C/C++类的自然选择应该是这个样子的:
class
book
{
@ULONG64 isbn;
std::string title;
std::string publisher;
}
注意:@是用来定义元素属性的。
上面的XML文档对应的XML
Schema :
要创建C 或C++这种模式数据绑定的wsdl2h工具转换XSD文件到C/C++的定义,类似的例子C++声明代码如上所示。编译器soapcpp2然后生成所有代码来分析,并为这本书的对象生成XML。如minOccurs="1"和use="required" 的验证检查包含在生成的代码。
要生成一本有很好缩进的书,首先创建一个SOAP引擎和使用它的soap_put方法(用soapcpp2生成)去发送这个作为XML“书”的标签标的对象到标准输出:
soap
*ctx = soap_new1(SOAP_XML_INDENT); // new context with option
book
bk;
bk.isbn = 1234567890;
bk.title = "Farewell John
Doe";
bk.publisher = "ABC's is our Name";
soap_begin_send(ctx);
bk.soap_put(ctx, "book",
NULL);
soap_end_send(ctx);
soap_end(ctx); // clean up
allocated temporaries
soap_free(ctx); // delete context
ctx
gSOAP 引擎(structg
soap 类型)控制设置和状态,例如xml格式,(例如:SOAP_XML_INDENT)序列化选项,当前状态,和I/O设置。简单地设置上下文输出流(std::ostream)ctx->os,重定向内容,例如:到文件或字符串。此外,当序列化一个图表,在代码调用soap_put方法以确保输出符合对象图的SOAP编码(你也可以使用一个基于id-ref的编码)之前,先在对象或类型上调用串行器bk.soap_serialize(ctx)。细节见7.5节
解析典型的xml成为一本书对象,用:
soap
*ctx = soap_new1(SOAP_XML_STRICT); // new context with option
book
bk;
soap_begin_recv(ctx);
bk.soap_get(ctx,
"book", NULL);
if
(ctx->error == SOAP_OK) cout << bk.isbn << ",
" << bk.title << ", " <<
bk.publisher << endl;
//...
further use of bk ...
soap_end_recv(ctx);
soap_destroy(ctx);
// delete deserialized objects
soap_end(ctx);
// delete temporaries
soap_free(ctx);
// delete context
自动内置的XML验证,确保数据成员存在,所以在这个例子中我们可以放心地打印他们,从而确保与XML
Schema 数据的一致性。设置ctx->is输入流来读取一个文件/字符串流,而不是标准输入。
soap_destroy和soap_end用于释放反序列化的内容,所以请小心使用。一般来说,gSOAP为了避免内存泄漏,内存管理是自动的。
以上是一个简单的例子。在gSOAP工具包通过用户定义的定制序列来处理指针类型数据结构(包括循环图表!),结构/类,联合体,枚举,STL容器,甚至特殊的数据类型像stuct
tm
通常的XML命名空间的命名空间前缀添加到C/C++类型定义,以确保类型的唯一性。例如,如果我们将结合在同一个应用程序同时在两个模式架构定义了一本书的对象,我们需要解决这一冲突。在gSOAP这是使用命名空间前缀,而不是C++命名空间(研究指出,XML命名空间不等于C
+ +的命名空间)。因此,这本书类,其实可能已绑定到XML命名空间和类将被命名为ns__book,其中ns绑定到相应的命名空间。
更多关于序列化信息的C/C++的数据类型可以参考7.5节。