基于imx6 的gsoap的简单使用(包含libxml2,libiconv的简单使用)

本文介绍了gsoap的简单使用 包含xml的解析 ,编码格式的转换等:

soap 获取服务器数据:


int get_info( server_info *sys_info, struct _tempuri__queryObjectOut *queryObject,struct _tempuri__queryObjectOutResponse *result_res)
{
    char *result;
    char server[MAX_PATH];
    struct soap soap; 
	char *temp;
	char param[MAX_PATH];
	char str[20];

	static int count = 0;
	free_queryObject(queryObject);
	strncpy(str,sys_info->sn,10);  // 去掉换行
	// 填写上传的xml 请求参数  
	strcpy  (param,"<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n");
	strcat  (param,"<root>\r\n");
	strcat  (param,"   <QueryCondition>\r\n");
	strcat  (param,"       <SN>");
	//strcat  (param,str);
	strcat  (param,"123456");	
	strcat  (param,"</SN>\r\n");		
	strcat  (param,"   </QueryCondition>\r\n");	
	strcat  (param,"</root>");		
	
    queryObject->xtlb      	= strdup("xx");
    queryObject->jkxlh    	= strdup("x'x'x");
    queryObject->jkid 		= strdup("x'x'x");
	queryObject->xmlDoc 	= strdup(param);

	//fprintf(stderr, "queryobjecet---param:%s\n",param);
    soap_init1(&soap,SOAP_C_UTFSTRING);//SOAP_C_UTFSTRINGSOAP_XML_INDENT // soap init
    if (soap.error) 
	{
		printf("soap error!!! \n");
        soap_print_fault(&soap, stderr);
        //exit(1);					// 
		return 1;     //  saop 初始化错误
    }
	
	//fprintf(stderr, "queryobjecet:%s\n",queryObject->xmlDoc);
	//fprintf(stderr, "queryobjecet:%s\n",queryObject->jkxlh);
	//only for test
	sys_info->server_port = 8089;
	snprintf(sys_info->server_ip, MAX_PATH, "10.0.5.46");
	snprintf(server, MAX_PATH, "http://%s:%d/TmriOutAccess.svc?singleWsdl",sys_info->server_ip, sys_info->server_port);
	//fprintf(stderr, "queryobjecet--server:%s\n",server);

    soap_call___tempuri__queryObjectOut(&soap,
										server,
										"http://tempuri.org/ITmriOutAccess/queryObjectOut",
										queryObject,
										result_res
										);

    if (soap.error) 
	{
		printf("soap error after send !!! \n");
        soap_print_fault(&soap, stderr);
        //exit(1);
        soap_destroy(&soap);
    	soap_end(&soap);
    	soap_done(&soap);
		free_queryObject(queryObject);
        return 2; // soap 执行返回错误 
    }   
	fprintf(stderr, "test loop times = %d\n",count++);
	//fprintf(stdout,"soap result %s\n",result_res->queryObjectOutResult);
	soap_destroy(&soap);
    soap_end(&soap);
    soap_done(&soap);
	int return_value = message_handle_query(sys_info,result_res);
	fprintf(stderr, "test loop  return values  = %d\n",return_value);
	switch(return_value)  //  返回信息处理,提取相关信息
	{
		case 0: break;

		default: ;
	}
    return 0;			// 无错误 返回 0 
}

xml 解析和 格式转换程序:

