使用Tuxedo将C语言中的结构体转换成Xml格式的字符串

使用Tuxedo将C语言中的结构体转换成Xml格式的字符串

      ----使用Tuxedo10gR3的API进行的开发,我的邮箱是[email protected],欢迎指正文中的错误,
谢谢,转载请注明
该文档的pdf版本我已经上传至百度文库,网址是http://wenku.baidu.com/view/7e1b6d0d376baf1ffd4fad08.html
大家可以去该网址下载该文档

1. 概述

1.1  XML语言

在百度百科中XML(Extensible markup language)可扩展标记语言的定义是:用于标记

电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

         举一个XML字符串的实例:

        

                  9999

                   20130301

                   001225

                   999

                  

                            credit

                            888888888

                            zhangsan

                  

        

XML具有自描述性,其标签没有被预定义,这样使得其可以存储的信息的扩展性很强,我觉得在信息交换方面很有用;其次XML的结构是可以嵌套的,由各个形成树状。

 

1.2  C结构体

C语言中的结构体同样能够完成XML所实现的功能,但是其是一种语言中的数据类型,必须通过C语言的函数和语法来进行操作。在项目中有时我们会从外部接收到XML格式的数据或者向外发送XML格式的数据,需求要求我们将C结构体所存储的数据以XML格式的形式体现出来,Tuxedo中的FML(FieldManipulation Language域操作语言)就能够完成这个任务。

2. Tuxedo将C结构体转换成XML格式的字符串

2.1  Tuxedo的FML概念

域操作语言(Field Manipulation Languages或者FML),是一个用来定义和操作被称为域缓

冲存储结构的C语言函数集合,域缓冲的域(filed)中包含了属性—值(attribute-value)对。属性是域的标识符,其对应的值包含了域的数据内容。

         通过对相关域的集合提供一个有名访问(named access),域缓冲为不同进程间的参数化的数据通信提供了一个非常好的结构。需要同其他进程通信的程序可以使用FML软件来提供对域的访问而不需要考虑包含这些域的结构。

         FML也提供了一个叫做VIEWS的工具,其允许你将域缓冲映射到C语言的结构体或者COBOL中的records,反之亦然。VIEWS工具使你执行冗长的数据操作在结构体中进行而不是在域缓冲中进行;如果数据被传输至结构体中来进行操作,应用程序能够运行的更快。因此,VIEWS工具将域缓冲中的数据独立性和经典的结构体(record structures)的效率和简洁联系在了一起。

下面是域表文件empdataflds文件内容的截图,


该文件定义了三个域,它们的域名称分别是EMPNAME,EMPIDEMPJOB,对应的数据

类型分别是string,longstring

        命令mkfldhdr32会根据域表文件empdataflds生成域头文件empdataflds.h


下图是source viewfile empdata.v的所有内容


该文件中的CNAME分别有empname,empidempjobCNAME表示view中的数据成员对应的C结构体中的数据域名称。FNAMECNAME所对应的域名称,empname对应于EMPNAMEempid对应于EMPID以及empjob对应于EMPJOB

        使用Tuxedo中的viewc32命令对根据empdata.v文件生成empdata.Vempdata.h文件,其内容分别是

empdata.h文件内容

empdata.V是一个二进制文件,使用file命令查看


可以看出empdata.V是一个二进制文件,而empdata.v是一个文本文件。

FML函数会根据以上的域头文件empdataflds.h、目标viewfileempdata.Vempdata.h进行C结构到FieldedBuffer域缓冲的转换(Fvstof32()函数)。

C语言结构体------->域缓冲FieldedBuffer--------->XML格式字符串


2.2  示例代码

packEmpdata.c将empdata类型的结构体数据转换成XML格式字符串,运行结果如下图所示


packEmpdata.c代码如下

关键代码说明:

29行:

fmlbuf = (char*)tpalloc((char*)”FML32”, NULL,XMLMAXSIZE);会分配FML32类型的缓冲区。其大小为XMLMAXSIZE,其为宏定义,大小是4096字节.

33行:

Fvstof32((FBFR32*)fmlbuf, (char*)pempdata,FUPDATE, "empdata");会将C结构体指针pempdata所指向的结构体tom转换成为域缓冲Fielded Buffer(empdata.v文件中说明了C结构体中的各个域同域名称的映射关系),转换后的域缓冲保存到fmlbuf中。

38行:

Fprint32((FBFR32*)fmlbuf);会把fmlbuf中的值都打印出来,如下图所示


40行:

char *xml_buf =(char*)tpalloc((char*)"XML", NULL, XMLMAXSIZE);调用tpalloc()来分配XML类型的缓冲区,其大小为XMLMAXSIZE,其为宏定义,大小是4096字节.。

44行:

tpfml32toxml((FBFR32*)fmlbuf, NULL,"EmpData", (char**)&xml_buf, 0);将FML32类型的缓冲fmlbuf中的数据转换成XML格式的字符串,保存在xml_buf中。

3.  FML的一些函数翻译(平时工作太忙,有时间进行翻译然后在补充上来)

3.1    tpalloc()

3.2    Fvstof32()

3.3    tpfml32toxml()

3.4    Falloc32()




你可能感兴趣的:(C语言,XML,Tuxedo,结构体)