【摘要】 基于xml模式的数据绑定应用程序接口生成方法针对实际中存在的复杂xml schema规范,提出了一种自动生成用于操作符合xml Schema规范的xml文件的数据绑定API的方法。其特征为该方法以数据绑定技术为基础,首先生成一套与生成目标语言类型无关的中间层,然后通过独立的代码生成引擎生成所需类型目标代码。本文基于新华社颁布的CNML Schema(中文新闻置标语言)以及CNML稿件模板进行代码生成和测试,实验证明,这种方法在保证API的健壮性和正确性的基础上,同时具有了极大的灵活性,可以大幅降低schema规范变迁所带来的API维护成本,保持多种语言API接口的基本一致性以降低培训成本,同时也为基于API之上的应用系统提供稳定的支持。 【专利类型】发明授权 【申请人】清华大学 【申请人类型】学校 【申请人地址】100084 北京市100084-82信箱 【申请人地区】中国 【申请人城市】北京市 【申请人区县】海淀区 【申请号】CN200810112277.8 【申请日】2008-05-22 【申请年份】2008 【公开公告号】CN101339500B 【公开公告日】2010-06-09 【公开公告年份】2010 【授权公告号】CN101339500B 【授权公告日】2010-06-09 【授权公告年份】2010.0 【IPC分类号】G06F9/44; G06F17/22; G06F17/30 【发明人】李涓子; 王峰; 张鹏; 李军; 陈德伟; 唐杰 【主权项内容】1.基于XML模式的数据绑定应用程序接口生成方法,其特征在于所述方法是在计算机中依次按以下步骤实现的: 步骤1,使用JaxMeXS解析器,对输入到计算机中的可扩展宏语言XML Schema模式做语法解析和逻辑解析,生成SchemaElement和SchemaDataType类型的对象,在其中记录与Schema相关的所有信息,其中至少包括子元素列表,属性列表以及父类型名称: 步骤1.1,语法解析:记录所有在Schema中定义的数据类型datatype,存入到syntax_map中,并单独记录abstract属性为true的datatype,存入到abstract_map中; 步骤1.2,逻辑解析:对Schema进行逻辑解析,对于其中定义的元素、数据类型分别生成SchemaElement和SchemaDataType类型的对象,并在其中记录与Schema相关的所有信息,各自形成一个信息详单,数据项中至少含有子结点名、类型以及约束信息;对于所有的element,在所述记录信息中,包含有根据Schema中定义来设置的SchemaElement对象成员变量或成员变量值,以及生成代码所需的所有Schema信息,并把生成的对象添加到_element列表中; 对于所有的数据类型datatype,在所述记录信息中,除了根据schema中的定义设置的成员变量或成员变量值以及生成代码所需的所有schema信息外,当该datatype是通过其他数据类型经过扩展或者约束修饰而来,则要在parent_map中记录两种数据类型之间的继承关系,即被扩展或约束的类型为本类型的父类型,并把生成的对象添加到_datatype列表;所属子元素列表至少包含子元素名称、类型、以及允许出现次数; 步骤2,接口映射,根据SchemaDataType和SchemaElement对象中记录的信息,按以下步骤,通过接口映射生成目标代码中每个类以及类中成员变量的接口信息生成DataTypeObject和NodeObject实体描述对象,以完成从结点的Schema到对该结点进行操作访问的应用程序接口API操作接口之间的映射: 步骤2.1,建立一个Schema描述信息到API操作接口的对照表,所述API操作接口包括读、写、管理以及特有操作接口CNML,在所述对照表中,包括以下两种映射关系: 基本映射关系,是对元素或属性内容的一些基本操作接口的映射规则,其中包括以下五种关系: 对于元素属性数据,提供以下两种API操作接口: setXXXAttr,设置元素某一属性值, getXXXAttr,获得元素某一属性值, 对于包含有文本内容的元素,当出现次数maxOccur为1时,提供以下两种操作接口: setText,设置元素的文本内容, getText,获取元素的文本内容, 对于包含子元素的元素或者数据类型,当出现minOccur和maxOccur都为1时,提供以下几种操作接口: addXXX,添加XXX子元素, getXXX,获得XXX子元素, removeXXX,删除XXX子元素, 当子元素包含文字结点时,提供以下操作接口: setXXXText,设置当前元素下XXX子元素中包含的文本内容, getXXXText,获取当前元素下XXX子元素中包含的文本内容, 对于包含的子元素中出现maxOccur大于1时,提供以下几种操作接口: addXXX,添加XXX子元素, getXXXint index,获得由索引index所指示的XXX子元素,int是Java内置整型数据类型, removeXXXint index,删除由索引index所知是的XXX子元素, getXXXTextint index,获得由索引index所指示的XXX子元素文本内容, setXXXTextint index,设置由索引index所指示的XXX子元素文本内容, getXXXList,获得当前元素下所有XXX子元素的列表, getXXXTextList,获得当前元素下所有XXX子元素文本内容的列表, 特有映射针对所述XML特有操作接口,以一种附加的形式连同基本操作接口同时给出,包括以下四种: XPath数据访问接口:为所有的属性、元素和类型定义添加getNodeByXPath,getNodesByXPath以及getValueByXPath特有操作接口,其中: getNodeByXPath为根据指定的XPath获得相应结点对象, getNodesByXPath为根据指定的XPath获得相应结点对象列表, getValueByXPath为根据指定的XPath获得其对应的第一个结点对象的文本内容, 特殊类型数据设置与访问接口,针对元素文本内容可能为HTML格式数据内容或CDATA格式数据内容,为所有元素添加以下接口: setCDATAText:为当前元素设置CDATA格式的文本内容, hasCDATAText:判断当前元素是否含有CDATA格式的文本内容, asXML:获取当前元素内部所有元素、属性等的XML文本,并包含当前元素的标签, getXML:获取当前元素内部所有元素、属性等的XML文本,不包含当前元素的标签, getXMLText:获取当前元素内部所有元素、属性等的XML文本,并去掉其间所有的XML标签, 对于Schema中通过正则表达式对其文本内容进行格式约束的元素,添加validateType方法,用于检验所当前元素所包含的文本内容是否符合类型定义中正则表达式的限制; 对于有多种子类型的数据类型定义,提供addXXXofYYYType操作接口,用一个YYY的实例来添加为当前元素的XXX子元素; 步骤2.2,把步骤2.1中完成接口映射生成的接口对象保存成XML中间配置文件,供用户修改该中间配置文件,实现生成目标代码的个性化: 步骤2.2.1,依次从_datatype列表中取出SchemaDataType对象,依据该对象中的成员变量值以及预先如上定义的接口映射规则为其生成一个DataTypeObject类对象,在该对象的列表中加入为每个操作接口生成的NodeMethod对象,把生成的DataTypeObject加入到data_cache_中,所述的NodeMethod对象是依据上述映射规则生成的一个用来对datatype所定义的XML元素进行操作的函数接口描述,其中会有以下数据项: name:用来记录所需生成函数的函数名称, isAttributeMethod:用来记录是否是对某个元素属性进行操作的函数, MethodReturn:用来记录所需生成函数, Arguments:记录生成函数的参数信息, MethodAction:记录生成函数的函数体实际所需提供的操作信息, 步骤2.2.2,依据步骤1.2中生成的parent_map中的继承关系,为相应的两个datatype所对应的DataTypeObject对象加入依赖关系; 步骤2.2.3,依次从_element列表中取出SchemaElement对象,依据该对象中的成员变量值为其生成一个NodeObject类,并在NodeObject类中相应列表中加入NodeMethod对象,用以记录需要生成的成员函数接口描述,并把生成的NodeObject加入到cache_中; 步骤2.2.4,把所得到的cache_和data_cache_中的对象保存成XML中间配置文件,作为中间代码备用,供用户修改,实现API操作接口的定制; 步骤3,从中间代码读入步骤2.2.4所述经过用户修改的XML中间配置文件,然后在内存中生成DataTypeObject和NodeObject的对象,分别相应的保存到data_cache_和cache_中; 步骤4,针对不同的程序设计语言,使用代码生成程序,生成API源代码: 步骤4.1,对于cache_中的每一个对象,利用相应的程序设计语言代码生成程序,生成用于操作XML文件中element的interface以及实现类,所述的实现类是指用于实现该类的对应的接口中定义的接口interface中定义的接口函数,在每个具体的实现类中要把该类对应的XML元素在dom树上的dom结点对象作为私有变量封装在该类中,类中对于该元素的操作要调用该dom节点中相应的函数来实现; 步骤4.2,对于data_cache_中的每一个对象,用所述步骤4.1的方法来生成用于操作XML文件中datatype所定义的元素的接口以及实现类;但是,若该datatype在schema中定义为abstract,则生成的接口也设置为abstract,若该datatype是从其他数据类型约束或扩展而来,则为该接口添加与父接口的继承关系; 步骤4.3,把步骤4.1或步骤4.2生成的代码写出到文件,生成源代码文件; 步骤5,添加顶层工厂类、编译并打包所生成的代码文件,以封装成一个二进制包作为发行包以供用户使用: 步骤5.1,在所述API顶层添加APIFactory类,为用户提供统一的操作入口; 步骤5.2,使用开源工具Ant提供的API,调用API完成包括代码文件的编译,打包以及说明文档的生成。 【当前权利人】清华大学 【当前专利权人地址】北京市100084-82信箱 【专利权人类型】公立 【统一社会信用代码】12100000400000624D 【引证次数】2.0 【他引次数】2.0 【家族引证次数】2.0 【家族被引证次数】59