gSoap实现ONVIF中xsd__anyType到具体结构类的转换

上一篇文章已经粗略计划要讨论gsoap关于序列化/解析编程。

本文则阐述一下关于gsoap生成代码的一些重要特征方法及使用。如题,下我们从ONVIF生成的C码中,挑选简单的一个类型来试验一下与xsd__anyType之间的转换。这个试验如此重要,主要是因为,在之前我真的拿生成代码的相关结构的的一些__any字段没有办法。虽依据ONVIF文档,以及实际交互观测的XML结构中可知明明是已知的标准结构,却无奈生成被解析成any字段,主要是可能这部分字段可由厂商决定填充哪些扩展意义的结构。

简单试验

本次试验选_trt__GetProfile结构作转换例程,主要理由是这个结构实在简单,只含有一个字段;书写初始化简单。

struct _trt__GetProfile

#soapStub.h

#ifndef SOAP_TYPE__trt__GetProfile
#define SOAP_TYPE__trt__GetProfile (1365)
/* trt:GetProfile */
struct _trt__GetProfile
{
	char *ProfileToken;	/* required element of type tt:ReferenceToken */
};
#endif

头部概览与FD操作

#include "inc.h"
typedef struct soap *soap_pointer;
#include "soap.nsmap"

// anyType
int anyType_ready(void)
{
	return open("anyType.xml", O_RDWR|O_CREAT, S_IWUSR|S_IRUSR);
}
int FD_set(int* FD, int fd)
{
	int ret = *FD; *FD = fd;
	return ret;
}

注:inc.h是自组织的部分所需头依赖;

后面包含了soap.nsmap文件,你懂的,里面解开可以可以依次了解清楚包含与依赖关系;

soap.nsmap < soapH.h < soapStub.h < stdsoap2.h

主流程 main()

static xsd__anyType* _trt__GetProfile2anyType(soap_pointer soap_, struct _trt__GetProfile* p_, xsd__anyType* _any);
static struct _trt__GetProfile*
_trt__GetProfile_from_anyType(soap_pointer soap_, struct _trt__GetProfile* _p, xsd__anyType* _any);

int main(int argc, char const *argv[])
{
	/* code */
	struct soap soap;
	soap_pointer soap_ = &soap;
	soap_init(soap_);
	struct _trt__GetProfile Data = {"Profile0"};
	xsd__anyType Dom; soap_default_xsd__anyType(soap_, &Dom);
	if (_trt__GetProfile2anyType(soap_, &Data, &Dom))
	{
		soap_default__trt__GetProfile(soap_, &Data);
		if (_trt__GetProfile_from_anyType(soap_, &Data, &Dom))
			printf("Data >%s", Data.ProfileToken);
	}
	soap_end(soap_);soap_done(soap_);
	return 0;
}

具体转换实现

xsd__anyType* _trt__GetProfile2anyType( soap_pointer soap_, struct _trt__GetProfile* p_, xsd__anyType* _any )
{
	int fd = anyType_ready();
	bool b = (fd == -1);
	if (b) return NULL;
	do {
		int* FD = &(soap_->sendfd);
		fd = FD_set(FD, fd);
		b  = (soap_write__trt__GetProfile(soap_, p_) != SOAP_OK);
		fd = FD_set(FD, fd);
		b &= (lseek(fd, 0, SEEK_SET) == -1);
		if (b) break;
		FD = &(soap_->recvfd);
		fd = FD_set(FD, fd);
		b  = (soap_read_xsd__anyType(soap_, _any) != SOAP_OK);
		fd = FD_set(FD, fd);
	} while(false);
	close(fd);
	if (b) return NULL;
	return _any;
}
struct _trt__GetProfile* _trt__GetProfile_from_anyType(soap_pointer soap_,
struct _trt__GetProfile* _p, xsd__anyType* _any)
{
	int fd = anyType_ready();
	bool b = (fd == -1);
	if (b) return NULL;
	do {
		int* FD = &(soap_->sendfd);
		fd = FD_set(FD, fd);
		b  = (soap_write_xsd__anyType(soap_, _any) != SOAP_OK);
		fd = FD_set(FD, fd);
		b &= (lseek(fd, 0, SEEK_SET) == -1);
		if (b) break;
		FD = &(soap_->recvfd);
		fd = FD_set(FD, fd);
		b  = (soap_read__trt__GetProfile(soap_, _p) != SOAP_OK);
		fd = FD_set(FD, fd);
	} while(false);
	close(fd);
	if (b) return NULL;
	return _p;
}

