EBCDID公共转码器及转码模拟器的实现-毕业论文_第1页
EBCDID公共转码器及转码模拟器的实现-毕业论文_第2页
EBCDID公共转码器及转码模拟器的实现-毕业论文_第3页
EBCDID公共转码器及转码模拟器的实现-毕业论文_第4页
EBCDID公共转码器及转码模拟器的实现-毕业论文_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EBCDIC文件转码器 厦门大学软件学院 本科毕业论文(科研训练、毕业设计)题 目:EBCDID公共转码器及转码模拟器的实现姓 名:学 院:软件学院系:软件工程专 业:软件工程年 级: 学 号:指导教师(校内): 职称: 指导教师(校外): 职称: 年 月 日EBCDID公共转码器及转码模拟器的实现摘要 EBCDIC文件公共转码器主要是针对源系统(在UDI项目中,专指DCC和国际卡系统)的EBCDIC文件进行解码,解成UDI内部标准的ASCII文件格式,中文部分采用GBK编码。同时进行格式检查,对不符合检核规则的记录生成相应的reject file(不符合检核规则而丢弃的记录)和warning file(不符合检核规则报错但继续转换的记录).公共转码器包含日志组件,XML解析器。转码模拟器是EBCDIC文件公共转码器的逆向转换操作,支持将ASCII文件,通过XML Table Definition格式定义文件,转换成模拟的EBCDIC文件。反转时不进行格式检查,但反转要求ASCII文件是定长文件,最后只生成转换得到的EBCDIC文件。本文档详细描述了公共转码器和转码模拟器的设计构思,处理流程以及与其他模块的接口.关键字 EBCDIC文件公共转码器 UDI XML解析器 转码模拟器 Abstract EBCDIC file commonality coding decoder mostly decodes the EBCDIC file in the source system (It is for the DCC system and international block system in the UDI project).It decodes into the ASCII file format according the UDI inner standerd.The Chinese part adopts GBK coding.At the same time ,carrying the format checking.It will create corresponding rejecting file and warning file while it dose not according to checking rule.The commonality coding decoder contained log module and XML parser.Code decoder simulator is the opersite operation to EBCDIC file coding decoder .It supported to decoding ASCII file to EBCDIC file ,through XML Table Definition format definition file.It will not carry the format checking ,but it required the file to be fixed-long .Finally ,it will only create the EBCDIC file.The document particular described the design of commonality coding decoder and decoder simulator, transaction flow and the interface with other module.Key Words EBCDIC file commonality coding decoder UDI XML parser decoder simulator目录EBCDID公共转码器及转码模拟器的实现2第一章引言6第二章 系统设计81.模块设计的基本需求及设计原则8(1)基本需求(如表1)8(2)设计原则(如表2)82.模块的整体结构9(1)模块的整体框图:如图19(2)各模块间的调用关系:如图210(3)模块的整体流程:如图3113.重要的数据结构及公共参数12(1)Cobol字段转码前后类型和长度对照表:(如表3)12(2)检核规则定义:15(3)系统ID:17第三章 详细设计181.EBCDIC文件模拟器18(1)功能定义 :18(2)模块框图:18(3)反转码的处理流程:19(4)反转码函数:192.模块对外提供接口说明及使用举例23(1)EBCDIC文件公共转码器(EbctoAsc)23(2)EBCDIC文件模拟器(EbcSimulator)243.XML解析器25(1)xml介绍25(2)xml解析器介绍27(3)编写的xml解析器的类28(4)示例31结论32致谢语33参考书目34第一章 引言中国建设银行和其他银行一样面临着入世后带来的各种机遇和挑战,配合建设银行上市的步伐,满足内部股份改造的需要,全面提高整体科技应用水平成为当务之急。如今,建行的柜面系统已经很完善了,但是对客户信息的管理,决策支持系统还有待进一步的完善,DCC(数据集中工程)就是把数据集中在总行统一处理,另外考虑到各系统间数据的交互,于是引入的UDI(统一数据交换池)的项目,而DCC和国际卡业务的数据都是在大型机上以EBCDIC码(Extended Binary-Coded Decimal Interchange Code,扩展二、十进制交换码)的形式存储的,要与其他系统进行交互既要转换成通常所用的ASCII码的形式,我们编制的EBCDIC文件公共转码器功能是将EBCDIC码文件转换成UDI内部标准的ASCII文件, EBCDIC是IBM公司为它的大型机开发的8位字符编码,转码时先装入公共配置文件及表定义文件。公共配置文件定义了一些合法的缺省格式,表定义文件记录的是元数据,即对数据的类型、属性、长度等等一些相关信息的描述。根据装入的表定义文件中数据的类型执行相应的检核程序,对不符合检核规则的记录生成相应的reject file(不符合检核规则而丢弃的记录)和warning file(不符合检核规则报错但继续转换的记录)。然后执行相应的转码程序。EBCDIC文件公共转码器还包含日志组件和XML解析器。日志组件时刻记录程序的运行情况,输出程序运行中产生的错误、警告及一些相关信息。XML解析器用来解析XML文件,在本程序中是很重要的组件,公共配置文件和数据的表定义文件都是存储在xml文件中的,对于不同的数据只要装入不同的表定义文件即可运行转码程序得到转码后的文件。这样有利于程序的模块化和封装性,对不同的数据不用编写不同的转码,程序增强了程序的通用性,另外考虑到将来的平台测试,以及测试数据模拟的问题,增加了一个用于测试的模块(EBCDIC文件模拟器),主要用于从输入的ASCII源文件,根据COPYBOOK定义,生成对应的EBCDIC模拟文件。转码模拟器实现的是EBCDIC公共转码器的逆向转换操作,即将ASCII文件转换成 ECBDIC文件,转换的过程是先装入公共配置文件和表定义文件,反转过程不用进行类型检核,直接根据表定义文件中定义的数据类型执行相应的反转码函数。在这次项目中,我主要负责的是转码模拟器的实现以及XML解析器的封装。本文档主要描述了1. 公共转码器及转码模拟器的设计构思,处理流程以及与其他模块的接口。2. 具体描述了模块的整体结构,包含的各个子模块的功能及相互之间的关系。3. 模块的对外接口及实用实例。4. XML解析器的原理及应用实例。第二章 系统设计1.模块设计的基本需求及设计原则(1)基本需求(如表1)#需求描述来源于R001处理性能大于1GB/SR002支持EBCDIC码文件转码成UDI标准的定长加分隔符ASCII码文件R003支持带分隔符的ASCII码文件转码成UDI标准的定长加分隔符ASCII码文件(目前还没有做,将来支持)R004支持定长ASCII码文件转码成UDI标准的定长加分隔符ASCII码文件(目前没有做,将来支持)R005支持对转码前后的文件进行检核R006对转码过程有相应统计分析,形成结果标记文件R007对检核出错的数据,能根据检核规则形成rejectfile或warning fileR008对出错次数有控制,当超过最大允许reject或warning次数时停止转码R009对于检核规则应实现可配置R010能够依赖元数据定义的XML文件实现对各种文件的自动转码,模块必须具有通用性表 1(2)设计原则(如表2)#设计原则描述其他P001采用C/C+进行编写,必须支持UDI服务器的运行平台 AIX以命令行的方式提供给应用层调用。 P002公共转码模块的性能应该达到 1GB/分钟 的处理速度。P003设计上应该能够处理所有小于64GB的文件。P004支持EBCDIC定长文件和ASCII码定长及分隔符文件的转码。P005支持对转码后的文件进行数据检核。P006程序具有通用性,只要提供库结构,就可以转相应表的数据。P007设计上要考虑文件模拟要求,进行少量修改就可以将转码后的文件逆向转为EBCDIC码定长文件。表 22.模块的整体结构(1)模块的整体框图:如图1主控类公共配置文件类型检核模块EBCDIC文件转码器表定义文件EBCDIC文件结果标记文件ASCII文件Rej 文件Warn 文件图 1(2)各模块间的调用关系:如图2图 2依据模块总体框图,本模块主要由10个子模块组成,按照面向对象的设计原则分为10个大类:数据处理 主控程序,控制整个处理流程。 转码类,负责处理EBCDIC到ASCII的转码。 类型检核类,负责源文件特殊值的转换和类型检查。文件操作 源文件类,包括所有对源数据的操作,如读取指定数据等。 表定义类,装入表定义XML文件。 公共参数类,负责读取公共参数文件和表定义文件的配置信息,计算各个字段的长度和转码、检核函数。 Normal文件类,负责写转码后的标准ASCII文件 Reject file 类, 如果是主键值字段,只要一个出现解码错误,或者主键值字段为空,则reject这条记录,并记录Reject file。 Warning file 类, 对某些规则如有乱字符,造成该字段无法正常转码,结果中输出这些已解出的,并且对这种情况需要记录Warning File。 结果标记文件类,负责写结果标记文件(3)模块的整体流程:如图3 装入配置文件和表定义文件, 是根据装入的信息按不同系统计算各个字段转码前后的长度,计算记录的长度 根据计算的长度分配记录转码前后的空间,定位每个字段在该空间的位置 是根据系统不同和数据类型的不同,生成每个字段的转码函数和检核函数图 33. 重要的数据结构及公共参数(1)Cobol字段转码前后类型和长度对照表:(如表3)Cobol Type Name(In Copy Book)Actual Field Bytes in EBCDIC FileCorresponding C/C+ Types(不包括结束符)ETL Data TypeDescriptionsX(n)Ncharn VARCHAR(n)N个由任意字符组成的字符串可以包含中文字符9(n)NIntnINTEGER由N个数字字符(0.9)组成的整型值9(n) COMP1. 当n为1.4范围内, 占2 bytes2. 当n为5.9范围内, 占4 bytes3. 当n为9.19返回内,占8 bytesIntnINTEGER由N个数字字符(0.9)组成的整型值采用COMP方式进行压缩9(n) COMP-3n/2 + 1IntnINTEGER由N个数字字符(0.9)组成的整型值采用COMP-3方式进行压缩S9(n)V9(m) COMP-3(n+m) / 2 + 1DoubleN+M+2Decimal(n, m)由N个整数位,M个小数位组织的精确浮点数,采用COMP-3方式压缩S9(n) COMP-3(n) / 2 + 1DoubleN+1Decimal(n, 0)由N个整数位,0个小数位组织的精确浮点数,采用COMP-3方式压缩9(8) CONVDATE逻辑上的日期字段注 : CONVDATE是本模块用来标记该字段需要进行日期转换的标记。DCC提供的COPYBOOK中不包含8CHAR8CHAR(8)YYYYMMDD或者为8个空格, 如果为8个空格,表明该字段无法正常转换或者无值9(15) COMP-3 CONVTIMESTAMP逻辑上的时间戳字段注 : CONVTIMESTAMP是本模块用来标记该字段需要进行时间戳转换的标记。DCC提供的COPYBOOK中不包含8CHAR17CHAR(17)YYYYMMDDHHMMSSnnn或者为15个空格, 如果为15个空格,表明该字段无法正常转换或者无值9(9), 也有可能出现以下情况,但是概率比较小:S9(9), 9(9) Comp, 9(9) Comp-3, S9(9) Comp, S9(9) Comp-3UDI关键标记符 : CONVTIME注 : CONVTIME是本模块用来标记该字段需要进行时间转换的标记。DCC提供的COPYBOOK中不包含依据9(n), S9(n)V(m)等长度计算公式,如前表CHAR(9)CHAR(9)格式 : HHMMSSnnn(二位时二位分二位秒三位毫秒)或者为9个空格, 如果为9个空格, 表明该字段无法正常转换或者无值类型名称 : TIME类型描叙 : 时间类型表示数据范围 : 只限制于表示时间,24小时制统一表示为 : 长度为9的字符串,例如 : 1) 如时间为下午8点08分18秒001毫秒,表示为 : 2008180019(6), 也有可能出现以下情况,但是概率比较小:S9(6)UDI关键标记符 : CONVTIME6注 : CONVTIME6是本模块用来标记该字段需要进行时间转换的标记,不包含豪秒。DCC提供的COPYBOOK中不包含依据9(n), S9(n)V(m)等长度计算公式,如前表CHAR(6)CHAR(6)格式 : HHMMSS(二位时二位分二位秒),24小时制或者为6个空格, 如果为6个空格, 表明该字段无法正常转换或者无值类型名称 : TIME6类型描叙 : 时间类型表示数据范围 : 只限制于表示时间, 统一表示为 : 长度为6的字符串,例如 : 1) 如时间为下午8点08分18秒,表示为 : 2008189(7), S9(7) Comp-3, 也有可能出现以下情况:S9(7), 9(7) Comp-3UDI关键标记符 : CONVJULIANDATE注 : CONVJULIANDATE是本模块用来标记该字段需要进行太阳日转换的标记。DCC提供的COPYBOOK中不包含依据9(n), S9(n)V(m)等长度计算公式,如前表CHAR(7)CHAR(7)格式 : YYYYDDD(四位年三位日子序号,日子序号表示该日子在该年是第几天)或者为7个空格, 如果为7个空格, 表明该字段无法正常转换或者无值类型名称 : JULIANDATE类型描叙 : 太阳日类型表示数据范围 : 只限制于表示太阳日, 统一表示为 : 长度为7的字符串,例如 : 1) 如2004年1月1日表示为2004001;2) 如2004年12月31日表示为2004366表 3(2)检核规则定义:该检核规则中,有缺省值的检核规则定义在参数配置文件中(如表4)规则编号检核规则合法值(可以配置)应赋缺省值(可配置)R0000001源文件长度不是单条记录长度的整数倍,停止转码R0000001Reject记录条数超过阀值,停止转码R0000001Warning记录条数超过阀值,停止转码R0000001主键为空,reject该记录R0000001数值类型(int,decimal)存在非数字字符.reject该记录R0000000中文字段(COBOL类型 : X(n) 中有乱字符,造成该字段无法正常转码,整个字段能解多少解多少。结果输出中这些已解出的,并且对这种情况需要记录Warning File.R0000000DATE型转码失败,统一赋值为”99999999”, 记录warning File“99999999”“00000000”空19000101R0000000JulianDate型转码失败,统一赋值为”9999999”, 记录warning File“9999999”空1900001R0000000Time型转码失败,统一赋值为”999999999”, 记录warning File“999999999”空000000000R0000000Time6型转码失败,统一赋值为”999999”, 记录warning File“999999”空000000R0000000Timestamp型转码失败,统一赋值为”99999999999999999”, 记录warning File“99999999999999999”空19000101000000000R0000000Int型如果为空等合法值,记录warning File空0R0000000Decimal型记录warning File空“.”0.0表 4(3)系统ID:目前系统中,只区分了EBCDIC码和ASCII码文件,并分别对这两种情况进行处理。如果一个系统有其特定的转码或检核规则的话,就需要单独对其进行处理。此时,程序中就需要系统ID来区分处理。当出现这种情况时,需要模型组提供系统ID的输入方式。(可以通过命令行或配置文件提供)(如表5)ID系统中英文简称系统名称编码1DCCDCCEBCDIC码2CL国际卡EBCDIC码3IPSS综合理财ASCII码4CCBSS证券ASCII码5CMISCMISASCII码6ECIFECIFASCII码7OCRMOCRMASCII码8BDB票据系统ASCII码9ERPERPASCII码表 5第三章 详细设计1.EBCDIC文件模拟器(1)功能定义 : 本模块主要是EBCDIC文件公共转码器的逆向转换操作,支持将ASCII文件,通过XML Table Definition格式定义文件,转换成模拟的EBCDIC文件。(2)模块框图:(采用DataStage Manager导出的XML Table Definition作为copybook输入与 EBCDIC文件公共转码器需要的格式文件一致。ASCII文件EBCDIC文件EBCDIC文件模拟器XML Table DefinitionWarningFile(3)反转码的处理流程:反转码的处理流程如下程序:从SourceFile中读入ASC码记录;当正常结束时,退出;循环,i从0到m_nColumnTotal,m_nColumnTotal为记录的总数,读取每个字段If 该字段对应的转码函数指针mm_pfnDecodeFunction指向空时;输出错误信息;Else 根据数据的类型mm_nSqlType执行相应的转码函数If bRejectFlag (bRejectFlag为是否产生reject 的标志)为false将反转码生成的记录写入要生成的NormalFile中循环结束;(4)反转码函数:根据表3定义的数据类型,反转码涉及的主要数据类型有comp,comp3,整形,时间戳。我主要编写的函数(如表1)函数名输入参数返回值函数说明AscDatEbcHexIntchar *InDatint InSizechar *OutDatint OutSize返回0为成功其他的失败Asc码转comp型在计算机内字符是以asc码的形式存放的,comp型是以十六进制形式压缩存放的。比如a对应的十进制的ASC码是97,而十六进制的ASC码为61,此函数即当输入字符a时,转换为机内存储的61,具体方法是先找出字符a对应的十进制的asc码,然后将十进制转换为十六进制。AscDatEbcComp3Intchar *InDatint InSizechar *OutDatint OutSize返回0为成功其他的失败Asc码转comp3整形输入为Indat,输入长度为Insize,转后的在内存中的长度为Insize*2-1, 若是正数最后低四位为c,若是负数最后低四位是d,除去最后的符号位,其余的部分不足的补0若Insize为8,若输入123456,则输出应为00 00 00 00 01 23 45 6c。若输入-1234567则输出为00 00 00 00 12 34 56 7dAscDatEbcComp3Decchar *InDatint InSizechar *OutDatint OutSize返回0为成功其他的失败Asc码转comp3小数此函数和Asc转comp3整形基本相同, AscDatEbcComp3Dec对小数的处理方法是去掉小数点,将小数点后的数并入小数点之前的数一同输出,如若Insize为8,Indat为100.00,则输出应为00 00 00 00 00 10 00 0cAscTimestampEbcComp3char *InDatint InSizechar *OutDatint OutSize0 成功1 空的时间戳2 错误的时间戳格式Asc码转时间戳时间戳:104 318 22 19 51 567第一位-1:1表示20,0表示19第2,3位-04:表示yy第4,5,6-318:表示该日在当年的第几天,如:1月1日就是001,12/31就是365或者366第7,8位-22:表示hh第9,10位-19:表示mm第11,12位-51:表示ss第13,14,15位-567:表示nnn毫秒若输入20041231000000000输出104366000000000此函数要注意先要根据年份判断出该年是否闰年.函数 CCommonParameter:GetColumnFunction()为根据源系统不同和每个字段的sqltype 取得其相应的检核函数,主要程序如下: switch (aColumni.mm_nSqlType)case COLUMN_TYPE_CHAR:case COLUMN_TYPE_VARCHAR:aColumni.mm_pfnDecodeFunction = AscEbcDat;break;case COLUMN_TYPE_DECIMAL:switch (aColumni.mm_nUsage )case COLUMN_COMP_TYPE_NONE:aColumni.mm_pfnDecodeFunction = AscEbcDat;break;case COLUMN_COMP_TYPE_COMP:aColumni.mm_pfnDecodeFunction = EbcHexDblAscDat;RETURNCODE(ERRCODE_REJECT_COLUMN_COMP_TYPE)break;case COLUMN_COMP_TYPE_COMP3:aColumni.mm_pfnDecodeFunction = AscDatEbcComp3Int;break;default:setLastErrMsg2(column%s unknown COMP type%d! file=%s, line=%d, aColumni.mm_sName, aColumni.mm_nSqlType, _FILE_, _LINE_);RETURNCODE(ERRCODE_UNKNOWN_COMP_TYPE)break; case COLUMN_TYPE_INTEGER:switch (aColumni.mm_nUsage )case COLUMN_COMP_TYPE_NONE:aColumni.mm_pfnDecodeFunction = AscEbcDat;break;case COLUMN_COMP_TYPE_COMP:aColumni.mm_pfnDecodeFunction = AscDatEbcHexInt;break;case COLUMN_COMP_TYPE_COMP3:aColumni.mm_pfnDecodeFunction = AscDatEbcComp3Int;break;default:setLastErrMsg2(column%s unknown COMP type%d! file=%s, line=%d, aColumni.mm_sName, aColumni.mm_nSqlType, _FILE_, _LINE_);RETURNCODE(ERRCODE_UNKNOWN_COMP_TYPE)break;default:setLastErrMsg2(column%s unknown column type%d! file=%s, line=%d, aColumni.mm_sName, aColumni.mm_nSqlType, _FILE_, _LINE_);RETURNCODE(ERRCODE_UNKNOWN_COLUMN_TYPE)2. 模块对外提供接口说明及使用举例本章节详细描述本模块对外提供的接口方式(如接口函数)以及使用举例。EBCDIC文件公共转码器向应用层提供以下接口 : (1)EBCDIC文件公共转码器(EbctoAsc)运行平台 : AIX输入参数 : EbcAscConv -f ConfigurationFile Source File Name Target Ascii File Name XML CopyBook FileName Table Name Max Warning Times Max Reject Times Warning File Name Reject File Name ResultFileName 其中 : -f ConfigurationFile- EBCDIC文件公共转码器公共参数配置文件本配置参数可选择,如果不输入本配置参数,则表示采用缺省参数配置文件,缺省文件位于(执行程序同级目录,文件名EbcAscConv.conf)。Source File Name- EBCDIC源文件名Target Ascii File Name- ASCII目标文件名XML COPYBOOK FileName- COPYBOOK对应的XML Table Definition文件Table Name- 表名称Warning File Name- 转码警告文件名Max Warning Times- 最大允许的转码警告次数(可以为次数,也可以是百分比,是整型数 则表示是次数,是小数 则表示是百分比,乘以文件记录数可以得到最大警告次数)Max Reject Times- 最大允许的转码拒绝次数(可以为次数,也可以是百分比,是整型数 则表示是次数,是小数 则表示是百分比,乘以文件记录数可以得到最大警告次数)Reject File Name- 拒绝文件名ResultFileName- 结果标准文件本应用程序主要是面向应用层(任务调度器)启动一种基于命令行的EBCDIC文件解码,支持DCC和国际卡两个系统返还的数据文件。返回参数(整型数) : 00000 - 处理成功, 指正常运行,并生成解码后ASCII文件。20100- 源数据文件%s 文件名不存在或无法读取20101- 目标文件%s 文件名无法创建或写失败20102- 转码警告文件%s 文件名无法创建或写失败20103- COPYBOOK文件%s 文件名不存在或无法读取20104- COPYBOOK文件%s 文件名格式错误,详细错误%s20105- 表定义在XML COPYBOOK文件%s 文件名中不存在20106- 源数据文件格式错误,源数据文件不是单条记录长度%d的整数倍(2)EBCDIC文件模拟器(EbcSimulator)运行平台 : AIX输入参数 : EbcSimulator ASCII Source File Name Target EBCDIC File Name Table Name XML COPYBOOK FileName Warning File Name其中 : ASCII Source File Name- ASCII源文件名Target EBCDIC File Name- EBCDIC目标文件名XML COPYBOOK FileName- EBCDIC源文件对应的COPYBOOK文件Table Name- 表名称Warning File Name- 模拟程序转码警告文件名本应用程序主要是面向测试人员提供一个基于命令行的EBCDIC文件模拟程序,支持模拟DCC和国际卡两个系统返还的EBCDIC数据文件。返回参数(整型数) : 00000 - 处理成功, 指正常运行,并生成EBCDIC文件。20100- 源数据文件%s 文件名不存在或无法读取20101- 目标文件%s 文件名无法创建或写失败20102- 转码警告文件%s 文件名无法创建或写失败20103- COPYBOOK文件%s 文件名不存在或无法读取20104- COPYBOOK文件%s 文件名格式错误,详细错误%s20105- 表定义在XML COPYBOOK文件%s 文件名中不存在20106- 源数据文件格式错误,源数据文件不是单条记录长度%d的整数倍3. XML解析器(1)xml介绍XML文件表面上类似于HTML文件,都是一种标记文件,都可以编写页面,但不同的是XML文件更广泛的使用在数据处理方面。XML文件就是数据库,它是数据的集合。在许多方面看起来它和其他文件没什么区别,无论如何,每个文件都含有某种类型的数据。作为一种“数据库”格式,XML有一些优势:例如,它是自描述的(所用的标记描述了数据的结构和类型,尽管缺乏语义),可交换的(portable)(Unicode),能够以树型或图形结构描述数据。同样它也有缺点,例如,它显得有些繁琐,由于要对它进行解析和文本转换,所以数据访问速度较慢。因此,在数据量小、用户少和性能要求不太高的环境下,可以将XML文档用作数据库,但是却不适用于用户量大、数据集成度高以及性能要求高的作业环境。以数据为中心的文档就是将XML用作数据的传输载体,只提供给机器消费的文档。 以数据为中心的文档的特点是结构相当规整,数据粒度精细(即最小的独立数据单位只存在于PCDATA元素或属性这一级别),很少或没有混合内容。除非在对文档进行验证的时候,同级元素或PCDATA的出现次序一般来说并不重要。 以数据为中心的文档中的这类数据可以来自数据库(此时要输入给XML)或在数据库之外(此时要将其存入数据库)。例如,下面的销售订单就是以数据为中心的: ABC Industries 123 Main St. Chicago IL 60609 981215 Turkey wrench: Stainless steel, one-piece construction, lifetime guarantee. 9.95 10 Stuffing separator: Aluminum, one-year guarantee. 13.27 5 (2)xml解析器介绍2.1 XML解析器使用步骤一个 XML Parser(解析器)是一段可以读入一个文档并分析其结构的代码。通常而言,使用一个解析器需要如下步骤:1. 创建一个解析器对象2. 将您的 XML 文档传递给解析器3. 处理结果2.2 XML解析器类型XML解析器主要有以下四类:DOM,SAX,JDOM,JAXP。其主要特点和区别如下:u DOM 构建整个文档驻留内存的树。如果文档很大,就会要求有极大的内存。 DOM 创建表示原始文档中每个东西的对象,包括元素、文本、属性和空格。如果您只需关注原始文档的一小部分,那么创建那些永远不被使用的对象是极其浪费的。 DOM 解析器必须在您的代码取得控制权之前读取整个文档。对于非常大的文档,这会引起显著的延迟。 u SAX 解析器向您的代码发送事件。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,它会告诉您。您可以决定什么事件对您重要,而且可以决定要创建什么类型的数据结构以保存来自这些事件的数据。如果您没有显式地保存来自某个事件的数据,它就被丢弃。 SAX 解析器根本不创建任何对象,它只是将事件传递给您的应用程序。如果希望基于那些事件创建对象,这将由您来完成。 SAX 解析器在解析开始的时候就开始发送事件。当解析器发现文档开始、元素开始和文本等时,代码会收到一个事件。您的应用程序可以立即开始生成结果;您不必一直等到整个文档被解析完毕。更妙的是,如果您只查找文档中某些内容,代码一旦找到所要找的东西就可以抛出一个异常。该异常会停止 SAX 解析器,然后代码用它找到的数据做它需要做的任何事。 SAX 事件是无状态的。当 SAX 解析器在 XML 文档中发现文本时,它就向您的代码发送一个事件。该事件仅仅给您发现的文本;它不告诉您什么元素包含那个文本。如果您想知道这一点,则必须自己编写状态管理代码。 SAX 事件不是持久的。如果应用程序需要一个数据结构来对 XML 文档建模,则必须自己编写那样的代码。如果您需要从 SAX 事件访问数据,并且没有把那个数据存储在代码中,那么您不得不再次解析该文档。 SAX 不是由一个集中管理的组织控制的。尽管到目前为止这还没有引起什么问题,但如果 SAX 是由象 W3C 这样的一个组织控制的话,有些开发人员会感觉更自在。 u JDOM 的主要特性是它极大地减少了您必须编写的代码数量。JDOM 应用程序的长度通常是 DOM 应用程序的三分之一,大约是 SAX 应用程序的一半。u JAXP为使用 DOM、SAX 和 XSLT 处理 XML 文档提供公共接口2.3 本程序解析器类型本程序采用DOM解析模型解析XML文件,DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 解析器把 XML文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM 解析器常用于XML文档需要频繁的改变的服务中。(3)编写的xml解析器的类本程序依靠的解析器是Apache的xerces-c_2_6_0-windows_nt-msvc_60。Apache的Xerces C+是一个开放源代码的项目而且提供不同平台下的库和源代码,故深受广大c/c+程序员的欢迎。本程序为自己编写的解析xml数据文件的类,它是建立在xerces-c_2_6_0-windows_nt-msvc_60上的基础上,并对其进行封装一组接口,提供了解析xml文件的方法。实现了xerces的大部分功能,能更方便用户调用来解析xml文件。本XML解析器实现的功能是装入公共配置文件和表定义文件,通过解析XML文件来获取检核规则和数据的类型定一,公共参数类为本程序的核心程序。 类中的主要对象如下:XercesDOMParser: 初始化解析器并将一个 XML 文档作为 DOM 树装载DOMDocument: 该对象所描述的是整个XML文档.也就是整个树.对于树而言它可以表示为包含了很多节点的整体对象.而这些节点统称为Node.DOMNodeList:该对象描述的是XML文档中包含子节点的节点列表,即树的一个分支节点但又不是叶子节点。DOMNode:树最末端的叶节点。DOM 的基础数据类型。所有 DOM 节点对象都是从这个基类扩展来的.xml解析器主要实现的功能有:3.1 首先初始化:初始化一个文件空间。定义一个XercesDOMParser类的指针,将文件名传入作为参数,创建一个xml文件解析器的对象。如程序1:DOMDocument *pDoc;XercesDOMParser *pParser = NULL;initializeXML();pParser = parseXMLFi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论