忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 17890 | 回复: 13

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一 [复制链接]

论坛徽章:
0
发表于 2002-11-04 14:38 |显示全部楼层
我在写一个通讯程序,报文这一块我的想法是通过xml来进行管理,这样可以方便的进行配置和修改。
这个想法的起因是我看到不少银行中间业务平台都能够方便的进行通讯报文的修改和配置。我的这个虽然是个小程序,
但我也想实现这样的功能,为将来的软件发展提供一个较好的体系结构。
最开始我的想法是这样的:
对每一个报文定义类似下面的一个xml结构
<Msg>;
<ID>;1</ID>;
<Type>;1</Type>;
<Name>;签到交易</Name>;
<AnsMsgGrpID>;2</AnsMsgGrpID>;
<Direct>;0</Direct>;
<Fields>;
<Field>;
<ID>;1</ID>;
<Type>;1</Type>;
<DataType>;1</DataType>;
<Name>;续包标志</Name>;
<Len>;1</Len>;
</Field>;
<Field>;
<ID>;2</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;交易码</Name>;
<Len>;4</Len>;
</Field>;
<Field>;
</Field>;
<Fields>;
</Msg>;

对应的,我在程序中定义结束报文配置信息的数据结构如下:
struct typFld
{
intiID&#59;//字段序号
intiType&#59;//字段类型
intiDataType&#59;//字段数据类型 1-字符型;2-网络字节序
char*sFldNm&#59;//字段名称
intiLen&#59;//字段的长度
}

struct typFlds
{
intiCnt&#59;//报文中字段的数目
struct typFld *FldPtr&#59;//在程序中动态分配空间
}

struct typMsg
{
intiMsgID&#59;//报文ID
int iType&#59;//报文类型
char *sMsgNm&#59;//报文名称
int iAnsMsgID&#59;//回应报文的报文ID
int iDirect&#59;//报文的方向,0--传入&#59;1--传出
struct typFlds *FldsPtr&#59;//指向存储各字段的配置信息的存储区域的指针
}&#59;

但是后来我发现报文中有一些特殊情况,采用上面的方式是不能处理的,如:
有一些报文段是需要循环的,具体循环的次数是在程序运行中才能知道的,比如说,用户多个月的欠费明细就是这种情况。
还有,有一些报文段是可能有,可能没有的,比如说:如果用户有欠费,回应报文中就会有用户各月的欠费明细,
如果用户没有欠费,回应报文就只返回一个错误码,而没有任何的欠费明细,这些情况可能会混合起来,我觉得就比较麻烦了,
我上网请教了一些朋友后,目前的思路是这样的:
报文的xml结构如下:
<Msg>;
<ID>;1</ID>;
<Type>;1</Type>;
<Name>;签到交易</Name>;
<AnsMsgGrpID>;2</AnsMsgGrpID>;
<Direct>;0</Direct>;
<Fields>;
<Field>;
<ID>;1</ID>;
<Type>;1</Type>;
<DataType>;1</DataType>;
<Name>;续包标志</Name>;
<Len>;1</Len>;
</Field>;
<Field>;
<ID>;2</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;交易码</Name>;
<Len>;4</Len>;
</Field>;
<While>;
<If>;一个条件表达式<If>;
<Loop>;
<iLpCnt>;iQianFeiMonth</iLpCnt>;
<Field>;
<ID>;3</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;欠费明细</Name>;
<Len>;10</Len>;
</Field>;
</Loop>;
</While>;
<Field>;
</Field>;
<Fields>;
</Msg>;

因为Fields节点中现在有不同的节点了:Field,While,Loop,有些朋友的意见是在Field节点中使用链表的形式。
我考虑了一下,觉得链表的编程太繁琐,还是希望使用数组的形式。编程简单。
对应的程序中的结构修改如下:
struct typFld
{
intiType&#59;//0-报文字段1-循环开始2-循环结束3-条件开始4-条件结束
char*sLpCnt&#59;//循环次数表达式
char *sWhile&#59;//条件表达式

intiID&#59;//字段序号
intiFldType&#59;//字段类型
intiDataType&#59;//字段数据类型 1-字符型;2-网络字节序
char*sFldNm&#59;//字段名称
intiLen&#59;//字段的长度
}