参考相关

gSOAP 2.8.11 User Guide

7.5.3 Serializing C/C++ Data to XML

You can assign an output stream to soap.os or a le descriptor to soap.sendfd. For example

soap.sendfd = open(file, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR);
soap_serialize_PointerTons_Person(&soap, &p);
soap_begin_send(&soap);
soap_put_PointerTons_Person(&soap, &p, "ns:element-name", "ns:type-name");
soap_end_send(&soap);

The above can be abbreviated to

soap.sendfd = open(file, O_RDWR|O_CREAT, S_IWUSR|S_IRUSR);
soap_write_PointerTons_Person(&soap, &p);

gSoap生成代码的重要使用特征

时间: 2024-11-04 16:10:45

gSoap实现ONVIF中xsd__anyType到具体结构类的转换的相关文章

PHP中字符串的heredoc结构和nowdoc结构

最近在维护一个古老的PHP网站,没有前后台的分离,代码看起来很吃力,上面大段大段的HTML输出.在看的时候发现很多地方用了「<<<」这样的符号来标记字符串,好像之前学习PHP的时候,只讲了单双引号两种表示字符串的方式.今天偶然在书上看到了,这种「<<<」表示字符串的方式是heredoc和nowdoc结构. echo <<<EOT <html> <head><title>主页</title></hea

OR1200中指令Cache的结构

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.or1200_ic_tag.v.or1200_ic_ram.v.or1200_spram.v,分别实现了ICache模块.IC_FSM模块.IC_TAG模块.IC_RAM模块.单口RAM.在ICache中例化了IC_FSM.IC_TAG.IC_RAM模块,在IC_TAG.IC_RAM模块中例化了单口RAM.如图

数据库中的三级模式结构

模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,又称概念模式或概念视图.视图可理解为一组记录的值,用户或程序员看到和使用的数据库的内容. 模式处于三级结构的中间层,它是整个数据库实际存储的抽象表示,也是对现实世界的一个抽象,是现实世界某应用环境(企业或单位)的所有信息内容集合的表示,也是所有个别用户视图综合起来的结果,所以又称用户共同视图. 所谓模式是指用数据描述语言精确定义的数据模型.数据模式的三个层次:外部层.概念层和内部层,构成数据库系统的三级模式结构,不管数据库管理系统的功

iOS中UITabelView的层级结构

在iOS7以前,iOS中UITabelView的层级结构 IOS6:(your view)-> UITableViewContentView-> UITableViewCell-> UITableView 在iOS7以后,iOS中UITabelView的层级结构 IOS7:(your view)-> UITableViewCellContentView-> UITableViewCellScrollView-> UITableViewCell-> UITableV

在IOS开发中,项目的目录结构如何搭建?

网上有很多关于IOS开发的学习资料.然而却很少有关于设计一个项目时,如何设计其目录结构?这对于自学IOS的程序猿们,无疑有诸多不利.接下来,我就简单的谈下真正在公司中,项目的目录结构如何搭建: 以上为第一种,先按照功能模块进行划分,然后遵循MVC设计模式,分别设置model,view,control子文件夹.对于非项目模块类,以及一些自己写的一些分类,第三方框架等等,存储在other中,如上图所示. 至于另外一种方案,则是先以MVC进行划分,然后针对于model,view,control,进行子

C语言中的系统时间结构体类型

在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time.h 中: #define _TIME_T       typedef   long   time_t;             #endif 函数定义:time_t   tim

Linux中表示“时间”的结构体和相关函数

转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示“时间”的结构体和相关函数 2011-09-13 17:01:13 分类: C/C++ 在Linux系统中,表示“时间”概念的结构体有多个,相关的时间处理函数也有很多,给人以很混乱的感觉.导致了当我们真正要使用这些结构体和函数的时候,却不知道到底该用哪个结构体和哪些函数.有必要加以归纳总结一下.通过查看头文件/usr/include/time.h 和 /usr/i

DropDownList中显示无限级树形结构

效果图: 数据库表: DirID:目录的ID,ParentID:目录的父路径ID,Name:目录的名字主要代码: using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlContr

用命令从mysql中导出/导入表结构及数据

在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo table1 table2 > foo.sql这样就可以将数据库databasefoo的表table1,table2以sql形式导入foo.sql中,其中-uroot参数表示访问数据库的用户名是root,如果有密码还需要加上-p参数Eg: C:\Users\jack> mysqldump -uroo