c语言字符串转换xml文件名,使用Tuxedo将C语言中的结构体转换成Xml格式的字符串...

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文件内容的截图,

0818b9ca8b590ca3270a3433284dd417.png

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

类型分别是string,long和string。

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

该文件中的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文件内容

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

2.2  示例代码

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

0818b9ca8b590ca3270a3433284dd417.png

packEmpdata.c代码如下

0818b9ca8b590ca3270a3433284dd417.png

关键代码说明:

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中的值都打印出来,如下图所示

0818b9ca8b590ca3270a3433284dd417.png

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值