这样定义一个统一的大的结构
当在程序中使用的时候,比如说,根据定义的报文结构读取一个报文时,
如果读到一个&quot;Field&quot;节点,就根据这个节点的属性读取相应长度的字段;
如果读到一个&quot;While&quot;节点,就转化<if>;子节点中的条件表达式,如果表达式为真,就读取while中的其他子节点,如果为假,就跳到<While>;节点的下一个兄弟节点&#59;
如果读到一个&quot;Loop&quot;节点,就根据<iLpCnt>;节点中的表达式的值重复读取<Loop>;中的其他子节点。

我这样的想法如何?有什么不对或者不妥的地方吗?欢迎大家讨论。
我使用的开发环境是sco unix +c +lib2xml
兄弟节点和子节点的查找,遍历方法lib2xml提供了,所以我就不用在结构中定义了
谢谢!

论坛徽章:
0
发表于 2002-11-04 16:13 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

up

论坛徽章:
0
发表于 2002-11-04 16:40 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

你的问题是“xml本地化问题”:即“如何把结构不确定的xml报文导入本地编程语言(如c语言)的结构以便进行操纵”。

解决这一问题的过程包含了两个步骤:
1)把xml文档映射到便于访问内存结构中,这一层次一般由xml开发库提供,与用户应用无关,用户程序可以通过该结构及其操纵函数,遍历/操纵xml文档,这一层次一般无需用户程序干预,只需要简单的指定xml文档即可完成:(在libxml2中, http://xmlsoft.org)
xmlDocPtr doc&#59;
doc = xmlParseFile(filename)&#59;
接下来即可对doc指针进行操纵。

2)遍历上述doc指针,取得应用所需的信息,填写应用相关结构。

没有<if>;, <Loop>;的xml报文已经充分的表达了结构的信息(没有某个节点也是信息),你在遍历该xml报文的时候完全可以获得这些信息,并在第2)步填写正确的应用结构,而无需添加多余的控制节点,增加程序的复杂度,而且难以阅读(尤其在调试的时候)。

ps:你用的lib2xml库是...(homepage?)

论坛徽章:
0
发表于 2002-11-04 18:19 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

我用得lib2xml就是从http://xmlsoft.org下载的
xmlDocPtr doc&#59;
doc = xmlParseFile(filename)&#59;
这两句我都是使用了的,看了你的话,我觉得应该是我对lib2xml的使用还没有理解透彻,
再看看提供的函数吧,回头再向你请教
非常感谢!

论坛徽章:
0
发表于 2002-12-06 22:56 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

如果用了xml,是不是就可以将解析报文的任务交给了xml,不用自己打包解包?

论坛徽章:
0
发表于 2002-12-12 22:18 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

我的想法不是这样的,
我的想法是:使用XML来定义报文的结构,如一个报文有几个字段,每一个字段的长度,等等这些信息
这样的话,就可以写一个通用的打包解包模块,来接收和发送报文,
如果将来报文结构发生变化了,就可以只修改XML配置文件的信息,而不用修改打包解包的程序了。
我之前的疑问是如何来定义这个XML配置文件的格式,也就是说如何来表示一个报文的结构,最近具体作了一个这样的程序,但是还没作完,有一些收获,也发现了一些不足的地方和新的问题,准备过一段时间后总结一下,再来与朋友们讨论,
欢迎billik来参加讨论

论坛徽章:
0
发表于 2002-12-13 10:31 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

关于xml本身,只要定义好自己的dtd或xsd,其余可以用解析器完成语法及内容解析(用dom或sax都可以,各有优缺点),用不着自己完成,但对内容本身的操作代码,你要自己写。

论坛徽章:
0
发表于 2002-12-13 11:56 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

目前的 XML parsers 不需要 DTD 之类的。 事实上 DTD也不是XML格式,需要专门的parser去分析。 (XML Schema 是 XML 格式, 但很复杂, 实用中的XML parsers 也都不会去分析它)。

建议参考 soap或者 xml 应用在加密解密传输方面的资料。

论坛徽章:
0
发表于 2002-12-13 12:12 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

定义dtd、schema不难啊,有专门的工具可以减轻你的工作比如xmlspy等,解析器大都认识dtd、schema,其码我用的都可以,或者你可以网上搜索一下,有现成的软件可用

论坛徽章:
0
发表于 2003-01-13 12:30 |显示全部楼层

关于使用xml技术编写通用报文配置程序的思路和思考,欢迎大家一

我觉的看一看radius服务器和客户端的实现过程会有很大帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP