APP下载

一种将XML模式转化为编程语言的算法

2019-06-19吴家菊纪斌刘振吉陈泉根

现代电子技术 2019年11期
关键词:转换元素

吴家菊 纪斌 刘振吉 陈泉根

摘  要: 为设计与实现XML通用数据编辑框架中编辑数据的验证,提出一种将XML Schema文檔转化为Java代码的算法。研究XML Schema的元素和元素间嵌套关系的定义规则,在此基础上定义元素到Java代码的转换规则和转换算法。该算法以Schema元素为根元素,采用深度优先搜索算法遍历XML Schema文档的每个元素,保证对XML Schema文档转换的完整性。算法实现了XML Schema定义的28种元素和12种限定元素到Java代码的转换,并且元素间的嵌套关系也得到完整的保存。最后通过转换实例验证了该算法的正确性和有效性。

关键词: 可扩展标记语言模式; Java; 转换; 元素; 类; 解析单元; 创建单元

中图分类号: TN911?34; TP311                      文献标识码: A                   文章编号: 1004?373X(2019)11?0169?05

Abstract: In order to design and implement the universal data?editing framework of XML (extensible makeup language) schema, an algorithm to transform XML Schema document into Java code is proposed. The definition rules of elements and their nested relation of XML Schema are studied. On this basis, the transformation rules and transformation algorithm from elements to Java code are defined. Taking schema element as the root element, the deep first search algorithm is used to traverse each element of XML Schema document, which can ensure the completeness of XML Schema document transformation. The transformation from twenty?eight kinds of elements defined by XML Schema and twelve kinds of facet elements to Java code is realized by means of the algorithm, and the nested relation between elements can be reserved completely. The correctness and validity of the algorithm are verified with an transformation instance.

Keywords: extensible makeup language schema; Java; transformation; element; class; analysis unit; creation unit

0  引  言

武器装备综合保障数据应用于武器装备综合保障系统中,在将综合保障数据应用于综合保障系统之前,数据需要编辑成XML(eXtensible Markup Language)格式[1]。XML Schema用来设计、约束、验证XML,并且在武器装备综合保障系统中得到广泛的应用[2]。因此,一种有效的将XML Schema转换为编程语言的算法是数据编辑软件开发的基础。

由于XML Schema的文本特性和XML语法的复杂性,XML Schema文档定义非常复杂[3]。在深入研究了W3C Recommendation发布的XML Schema最新标准的基础上,本文提出一种将XML Schema文档转换为Java代码的转换算法。算法深度优先遍历(Deep First Search,DFS)XML Schema文档,对于每个元素,为其创建一个Java对象,并依据元素之间的嵌套关系在创建的Java对象间建立引用关系。XML Schema文档经过算法转换最终得到一个根元素schema的Java对象,该对象中保存了为所有其他XML Schema文档包含的元素创建的对象。XML Schema标准定义了30种元素和12种限定元素[4?5],算法可以实现其中的28种元素和12种限定元素到Java代码的转换。该算法具有通用性,可以应用到其他XML领域。

1  XML Schema元素的定义规则

W3C Recommendation发布的XML Schema最新标准中定义了30种元素和12种限定元素。从武器装备综合保障领域出发,根据实际应用需求,在设计算法时将一些元素和元素的属性排除在外。算法设计未包含的元素有anyAttribute和notation。算法设计未包含的元素属性如下:所有元素的ID和anyAttributes属性;element的nillable,block,final属性;schema的blockDefault,finalDefault,version属性。

除元素外,XML Schema定义了12种用于对元素和属性取值进行约束的限定元素。所有限定元素的父元素均为restriction,都有一个必选的value属性和一个可选的fixed属性。

2  算法设计

XML Schema文档遵循XML语法,因此,DOM(Document Object Model)[6?8]和SAX(Simple API for XML)[9]都可以用来解析XML Schema文档。该算法采用DOM解析XML Schema文档。

2.1  设计思想

从结构上将算法分为解析单元和Java对象创建单元两部分。

解析单元首先用Java语言实现DOM应用编程接口,并获取DOM解析器实例。其次,解析器解析XML Schema文档。解析结果是一个Document的实例。获取解析结果的第一个元素,将其命名为[n](对于一个格式良好且非空的XML Schema文档,元素[n]实际为schema元素。最后,将元素[n]作为参数传递给Java对象创建单元。

Java对象创建单元接收解析单元传递的元素[n]并获取[n]的localName,然后调用与localName对应的Java类的构造函数,为元素[n]创建一個Java对象。

2.2  算法描述

本节详细描述了Java对象创建单元的执行过程,将执行过程分为8个步骤:

1) 获取元素[n]的localName,调用与localName对应的元素类的构造函数。若[n]是schema时,则向构造函数传入的参数为([n],null,null);若[n]是除schema外的其他元素,则将([n],this,schema)作为参数传入构造函数;若[n]是限定元素时,则将([n],this)作为参数传入构造函数。其中,schema是元素[n]所属的XML Schema文档的根元素,即schema元素的对象。

2) 若该类是元素类,则将构造函数的第一个参数赋值给类中element变量,第二个参数赋值给类中parent变量,第三个参数赋值给类中schema变量;若该类是Facet类,则将构造函数的第一个参数赋值给类中element变量,第二个参数赋值给类中parent变量。

3) 依次执行元素的每个属性定义的属性判别语句,完成元素属性的处理。

4) 获取元素[n]的第一个子元素[n′]。

5) 若([n′] != null)为真,则执行第7)步;若为假,元素[n′]的父元素[n]的对象创建完成,执行第6)步。

6) 若([n.] getLocalName==“schema”)为真,则XML Schema文档中包含的所有元素的对象创建完成,程序正常结束;若为假,则首先将创建的元素[n]的对象赋值给元素[n]的父元素类中为[n]创建的变量,然后获取直接在元素[n]之后的元素[n′],执行第5)步(注意:用获取的元素[n′]替换第5)步中的元素[n′])。

7) 若([n′] instance of Element==true)为真,则执行第1)步(注意:用获取的元素[n′]替换第1)步中的元素[n]);若为假,则执行下一步。

8) 获取直接在元素[n′]之后的元素[n″],执行第5)步(注意:用获取的元素[n″]替换第5)步中的元素[n′])。

图1  Java对象创建单元执行过程

3  算法实现

依据算法的设计,算法的实现分为两部分:解析单元的实现和Java对象创建单元的实现。解析单元是一个名为Create_XSD_Objects的Java类,该类是算法的主类和入口。Java对象创建单元包含28种元素和12种限定元素创建的Java类。另外,为提高代码的重用性和方便地定义变量数据类型,定义一组类和接口。

3.1  为元素定义Java类

1) 为每种元素定义一个Java类,以首字母大写的元素名作为类名。并依据元素与其子元素的嵌套关系,在Java类中建立引用关系。

2) Annotated抽象类:annotation可以出现是任何元素(annotation, documentation,appinfo除外)的子元素。为提高代码的重用性,定义一个名为”Annotated”的抽象类。除了Annotation,Documentation,Appinfo三个Java类外,其他所有元素和限定元素的Java类都继承该抽象类。图2描述了Annotated和相关Java类的UML类图。

图2  Annotated抽象类

3) Keybase抽象类:Key,Keyref,Unique三种元素的父元素都是element,并且三种元素的子元素相同。不同的是,Keyref可以有ref属性。为提高代码重用性,定义一个名为“Keybase”的抽象类。Key,Keyref,Unique继承该抽象类,调用该抽象类中定义的方法为对应的元素创建Java对象。

4) ExplicitGroup抽象类:sequence和choice两种元素可以相互嵌套,并且两种元素的父元素、子元素、属性均相同,使用规则也相同。为提高代码重用性,定义一个名为“ExplicitGroup”的抽象类。Sequence和Choice继承该抽象类,调用该抽象类中定义的方法为对应的元素创建Java对象。

5) Thing接口:为方便定义Java类中变量的数据类型,定义了一个名为”Thing”的空接口。所有其他Java类实现该接口。该接口在算法中有如下五种用途。