int message_handle_query(server_info *sys_info,struct _tempuri__queryObjectOutResponse *result_res)
{
	int nXmlSize = 0; 
    xmlDocPtr pstXmlDoc ;
    xmlNodePtr pstXmlNode = NULL;
    xmlNodePtr pstXmlSubNode = NULL;
    char *pszXmlNodeContent = NULL;
	char paramt[MAX_PATH];
	size_t nread;
	size_t nconv;
	size_t  avail = 0;
	size_t insize = 0; 
	char dst[2048] = {0};		//
	
	if(strlen(result_res->queryObjectOutResult)<200)  // 长度不够,认为数据返回错误  
	{
		return 1; // 
	}
	
	char *outbuf = dst;
	char *in = result_res->queryObjectOutResult;
	char *out = outbuf;
	
	size_t dst_len = sizeof(dst);
	size_t src_len = strlen(result_res->queryObjectOutResult);
	iconv_t conv = iconv_open ("utf-8", "gbk");    //格式转换
	if(conv == (iconv_t) -1)
	{
		fprintf(stdout,"conv  error !!!");
		return 2;
	}
	 nconv = iconv(conv,&in,&src_len,&out,&dst_len);
		
	if (nconv == (size_t) -1)
	{
		if (errno == EINVAL)
		{
		  fprintf(stdout,"EINVAL\n");
		}
		else
		{
			fprintf(stdout,"error\n");
		}
		return 3;
	}
	//printf("%s: \n",dst);
	iconv_close (conv);
	//printf("%d: retertret xml\n",nXmlSize);
	nXmlSize = sizeof(dst);
	pstXmlDoc = xmlReadMemory(dst, nXmlSize,NULL,"utf-8",XML_PARSE_RECOVER);
	if(pstXmlDoc == NULL)
	{
		fprintf(stdout,"%s_%d: xmlParseMemory failed\n",result_res->queryObjectOutResult,nXmlSize);
		return 4;
	}
	xmlNodePtr root = xmlDocGetRootElement(pstXmlDoc);
	xmlNodePtr curr = root;
	//success_t++;
	
    //fprintf(stdout,"Node name is %s!\n", root->name);

	xmlNodePtr pFirst = root->xmlChildrenNode;// 获取字节点
	while(NULL != pFirst)
	{
		if(!xmlStrcmp(pFirst->name, (const xmlChar *)("head")))
		{
			xmlNodePtr pSecond = pFirst->xmlChildrenNode;
			while(NULL != pSecond)
			{
				xmlChar* value= NULL;

				if(!xmlStrcmp(pSecond->name, (const xmlChar *)("code")))
				{
					value = xmlNodeGetContent(pSecond);
					//printf("\n%s-->%s\n", pSecond->name, value);
					xmlFree(value);
					value = NULL;
				}
				if(!xmlStrcmp(pSecond->name, (const xmlChar *)("message")))
				{
					value = xmlNodeGetContent(pSecond);
					//printf("\n%s-->%s\n", pSecond->name, value);
					xmlFree(value);
					value = NULL;
				}
				if(!xmlStrcmp(pSecond->name, (const xmlChar *)("rownum")))
				{
					value = xmlNodeGetContent(pSecond);
					//printf("\n%s-->%s\n", pSecond->name, value);
					xmlFree(value);
					value = NULL;
				}
				pSecond = pSecond->next;
			}
		}
		if(!xmlStrcmp(pFirst->name, (const xmlChar *)("body")))
		{
			xmlNodePtr pSecond = pFirst->xmlChildrenNode;
			while(NULL != pSecond)
			{
				if(!xmlStrcmp(pSecond->name, (const xmlChar *)("drvexam")))
				{
					xmlNodePtr pThird = pSecond->xmlChildrenNode;
					while(NULL != pThird)
					{
						xmlChar* value= NULL;
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("SN")))
						{
							value = xmlNodeGetContent(pThird);
							//printf("the size of value = %d \n",sizeof(value));
							snprintf(sys_info->sn, MAX_PATH,"%s",value);
							//printf("\n%s-->%s\n", pThird->name, sys_info->sn);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("CLXH")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->clxh, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->clxh);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("ZDIP")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->server_ip, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->server_ip);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("SCDK")))
						{
							value = xmlNodeGetContent(pThird);
							sys_info->server_port  = atoi(value);
							//printf("\n%s-->%d\n", pThird->name, sys_info->server_port);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("KCHP")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->car_num, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->car_num);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("KSDD")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->exam_location, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->exam_location);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("KCXH")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->kcxh, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->kcxh);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("KSKM")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->kskm, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->kskm);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("WG")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->gateway, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->gateway);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("ZWYM")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->netmask, MAX_PATH,"%s",value );
							//printf("\n%s-->%s\n", pThird->name, sys_info->netmask);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("XTXLH")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->xtxlh, MAX_PATH,"%s",value );
							printf("\n%s-->%s\n", pThird->name, sys_info->xtxlh);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("XHPZ")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->xhpz, MAX_PATH,"%s",value );
							printf("\n%s-->%s\n", pThird->name, sys_info->xhpz);
							xmlFree(value);
							value = NULL;
						}
						if(!xmlStrcmp(pThird->name, (const xmlChar *)("SXSJ")))
						{
							value = xmlNodeGetContent(pThird);
							snprintf(sys_info->sxsj, MAX_PATH,"%s",value );
							printf("\n%s-->%s\n", pThird->name, sys_info->sxsj);
							xmlFree(value);
							value = NULL;
						}
						pThird = pThird->next;
					}
				}
				pSecond = pSecond->next;
			}
		}
		pFirst = pFirst->next;
	}
	xmlFreeDoc(pstXmlDoc);
	return 0;
}

本文介绍了,soap的简单使用以及xml文件的解析,格式转换等使用方法,还有比较麻烦的makefile 后面有时间再写。
关于 libxml2 和 libiconv的交叉编译需要自己找博客编译,简单思路就是安装交叉编译器->解压库文件->根据需要配置config文件->执行配置(设置编译后的文件路径)->编译&安装->复制到开发板的相关目录。如果读者有什么需要和建议欢迎留言交流。

上一篇:c – 网络编程:使用XML库进行SOAP与DIY编组?


下一篇:kubernets-RBAC