使用Tuxedo将C语言中的结构体转换成Xml格式的字符串
----使用Tuxedo10gR3的API进行的开发,我的邮箱是
changpeng999@163.com欢迎指正文中的错误,谢谢,
转载请注明
1.概述
1.1XML语言
在百度百科中XML(Extensible markup language)可扩展标记语言的定义是:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
举一个XML字符串的实例:
<trans>
<trans_no>9999</trans_no> <trans_date>20130301</trans_date> <trans_time>001225</trans_time> <trans_amount>999</trans_amount> <dtlinfo> <card_type>credit</card_type> <card_no>888888888</card_no> <acc_name>zhangsan</acc_name> </dtlinfo> </trans>
XML具有自描述性,其标签没有被预定义,这样使得其可以存储的信息的扩展性很强,我觉得在信息交换方面很有用;其次XML的结构是可以嵌套的,由各个形成树状。
1.1 C结构体
C语言中的结构体同样能够完成XML所实现的功能,但是其是一种语言中的数据类型,必须通过C语言的函数和语法来进行操作。在项目中有时我们会从外部接收到XML格式的数据或者向外发送XML格式的数据,需求要求我们将C结构体所存储的数据以XML格式的形式体现出来,Tuxedo中的FML(Field Manipulation 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,EMPID和EMPJOB,对应的数据
类型分别是string,long和string。
命令mkfldhdr32会根据域表文件empdataflds生成域头文件empdataflds.h
下图是source viewfile empdata.v的所有内容
该文件中的CNAME分别有empname,empid和empjob,CNAME表示view中的数据成员对应的C结构体中的数据域名称。FNAME是CNAME所对应的域名称,empname对应于EMPNAME,empid对应于EMPID以及empjob对应于EMPJOB。
使用Tuxedo中的viewc32命令对根据empdata.v文件生成empdata.V和empdata.h文件,其内容分别是
Empdata.h文件内容
empdata.V是一个二进制文件,使用file命令查看
可以看出empdata.V是一个二进制文件,而empdata.v是一个文本文件。
FML函数会根据以上的域头文件empdataflds.h、目标viewfileempdata.V和empdata.h进行C结构到Fielded Buffer域缓冲的转换(Fvstof32()函数)。
C语言结构体------->域缓冲Fielded Buffer--------->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",XMLMAXSIZE);调用tpalloc()来分配XML
类型的缓冲区,其大小为XMLMAXSIZE,其为宏定义,大小是4096字节.。
44行:
tpfml32toxml((FBFR32*)fmlbuf,"EmpData",(char**)&xml_buf,0);将FML32类型的
缓冲fmlbuf中的数据转换成XML格式的字符串,保存在xml_buf中。
3.参考资料
《TUXEDO 系统经典》 经乾
Tuxedo10gr3的官方文档,该文档可在Oracle官方文档下载。