① 在Group,ComplexType,Extension,Restriction中定义一个名为“attributes”的变量,变量的数据类型为List。该变量用于存储Attribute和AttributeGroup的对象。

② 在Element中定义一个名为“identifyConstraints”的变量,变量数据类型为List。该变量用于存储Key,Keyref 和Unique的对象。

③ 在Redefine中定义一个名为“redefinables”的变量,变量的数据类型为List。该变量用于存储Sim?pleType,ComplexType,Group和AttributeGroup类的对象。

④ 在Sequence和Choice中定义一个名为modelGroup的变量,变量数据類型为List。该变量用于存储Element,Sequence,Group,Choice和Any类的对象。

⑤ Thing作为元素的Java类和限定元素的Java类构造函数的第二个参数变量的数据类型。

3.1.1  在Java类中为元素的属性定义变量

对于元素包含的每个属性,一般来说在元素的Java类中为其定义一个变量。变量与属性同名。变量数据类型及一些特殊变量定义如下:

1) 在Union中为union的memberTypes属性定义一个名为“memberTypes”的变量,变量的数据类型为String[],变量的初始值为null。

2) 在Schema中为默认名称空间定义一个名为“xmlns”的变量,变量的数据类型为String。为带有名称空间前缀的名称空间定义一个名为“namespace”的变量,变量的数据类型为HashMap,其中对应于<名称空间,名称空间前缀>。两个变量的初始值为null。

3) 表1给出了其他一些为元素特殊属性定义的变量。除去表1列举的属性以及上述两种属性外,为元素属性定义的变量数据类型为String,变量初始值为null。3.1.2  在元素的Java类中为元素的子元素定义变量

除3.1中描述的为元素的子元素定义的特殊变量外,对于元素其他的子元素,为每个子元素在元素的Java类中定义一个变量,变量的定义规则如下所示:

1) 如果子元素在元素中可以出现0次或1次,在元素的Java类中为子元素定义一个变量,以子元素名作为变量名,以子元素的Java类作为变量的数据类型。

2) 如果子元素在元素中可以出现至少1次或0次到多次,则在元素的Java类中为其定义的变量如表2所示。

3) 在元素的Java类中为每个子元素创建的变量初始值均为null。

3.1.3  在元素的Java类中定义特殊变量

除去上述为元素的属性和子元素创建的变量外,在元素的Java类中定义了三个变量:一个名为element的变量,数据类型为Element;一个名为parent的变量,数据类型为Thing;一个名为schema的变量,数据类型为Schema。三个变量的初始值均为null。

3.1.4  在元素的Java类中定义构造函数

每个元素的Java类都有一个构造函数。构造函数有三个参数:第一个是数据类型为Element的element参数;第二个是数据类型为Thing的parent参数;第三个是数据类型为Schema的schema参数。在构造函数中,定义变量赋值语句,将构造函数的三个参数赋值给Java类中定义的相关变量。另外,在构造函数中定义判断语句和赋值语句,用于判断元素包含的属性和子元素,并将属性值或子元素的Java对象赋值给Java类中定义的相关变量。

3.2  为限定元素定义Java类

1) restriction是所有限定元素的唯一父元素,并且所有的限定元素可能包含的属性相同。为提高代码的重用性,为所有限定元素定义一个共用的Java类,以“Facet“作为类名。

2) 在Facet中定义变量:定义一个名为“facet”的变量,用于存储限定元素名;一个名为“value”的变量,对应于限定元素的value属性;一个名为“fixed”的变量,对应于限定元素的fixed属性;一个名为element的变量,数据类型为Element;一个名为parent的变量,数据类型为Thing。facet和value的数据类型为String,fixed的数据类型为boolean。五个变量的初始值均为null。

3) 在Facet中定义构造函数:Facet的构造函数有两个参数,第一个是数据类型为Element的element参数;第二个是数据类型为Thing的parent参数。在构造函数中定义变量赋值语句,将构造函数参数赋值给Facet中定义的相关变量。另外,在构造函数中定义判断语句和赋值语句,用于判断限定元素包含的属性,并将属性值赋值给Facet中定义的相关变量。

4  转换例子

在本节中以ATA/ASD/AIA S1000D Issue 4.2定义的descriptSchema.xsd作为转换文档[10],验证转换算法的正确性和有效性。图3给出了转换文档经过转换后得到的Java对象信息的部分输出结果。对比分析输出信息和源XML Schema文档可以得出:算法能够正确和有效地将源文档中包含的每个元素转换为Java对象;算法能够正确地判断元素包含的属性,获取属性的值并将其赋值给元素的Java类中定义的相关变量;算法能够正确地判断元素包含的子元素,为子元素创建Java对象,并将对象赋值给元素的Java类中定义的相关变量;算法能够依据源文档中元素之间的嵌套关系正确地建立Java对象之间的引用关系。

图3  Java对象信息

5  结  语

本文提出一种将XML Schema文档转换为Java代码的算法,并实现了该算法。W3C Recommendation发布的XML Schema最新标准包含30种元素和12种限定元素,算法可以实现其中28种元素和全部12种元素到Java代码的转换,并且可以依据XML Schema文档中元素之间的嵌套关系建立Java对象间的引用关系。算法从结构上分为解析单元和Java对象创建单元,实现包括34个Java类或接口。选取ATA/AIA/ASD S1000D Issue 4.2标准制定的19个XML Schema文档作为实验文档对算法的正确性和有效性进行验证。基于该算法设计开发了一个XML数据编辑框架原型,并在IETM制作平台中得到初步验证。该算法具有通用性,可以应用到其他XML应用领域。

参考文献

[1] 徐宗昌.装备IETM技术标准实施指南[M].北京:国防工业出版社,2012.

XU Zongchang. Implementary guide of equipment IETM technical standard [M]. Beijing: National Defense Industry Press, 2012.

[2] 徐宗昌,雷育生.装备IETM研制工程总论[M].北京:国防工业出版社,2012.

XU Zongchang, LEI Yusheng. Generalization of equipment IETM developing engineering [M]. Beijing: National Defense Industry Press, 2012.

[3] 王行哲.XML模式到概念模型的转换方法与工具研究[D].武汉:武汉理工大学,2008.

WANG Xingzhe. Method and tool for transforming XML schema to conceptual model [D]. Wuhan: Wuhan University of Technology, 2008.

[4] W3C Recommendation. W3C XML schema definition language (XSD) 1.1 Part 1: structures [S]. US: W3C Recommendation, 2012.

[5] W3C Recommendation. W3C XML schema definition language (XSD) 1.1 Part 2: datatypes [S]. US: W3C Recommendation, 2012.

[6] MA J L, ZHANG S B, HU T S, et al. Parallel speculative Dom?based XML parser [C]// 2012 IEEE International Conference on High Performance Computing. Liverpool: IEEE, 2012: 33?40.

[7] DESHMUKH V M, BAMNOTE G R. An empirical study of XML parsers across applications [C]// 2015 International Conference on Computing Communication Control & Automation. Pune: IEEE, 2015: 1?7.

[8] W3C. Document object model (DOM) level 1 specification: Version 1.0 [EB/OL]. [1998?10?01]. https://www.w3.org/TR/REC?DOM?Level?1.

[9] PAN Y F, ZHANG Y, CHIU K. Hybrid parallelism for XML SAX parsing [C]// 2008 IEEE International Conference on Web Service. Beijing: IEEE, 2008: 505?512.

[10] S1000D. International specification for technical publications using a common source database [S/OL]. [2016?01?15]. http://public.s1000d.org/Pages/Home.aspx.

猜你喜欢

转换元素
浅析旅游业吸引游客的诸元素
大数据时代档案管理模式的转换与创新
徽州元素在手机界面设计中的应用
论英汉语翻译中语内翻译向语际翻译的转换
浅谈平面图与立体图的思维培养
高中化学教学中研究性学习的应用探究
王家卫电影中的后现代美学元素