CN108519964B - 将XML Schema文档转换为Java代码的方法 - Google Patents
将XML Schema文档转换为Java代码的方法 Download PDFInfo
- Publication number
- CN108519964B CN108519964B CN201810193944.3A CN201810193944A CN108519964B CN 108519964 B CN108519964 B CN 108519964B CN 201810193944 A CN201810193944 A CN 201810193944A CN 108519964 B CN108519964 B CN 108519964B
- Authority
- CN
- China
- Prior art keywords
- class
- java
- document
- xml schema
- constructor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 58
- 238000006243 chemical reaction Methods 0.000 claims abstract description 7
- 230000006870 function Effects 0.000 claims description 14
- 238000012545 processing Methods 0.000 claims description 4
- 238000010276 construction Methods 0.000 claims description 2
- 238000012986 modification Methods 0.000 description 13
- 230000004048 modification Effects 0.000 description 13
- 230000000694 effects Effects 0.000 description 9
- 238000011161 development Methods 0.000 description 5
- 230000018109 developmental process Effects 0.000 description 5
- 238000013461 design Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 231100000279 safety data Toxicity 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/12—Use of codes for handling textual entities
- G06F40/151—Transformation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Artificial Intelligence (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
- Document Processing Apparatus (AREA)
Abstract
本发明公开了一种将XML Schema文档转换为Java代码的方法,包括:S1,建立与XML Schema标准定义的30种元素、12种限定元素相对应的Java类,并依据元素、限定元素之间的嵌套关系建立Java类之间的引用关系;S2,解析单元用Java语言实现DOM编程接口以获取解析器实例,用其解析XML Schema文档以获取对应的解析文档以及解析文档的第一个元素n;S3,以n为根元素,按照深度优先遍历次序依次为解析文档中每个元素创建对应Java对象,以实现XML Schema文档到Java代码的转换。采用本发明,可以将XML Schema文档中的所有内容转化为Java代码,并将元素之间的嵌套关系用Java语言完整的表示。基于本发明,可以开发一系列XML相关软件,例如XML编辑软件、XML验证软件。
Description
技术领域
本发明涉及一种在软件设计情况下使用的方法。更具体地说,本发明涉及一种用在软件设计情况下的将XML Schema文档转换为Java代码的方法。
背景技术
XML(eXtensible Markup Language)是一种数据描述和交换的通用格式,并已在Internet上和企业内部得到了广泛应用。由于XML的通用性和可交换性,在武器装备综合保障领域XML被广泛用于描述综合保障数据。XML Schema是W3C推荐使用的标准,是XML应用的基础。XML Schema文档用来设计、约束和验证XML文档。XML Schema文档本身是一个XML文档,它符合XML语法结构。由于XML语法的复杂性,一般人员很难使用文本编辑器编写格式正确的XML文档,并且编写的XML文档也无法使用XML Schema对其进行验证。
当前国外有众多商业化的XML编辑软件,此类软件技术成熟,功能强大,能有效支持XML文档的编辑和验证。但武器装备综合保障数据具有高度保密性,因此不能将XML编辑软件集成到综合保障***中。设计开发一个自主可控、功能强大的XML编辑软件能有效武器装备综合保障数据的编写效率,提高武器装备综合保障水平。如何XML Schema完整的用编程语言表示是XML编辑软件开发的基础也是最重要的部分,直接关系着XML编辑软件后续开发能否正常进行,本发明在此应用背景下产生。
而现有的专利技术,只能实现对XML中对象或内容的部分抽取,无法实现将其转换成直接的Java代码,以供其它软件进行识别、编辑、设计或使用。
发明内容
本发明的一个目的是解决至少上述问题和/或缺陷,并提供至少后面将说明的优点。
本发明还有一个目的是提供一种将XML Schema文档转换为Java代码的方法,采用本发明能够将任何格式正确的XML Schema文档完整地转化为Java对象,并能够依据XMLSchema文档中元素之间的嵌套关系建立Java对象之间的关系,实现XML Schema文档到Java代码的翻译,为其它软件的深度开发设计、应用、修改、编译等提供基础,即基于本发明可以开发XML编辑软件、XML验证软件等一系列XML相关的软件。
为了实现根据本发明的这些目的和其它优点,提供了一种将XML Schema文档转换为Java代码的方法,包括:
S1,建立与XML Schema标准定义的30种元素、12种限定元素相对应的Java类,并依据元素、限定元素之间的嵌套关系建立Java类之间的引用关系;
S2,解析单元用Java语言实现DOM编程接口以获取解析器实例,并基于解析器实例对待转换的XML Schema文档进行解析,以获取对应的解析文档以及解析文档的第一个元素n;
S3,对象创建单元接收第一个元素n,获取元素n对应的本地名称,基于本地名称调用对应的Java类构造函数,为n创建相应的Java对象,并以n为根元素,按照深度优先遍历次序依次为解析文档中每个元素创建对应Java对象,以实现XML Schema文档到Java代码的转换。
优选的是,其中,在S1中Java类的建立包括:
为与XML Schema标准定义的每种元素定义分别建立对应的元素类;
为与XML Schema标准定义的所有限定元素定义一个共用的限定元素类。
优选的是,其中,所述元素类的定义包括:
S11,对各元素类中对应元素包括的每一个属性,定义相配合的第一变量,同时对第一变量的数据类型和初始值进行定义;
S12,对各元素类中对应元素包括的每一个子元素,定义配合的第二变量,同时对第二变量的数据类型和初始值进行定义;
S13,在各元素类中额外定义与该元素类相配合的三个第三变量及其相关数据类型。
优选的是,其中,所述元素类的定义还包括:
S14,为元素类定义对应的构造函数,包括:
所述第三变量包括三个与该元素类对应的元素a,a的父元素b以及b的根元素c;
基于第三变量的相关参数,将构造函数的相关参数赋值给元素类中相应的变量;
对元素a中的预定的相关属性,在构造函数中对其进行属性判断;
对元素a中的子元素,在构造函数中对其进行子元素判断。
优选的是,其中,所述限定元素类的建立包括:
S15,在限定元素类中为各限定元素的相关属性定义对应变量;
S16,为限定元素类定义构造函数,其包括各限定元素、以及与各限定元素对应的直接父元素类对象,且
在定义构造函数时将各限定元素的参数赋值给限定元素类中与各限定元素对应的变量,并在构造函数中对各限定元素包含的属性进行相应判断。
优选的是,其中,在S1中,还包括定义可供所有的Java类实现的空接口(命名为Thing),以作为Java类构造函数第二传入参数的数据类型,以及存储预定元素类中相关变量的数据类型。
优选的是,其中,在S2中,解析器实例通过将XML Schema文档的URL路径作为参数调用,以实现XML Schema文档的解析。
优选的是,其中,在S3中,对象创建单元接收第一元素n,并为n创建Java对象的过程包括:
S31,接收n后,对其格式或是否是空文档进行判断,若是则结束,否则执行S32;
S32,获取元素n的本地名称,并基于本地名称所表示的类型,传入预定参数至构造函数;
S33,将构造函数的相关参数赋值给类中相应的变量;
S34,依次为元素的每个属性定义相应的属性判别函数,实现对元素所包含属性的处理。
S35,获取元素n的第一个子元素n′,并对n′是否为空进行判断,若其为空,则n′的父元素n的对象创建完成,进入S36,否则进入S37;
S36,若n的本地名称与根元素一致,则认为XML Schema文档中包含所有元素的对象创建完成,程序结束;
否则将创建的元素n的对象,赋值给元素n的父元素类中为n创建的对应变量,然后获取直接在元素n之后的元素n″,并将n″赋值给S35中的n′,再次执行S35;
S37,若n′与特定元素一致,则将元素n′赋值给S32中的元素n,否则执行S38;
S38,获取直接在元素n′的之后的元素n″′,并将n″′赋值给S35中的n′,再次执行S35。
优选的是,其中,在S32中,预定参数的传入包括:
若本地名称表示的是schema元素时,则向构造函数传入的参数为(n,null,null);
若本地名称表示的是除schema外的其它元素,则将(n,this,schema)作为参数传入构造函数;
若本地名称表示的是限定元素,则将(n,this)作为参数传入构造函数;
其中,this表示的是当前对象,schema是元素n所属的XML Schema文档的根元素的对象。
优选的是,其中,在S33中,若该类是元素类,则将构造函数的第三变量中a、b、c的参数分别赋值给类中对应的变量;
若该类是限定元素类,则将构造函数的相应参数赋值给类中相应的变量。
本发明至少包括以下有益效果:
其一,XML Schema文档转换得到的Java对象依照源文档中元素的嵌套关系组织。
其二,在创建Java对象时采用深度优先遍历算法,方法的时间复杂度为O(n),空间复杂度为O(n)。
其三,XML Schema文档转换得到的Java对象中保存了源文档中包含的所有内容。
本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。
附图说明
图1中表格示出的是XML Schema定义的30种元素以及其父元素,属性和子元素;
图2中表格示出的是元素类中为元素属性创建的非String类型的变量;
图3中表格示出的是元素类中为可以出现至少1次或0-n次的子元素定义的变量的数据类型;
图4中表格示出的是XML Schema定义的12种限定元素及其父元素,属性和子元素;
图5是本发明的解析单元解析XML Schema文档并获取解析文档的第一个元素的流程图;
图6是本发明的对象创建单元接收元素n,并为元素n创建Java对象的流程图;
图7是本发明中构造函数中一般属性判断语句执行过程的流程图;
图8是本发明的Union类构造函数中memberTypes属性判断语句执行过程的流程图;
图9是本发明的Schema类构造函数中xmlns属性判断语句执行过程的流程图。
具体实施方式
下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。
应当理解,本文所使用的诸如“具有”、“包含”以及“包括”术语并不配出一个或多个其它元件或其组合的存在或添加。
发明提出的一种将XML Schema文档转换为Java代码的方法,包括:
S1,建立与XML Schema标准定义的30种元素、12种限定元素相对应的Java类,并依据元素、限定元素之间的嵌套关系建立Java类之间的引用关系,其为XML Schema定义的30种元素和12种限定元素定义对应的Java类;
S2,解析单元用Java语言实现DOM编程接口以获取解析器实例,并基于解析器实例对待转换的XML Schema文档进行解析,以获取对应的解析文档以及解析文档的第一个元素n,即解析单元首先使用Java语言实现DOM编程接口,获取解析器实例。然后解析器实例将XML Schema文档的URL路径url作为参数调用parse(URL url)方法实现XML Schema文档的解析,得到解析后的文档。第三获取解析后文档的第一个元素n,将元素n传入对象创建单元(对于格式良好的、非空的XML Schema文档,元素n实际为schema元素,为方便S3描述对象单元创建对象过程,以n命名);
S3,对象创建单元接收第一个元素n,获取n对应的本地名称,并基于本地名称调用对应的Java类构造函数,为n创建相应的Java对象,并以n为根元素,按照深度优先遍历次序依次为解析文档中每个元素创建对应Java对象,其用于使得时间复杂度为O(n),空间复杂度为O(n),以实现XML Schema文档到Java代码的转换。采用这种方案通过XML Schema文档转换得到的Java对象,其依照源文档中元素的嵌套关系组织,使得XML Schema文档转换得到的Java对象中保存了源文档中包含的所有内容,具有可实施效果好,稳定性好,可靠性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S1中Java类的建立包括:
为与XML Schema标准定义的每种元素定义分别建立对应的元素类,即为图1中的每种元素定义一个Java类,以首字母大写的元素名作为类名;
为与XML Schema标准定义的所有限定元素定义一个共用的限定元素类,以Facet为类名。采用这种方案为按照XML Schema的语法结构,为每种元素创建一个对应的Java元素类,为12种限定元素创建一个共用的Java类,以使其嵌套关系相互对应,结构匹配,具有可实施效果好,可操作性强,适应性好的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,所述元素类的定义包括:
S11,对各元素类中对应元素包括的每一个属性,定义相配合的第一变量,同时对第一变量的数据类型和初始值进行定义,对元素的可以包含的每个属性,在元素对应的Java类中定义一个变量,以属性名作为变量名,除图2列举的情况外,在元素类中为元素属性创建的变量的数据类型均为String,初始值为null。具体来说是,对元素的可以包含的每个属性,在元素对应的Java类中定义一个变量,以属性名作为变量名,变量数据类型描述如下:
union元素的memberTypes属性的取值可以是多个简单类型名的组合,简单类型名之间用空白符隔开。因此Union类的memberTypes变量的数据类型是String[],初始值为null。
schema元素的xmlns属性有两种使用情况:一种是表示默认名称空间,属性名是xmlns,默认名称空间在schema元素中最多出现1次;一种是带有名称空间前缀xmlns属性,属性名以”xmlns:”开头,”:”后是名称空间前缀,带有名称空间前缀的xmlns属性在schema元素中可以出现多次。因此在Schema类中定义了一个xmlns变量,数据类型为String,初始值为null,用于存储默认名称空间;一个nameSpace变量,数据类型为HashMap<String,String>,初始值为null,<key,value>存储带有名称空间前缀的xmlns属性的<名称空间,名称空间前缀,>。
S12,对各元素类中对应元素包括的每一个子元素,定义配合的第二变量,同时对第二变量的数据类型和初始值进行定义;除以List<Thing>作为数据类型的变量声明情况外,对元素可以包含的其它每种子元素,在元素类中定义一个变量,变量定义规则如下所示:,
若子元素在元素中可以出现0次或1次,则以子元素名作为变量名,数据类型为子元素类。
若子元素在元素中可以出现至少1次或0-n(n=1,2,3…)次,则以子元素名和字符“s”的组合作为变量名,变量与变量的数据类型的对应关系如图3所示。
元素类中所有为子元素定义的变量初始值均为null。
S13,除属性变量和子元素变量外,在各元素类中额外定义与该元素类相配合的三个第三变量及其相关数据类型:一个element变量,数据类型为Element;一个parent变量,数据类型为Thing;一个schema变量,数据类型为Schema。采用这种方案对元素类中的各属性及子元素等进行定义,使得XML Schema的文档格式中的元素及嵌套关系转换关系更为具化,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,所述元素类的定义还包括:
S14,为元素类定义对应的构造函数,包括:
所述第三变量包括三个与该元素类对应的元素a,a的父元素b以及b的根元素c,即构造函数有三个参数:Element element,Thing parent和Schema schema。第一个参数是与元素类对应的元素,第二个参数是element的直接父元素对象,第三个参数是element的根元素对象;
基于第三变量的相关参数,将构造函数的相关参数赋值给元素类中相应的变量,即将构造函数的element参数赋值给元素类的element变量,将构造函数的parent参数赋值给元素类的parent变量,将构造函数的schema参数赋值给元素类的schema变量;
对元素a中的预定的相关属性,在构造函数中对其进行属性判断即除schema元素xmlns属性、union元素的memberTypes属性以及图2中的变量对应的属性外,对于元素可以包含的每个属性n,在构造函数中定义属性判断语句,其语句块如下所示:
if(element.getAttributeNode("属性n的名字")!=null)类中为属性n定义的变量=element.getAttribute("属性n的名字");
Union类的构造函数为union元素memberTypes属性定义的属性判断语句块如下所示:
if(element.getAttributeNode("memberTypes")!=null)memberTypes=(element.getAttribute("memberTypes")).split("\\s");
在构造函数中为minOccurs属性定义的判断语句块如下所示:
if(element.getAttributeNode("minOccurs")!=null){
minOccurs=
Integer.parseInt(element.getAttribute("minOccurs"));
在构造函数中为maxOccurs属性定义的判断语句块如下所示:
if(element.getAttributeNode("maxOccurs")!=null){
if("unbounded".equals(element.getAttribute("maxOccurs")))
maxOccurs=Integer.MAX_VALUE;
else
maxOccurs=Integer.parseInt(element.getAttribute("maxOccurs"));
}
在构造函数中为数据类型是Boolean的属性变量定义的判断语句块如下所示:
if(element.getAttributeNode("属性名")!=null)
属性变量="true".equals(el.getAttribute("属性名"));
对元素a中的子元素,在构造函数中对其进行子元素判断。在构造函数中定义子元素判断语句,语句块如下所示:
for(Node n=element.getFirstChild();
n!=null;n=n.getNextSibling()){
if(n instanceof Element){
if("子元素名".equals(n.getLocalName())) ①
子元素变量=new子元素类构造函数((Element)n,this,schema);
if("子元素名".equals(n.getLocalName())) ②
子元素变量.add(new子元素类类构造函数((Element)n,this,schema);
if("子元素名".equals(n.getLocalName())) ③
子元素变量.add(new子元素类构造函数((Element)n,this,schema);
或
子元素变量.add(new Facet((Element)n,this);
if("子元素名".equals(n.getLocalName())) ④
子元素类子元素变量1=new子元素类构造函数((Element)n,this,this);
子元素变量.put(子元素变量1.getName(),子元素变量1);
……
}}
语句块中的子元素变量是在类中为子元素定义的变量,类型④中的子元素变量1是为子元素定义的一个临时变量。在构造函数中为元素所有可以出现的子元素都定义判断语句,判断语句分为四种类型。当在类中为子元素定义的变量类型为子元素类时,使用①类型子元素判断语句;当在类中为子元素定义的变量类型为ArrayList<子元素类>时,使用②类型的子元素判断语句;当在类中为子元素定义的变量类型为List<子元素类>或List<Thing>时,使用③类型的子元素判断语句;当在类中为子元素定义的变量类型为LinkedHashMap<String,子元素类>时,使用④类型的子元素判断语句。
需要说明的是:类型③的变量赋值语句有两种情况:Restriction类的构造函数判断restriction元素是否有限定子元素时,使用“子元素变量.add(new Facet((Element)n,this);”赋值语句;其他情况使用“子元素变量.add(new子元素类构造函数((Element)n,this,schema);”赋值语句。
采用这种方案对元素类中的相应的函数进行构造,以使其对应关系更加明确,进一步实现XML Schema文档的转换,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,所述限定元素类的建立包括:
S15,在限定元素类中为各限定元素的相关属性定义对应变量,如图4所示,12种限定元素可以包含的属性相同:一个value属性和一个fixed属性。在Facet类中定义一个String类型的value变量,初始值为null;一个Boolean类型的fixed变量,初始值为false,两个变量分别对应于限定元素的value属性和fixed属性。除此之外,在Facet类中定义三个变量:一个element变量,数据类型为Element;一个parent变量,数据类型为Thing;一个facet变量,数据类型为String;
S16,为限定元素类定义构造函数,其包括各限定元素、以及与各限定元素对应的直接父元素类对象,且
在定义构造函数时将各限定元素的参数赋值给限定元素类中与各限定元素对应的变量,并在构造函数中对各限定元素包含的属性进行相应判断。构造函数有两个参数:Element element,Thing parent,第一个参数是的限定元素,第二个参数是element元素的直接父元素类对象。将构造函数的element参数赋值给Facet类的element变量,将构造函数的parent参数赋值给Facet类的parent变量。获取element的本地名称将其赋值给facet变量。
构造函数中用于判断element元素包含的属性的判断语句如下所示:
if(element.getAttributeNode("value")!=null){
value=element.getAttribute("value");
if(element.getAttributeNode("fixed")!=null)
fixed="true".equals(element.getAttribute("fixed")));
采用这种方案使得XML Schema中限定元素的语法结构及格式与转换后的Java对象相对应,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S1中,还包括定义可供所有的Java类实现的空接口(命名为Thing),以作为Java类构造函数第二传入参数的数据类型,以及存储预定元素类中相关变量的数据类型。Thing接口是一个空接口,元素类和Facet类都实现该接口,该接口在类中有五种用途:
1)在AttributeGroup、ComplexType、Extension、Restriction类中定义一个List<Thing>类型的变量attributes,用于存储attribute和attributeGroup子元素类对象。
2)在Element类中定义一个List<Thing>类型的变量identityConstraints,用于存储key,keyref,unique子元素类对象。
3)在Redefine类中定义一个List<Thing>类型的变量redefineables,用于存储simpleType,complexType,group,attributeGroup子元素类对象。
4)在Sequence和Choice元素的类中定义一个List<Thing>类型的变量modelGroup,用于存储element,group,choice,sequence,any子元素类对象。
5)作为元素类和Facet类构造函数第二个传入参数的数据类型。
采用这种方案通过空接口,以使其在构造函数时的数据传入更加精准,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S2中,解析器实例通过将XML Schema文档的URL路径作为参数调用,以实现XML Schema文档的解析。采用这种方案通过解析器实例调用parse(URL url)方法解析url路径指定的XML Schema文档,将解析结果赋值给Document类型的schemadoc临时变量,以实现对XML Schema文档的解析,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S3中,对象创建单元接收第一元素n,并为n创建Java对象的过程包括:
S31,接收元素n,如果(n!=null&&n instanceof Element)==true为真,执行S32;如果为假,则程序退出。(元素n实际为schema元素,当判断语句为假时,XML Schema文档为空文档或格式不正确);
S32,获取元素n的本地名称,并基于本地名称所表示的类型,传入预定参数至构造函数。若本地名称表示的是schema元素时,则向构造函数传入的参数为(n,null,null);若本地名称表示的是除schema外的其它元素,则将(n,this,schema)作为参数传入构造函数;若本地名称表示的是限定元素,则将(n,this)作为参数传入构造函数。this表示的是当前对象,schema是元素n所属的XML Schema文档的根元素--schema元素的对象,执行S33;
S33,将构造函数的相关参数赋值给类中相应的变量,若该类是元素类,则将构造函数的第一个参数赋值给类中element变量,第二个参数赋值给类中parent变量,第三个参数赋值给类中schema变量;若该类是Facet类,则将构造函数的第一个参数赋值给类中element变量,第二个参数赋值给类中parent变量,执行S34;
S34,依次执行为元素的每个属性定义的属性判别语句,完成元素包含属性的处理,执行S35;
S35,获取元素n的第一个子元素n′,并对n′是否为空进行判断,若其为空,则n′的父元素n的对象创建完成,执行S36,否则执行S37。
S36,若n的本地名称与根元素一致,则认为XML Schema文档中包含所有元素的对象创建完成,程序结束;
否则将创建的元素n的对象,赋值给元素n的父元素类中为n创建的对应变量,然后获取直接在元素n之后的元素n″,并将n″赋值给S35中的n′,再次执行S35。
当(n.getLocalName==”schema”)为真时,则为XML Schema文档中包含的所有元素的对象创建完成,得到一个XML Schema文档根元素—schema元素的对象,schema元素的对象中保存了为XML Schema文档中所有其他元素创建的对象,程序正常结束;
S37,若(n’instanceof Element)==true为真,则将元素n′赋值给S32中的元素n,执行S32,否则执行S38。
S38,获取直接在元素n′的之后的元素n″′,并将n″′赋值给S35中的n′,再次执行S35。采用这种方案对其操作流程进行具化,但不限定于这一种可实施的方式,以使其实现本发明所宣称的将XML schema转换成Java对象,以供进一步对其进行开发、编辑或直接使用,具有可实施效果好,适应性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S32中,预定参数的传入包括:
若本地名称表示的是schema元素时,则向构造函数传入的参数为(n,null,null);
若本地名称表示的是除schema外的其它元素,则将(n,this,schema)作为参数传入构造函数;
若本地名称表示的是限定元素,则将(n,this)作为参数传入构造函数;
其中,this表示的是当前对象,schema是元素n所属的XML Schema文档的根元素的对象。采用这种方案对其进行进一步的具化,以使本发明的目的进一步的得以实现,具有可实施效果好,可操作性强的有利之处,并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
在另一种实例中,在S33中,若该类是元素类,则将构造函数的第三变量中a、b、c的参数分别赋值给类中对应的变量;
若该类是限定元素类,则将构造函数的相应参数赋值给类中相应的变量。采用这种方案对其进行进一步的具化,以使本发明的目的进一步的得以实现,具有可实施效果好,可操作性强的有利之处。并且,这种方式只是一种较佳实例的说明,但并不局限于此。在实施本发明时,可以根据使用者需求进行适当的替换和/或修改。
实施例:
本发明是基于格式正确的XML Schema文档,所谓格式正确是指XML Schema文档中的元素的定义或声明方式和元素间的嵌套关系符合XML Schema语法规则。对于任何格式正确的XML Schema文档,本发明都可以将其转换为Java代码。对于一个格式正确的XMLSchema文档,schema元素是其根元素,即一个格式正确的XML Schema文档的schema元素是任何其它XML Schema文档包含元素的父元素(直接父元素或祖宗元素)。本发明将XMLSchema文档转化为Java代码最终得到一个schema元素的Java对象,该对象中的变量保存了schema的子元素对象信息,子元素对象中的变量保存了子子元素对象信息,依次类推。通过这种嵌套的方式,转换的得到的schema元素的对象既保存了XML Schema文档中的所有内容又保存了元素之间的嵌套关系。本发明可简要的概括为以下三步:
第一步,为XML Schema标准定义元素和限定元素建立对应的Java类,依据标准定义的元素之间的嵌套关系建立Java类之间的引用关系,并定义一个空接口。
第二步,用Java语言实现DOM编程接口以获取解析器实例,用其解析XML Schema文档,获取解析文档和解析文档的第一个元素(命名为n)。
第三步,将第一个元素作为根元素,按照深度优先遍历次序依次为解析文档中每个元素创建Java对象。
图5是本发明的解析XML Schema文档的流程示意图,从图中可以看出:
步骤101、获取XML Schema文档的URL路径。
步骤102、Java语言实现DOM编程接口并获取解析器实例。
步骤103、解析XML Schema文档,获取解析文档。
解析器实例调用parse(URL url)方法解析url路径指定的XML Schema文档,将解析结果赋值给Document类型的schemadoc临时变量。
步骤104、获取schemadoc的第一个元素n。
schemadoc调用getDocumentElement()方法,获取schemadoc的第一个元素,命名为n。(对于任何格式良好且非空的XML Schema文档,n实际是schema元素)。
图6是本发明的创建Java对象的流程示意图,从图中可以看出:
步骤201、接收元素n,元素n是解析XML Schema文档得到的解析文档的第一个元素。
步骤202、判断((n!=null&&n instanceof Element)==true)是否为真,若为真,则执行步骤204;若为假,则执行步骤203。
步骤203、程序中止执行,此时XML Schema文档是空文档或文档格式不正确,程序中止执行。
步骤204、获取元素n的本地名称,元素n调用getLocalName()方法获取元素n的本地名称。
步骤205、调用与本地名称对应的Java类的构造函数,每种元素对应一个元素类,12种限定元素对应着Facet类。当本地名称表示的是元素时,调用对应元素类的构造函数,传入构造函数的参数是:(n,this,schema);当本地名称表示的是schema元素时,传入的构造参数是:(n,null,null);当本地名称表示的是限定元素时,调用Facet类的构造函数,传入构造函数的参数是(n,this)。
步骤206、将构造函数参数赋值给类中对应变量,若该类是元素类,则将构造函数的第一个参数赋值给类中的element变量,第二个参数赋值给类中的parent变量,第三个参数赋值给类中schema变量;若该类是限定元素类,则将构造函数的第一个参数赋值给类中的element变量,第二个参数赋值给类中的parent变量。
步骤207、判断元素包含的属性,在每种Java类的构造函数中都定义了属性判断语句。依次执行这些语句,判断元素包含的属性。对于元素包含的属性,执行赋值语句,将属性的值赋值给类中为该属性定义的变量。
步骤208、获取元素n的第一个子元素n′,元素n调用getFirstChild()方法获取其的第一个子元素,命名为n′。
步骤209、判断元素n′是否是空元素,若为空,则执行步骤210;若非空,则执行步骤214。
若元素n′是步骤208获取的,则元素′是元素n的第一个子元素;若元素n′是步骤213获取的,则元素n′是直接在步骤209上一次判断的元素的父元素之后的元素;若元素n′是步骤215获取的,则n′是直接在步骤209上一次判断元素之后的元素。
步骤210、元素n′的父元素n的对象创建完成,当元素n′为空时,元素n′的父元素n的所有子元素对象创建完成,元素n的对象创建完成。
步骤211、判断元素n是否是schema元素,若是,则执行步骤212;若不是,则执行步骤213。
步骤212、对象创建完成,完成将XML Schema文档转化为Java代码,程序正常结束。
步骤213、将元素n的对象赋值给对应变量并获取直接在元素n后的元素n′;
若元素n不是schema时,首先将为元素n创建的对象赋值给对应的变量,然后元素n调用getNextSibling()方法获取直接在元素n之后的元素n″,执行步骤209。
步骤214、判断n′是否是Element实例;若是,则行步骤204;若不是,则执行步骤215。
步骤215、获取直接在元素n′之后的元素n″′;元素n′调用getNextSib ling()方法获取直接在元素n′之后的元素n″′,执行步骤209。
图7是本发明中构造函数中一般属性判断语句执行过程的流程图,从图中可以看出:
步骤301、依据属性名获取属性n,元素调用getAttributeNode(“属性名”)方法获取元素的属性,命名为n。
步骤302、判断属性n是否为空,若为空,则执行步骤301;若非空,则执行步骤303。
步骤303、获取属性n的属性值,将其赋值给类中对应的属性变量,元素调用getAttribute(“属性名”)方法获取属性值,并将其赋值给在类中为属性定义的变量。执行步骤301。
图8是本发明的Union类构造函数中memberTypes属性判断语句执行过程的流程图,从图中可以看出:
步骤401、获取memberTypes属性;
元素调用getAttributeNode(“memberTypes”)方法获取元素的memberTypes属性。
步骤402、判断memberTypes属性是否为空;
若为空,则执行步骤405;若非空,则执行步骤403。
步骤403、获取memberTypes的属性值;
元素调用getAttribute(“memberTypes”)方法获取memberTypes属性值。
步骤404、属性值按空白符分隔,将分割结果赋值给memberTypes变量
步骤403获取的memberTypes属性值数据类型为String,属性值调用split(“\\s”)对属性值按空白符进行分割,将分割结果赋值给Union类中memberTypes变量。
步骤405、执行其它属性判断语句。
图9是本发明的Schema类构造函数中xmlns属性判断语句执行过程的流程图,从图中可以看出:
步骤501、获取元素的所有属性,存储在NamedNodeMap类型的临时变量node中。定义一个int类型的变量i,初始值为0;
元素调用getAttributes()方法获取元素的所有属性,并存储到node变量中。
步骤502、判断i<node.getLength()是否为真;
若为真,则执行步骤504;若为假,则执行步骤503。
步骤503、执行其它属性判定语句;
步骤504、获取node中索引为i的属性n;
步骤505、获取属性n的属性名name和属性值value;
属性n调用getNodeName()方法获取属性名name,调用getNodeValue()方法获取属性值value。
步骤506、判断name是否以字符串”xmlns”开头;
若是,则执行步骤507;若不是,则执行步骤508。
步骤507、判断name是否以字符串”xmlns:”开头;
若是,则执行步骤509;若不是,则执行步骤510。
步骤508、将变量i的值加1;
对当前属性处理结束后,将变量i的值加1,以获取node中索引为i+1的属性。
步骤509、获取名称空间前缀prefix,将<value,prefix>保存到nameSpace变量中;
name调用substring(6)方法获取名称空间前缀prefix,将<prefix,value>键值对保存到类中nameSpace变量中。
步骤510、将属性值value赋值给类中的xmlns变量;
当属性名以字符串“xmlns”开头,不以“xmlns:”开头时,该属性属性名为“xmlns”。
以上对本发明所提供的一种将XML Schema文档转换为Java代码的方法,进行了详细的介绍。本发明的优点在于,能够完整的为XML Schema文档中的所有元素建立Java对象,并将元素之间的嵌套关系用Java语言描述。该发明的正确性和有效性通过了大量的实验验证,故可以用在实际的XML相关的软件或***的开发中。
故采用本发明,可以将XML Schema文档中的所有内容转化为Java代码,并将元素之间的嵌套关系用Java语言完整的表示。基于本发明,可以开发一系列XML相关软件,例如XML编辑软件、XML验证软件。
这里说明的设备数量和处理规模是用来简化本发明的说明的。对本发明的将XMLSchema文档转换成Java代码的方法的应用、修改和变化对本领域的技术人员来说是显而易见的。
尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用。它完全可以被适用于各种适合本发明的领域。对于熟悉本领域的人员而言,可容易地实现另外的修改。因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。
Claims (9)
1.一种将XML Schema文档转换为Java代码的方法,其特征在于,包括:
S1,建立与XML Schema标准定义的30种元素、12种限定元素相对应的Java类,并依据元素、限定元素之间的嵌套关系建立Java类之间的引用关系;
S2,解析单元用Java语言实现DOM编程接口以获取解析器实例,并基于解析器实例对待转换的XML Schema文档进行解析,以获取对应的解析文档以及解析文档的第一个元素n;
S3,对象创建单元接收第一个元素n,获取元素n的本地名称,基于本地名称调用对应的Java类构造函数,为n创建相应的Java对象,并以n为根元素,按照深度优先遍历次序依次为解析文档中每个元素创建对应Java对象,以实现XML Schema文档到Java代码的转换;
在S3中,对象创建单元接收第一元素n,并为n创建Java对象的过程包括:
S31,接收n后,对其格式或是否是空文档进行判断,若是则结束,否则执行S32;
S32,获取元素n的本地名称,并基于本地名称所表示的类型,传入预定参数至构造函数;
S33,将构造函数的相关参数赋值给类中相应的变量;
S34,依次为元素的每个属性定义相应的属性判别函数,实现对元素所包含属性的处理;
S35,获取元素n的第一个子元素n′,并对n′是否为空进行判断,若其为空,则n′的父元素n的对象创建完成,进入S36,否则进入S37;
S36,若n的本地名称与根元素一致,则认为XML Schema文档中包含所有元素的对象创建完成,程序结束;
否则将创建的元素n的对象,赋值给元素n的父元素类中为n创建的对应变量,然后获取直接在元素n之后的元素n″,并将n″赋值给S35中的n′,再次执行S35;
S37,若n′与特定元素一致,则将元素n′赋值给S32中的元素n,否则执行S38;
S38,获取直接在元素n′的之后的元素n″′,并将n″′赋值给S35中的n′,再次执行S35。
2.如权利要求1所述的将XML Schema文档转换为Java代码的方法,其特征在于,在S1中Java类的建立包括:
为XML Schema标准定义的每种元素分别定义对应的元素类;
为XML Schema标准定义的所有限定元素定义一个共用的限定元素类。
3.如权利要求2所述的将XML Schema文档转换为Java代码的方法,其特征在于,所述元素类的定义包括:
S11,对各元素类中对应元素包括的每一个属性,定义相配合的第一变量,同时对第一变量的数据类型和初始值进行定义;
S12,对各元素类中对应元素包括的每一个子元素,定义配合的第二变量,同时对第二变量的数据类型和初始值进行定义;
S13,在各元素类中额外定义与该元素类相配合的三个第三变量及其相关数据类型。
4.如权利要求3所述的将XML Schema文档转换为Java代码的方法,其特征在于,所述元素类的定义还包括:
S14,为元素类定义对应的构造函数,包括:
所述第三变量包括三个与该元素类对应的元素a,a的父元素b以及b的根元素c;
基于第三变量的相关参数,将构造函数的相关参数赋值给元素类中相应的变量;
对元素a中的预定的相关属性,在构造函数中对其进行属性判断;
对元素a中的子元素,在构造函数中对其进行子元素判断。
5.如权利要求2所述的将XML Schema文档转换为Java代码的方法,其特征在于,所述限定元素类的建立包括:
S15,在限定元素类中为各限定元素的相关属性定义对应变量;
S16,为限定元素类定义构造函数,其包括各限定元素以及与各限定元素对应的直接父元素类对象,且
在构造函数时将各限定元素的参数赋值给限定元素类中与各限定元素对应的变量,并在构造函数中对各限定元素包含的属性进行相应判断。
6.如权利要求1所述的将XML Schema文档转换为Java代码的方法,其特征在于,在S1中,还包括定义可供所有的Java类实现的空接口(命名为Thing),以作为Java类构造函数第二传入参数的数据类型,以及存储预定元素类中相关变量的数据类型。
7.如权利要求1所述的将XML Schema文档转换为Java代码的方法,其特征在于,在S2中,解析器实例通过将XML Schema文档的URL路径作为参数调用,以实现XML Schema文档的解析。
8.如权利要求1所述的将XML Schema文档转换为Java代码的方法,其特征在于,在S32中,预定参数的传入包括:
若本地名称表示的是schema元素时,则向构造函数传入的参数为(n,null,null);
若本地名称表示的是除schema外的其它元素,则将(n,this,schema)作为参数传入构造函数;
若本地名称表示的是限定元素,则将(n,this)作为参数传入构造函数;
其中,this表示的是当前对象,schema是元素n所属的XML Schema文档的根元素的对象。
9.如权利要求1所述的将XML Schema文档转换为Java代码的方法,其特征在于,在S33中,若该类是元素类,则将构造函数的第三变量中a、b、c的参数分别赋值给类中对应的变量;
若该类是限定元素类,则将构造函数的相应参数赋值给类中相应的变量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810193944.3A CN108519964B (zh) | 2018-03-09 | 2018-03-09 | 将XML Schema文档转换为Java代码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810193944.3A CN108519964B (zh) | 2018-03-09 | 2018-03-09 | 将XML Schema文档转换为Java代码的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108519964A CN108519964A (zh) | 2018-09-11 |
CN108519964B true CN108519964B (zh) | 2022-03-04 |
Family
ID=63432720
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810193944.3A Expired - Fee Related CN108519964B (zh) | 2018-03-09 | 2018-03-09 | 将XML Schema文档转换为Java代码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108519964B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111259634B (zh) * | 2020-01-13 | 2023-06-09 | 陕西心像信息科技有限公司 | Xsd格式文件的解析方法及生成方法 |
CN112199556A (zh) * | 2020-10-14 | 2021-01-08 | 深圳市元征科技股份有限公司 | 一种XML Schema文件格式自动转换方法、***及相关设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101339500A (zh) * | 2008-05-22 | 2009-01-07 | 清华大学 | 基于xml模式的数据绑定应用程序接口生成方法 |
CN105302789A (zh) * | 2015-12-03 | 2016-02-03 | 万达信息股份有限公司 | 一种卫生信息共享文档模板缓冲存储的编辑方法 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2349905A1 (en) * | 2001-06-07 | 2002-12-07 | Ibm Canada Limited-Ibm Canada Limitee | System and method of mapping between software objects and structured language element based documents |
CN101699397B (zh) * | 2009-10-09 | 2015-09-16 | 上海宝信软件股份有限公司 | 实现Java与XML数据绑定的方法 |
US8516437B2 (en) * | 2010-01-22 | 2013-08-20 | Ebay Inc. | System and method for creating, managing, and reusing schema type definitions in services oriented architecture services, grouped in the form of libraries |
CN102034049B (zh) * | 2010-12-30 | 2013-05-01 | 华中科技大学 | 海量数据压缩加密存储及检索***及其使用方法 |
CN105843664A (zh) * | 2016-04-20 | 2016-08-10 | 中国工程物理研究院计算机应用研究所 | 一种动态二进制翻译中基于代码热度的翻译缓存管理方法 |
CN107766107A (zh) * | 2017-10-31 | 2018-03-06 | 四川长虹电器股份有限公司 | 基于Xpath 语言的xml文件通用解析器的解析方法 |
-
2018
- 2018-03-09 CN CN201810193944.3A patent/CN108519964B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101339500A (zh) * | 2008-05-22 | 2009-01-07 | 清华大学 | 基于xml模式的数据绑定应用程序接口生成方法 |
CN105302789A (zh) * | 2015-12-03 | 2016-02-03 | 万达信息股份有限公司 | 一种卫生信息共享文档模板缓冲存储的编辑方法 |
Non-Patent Citations (2)
Title |
---|
An Algorithm to Transform XML Schema into Java Codes;Bin JI.etc;《2017 2nd International Conference on Communications》;20171022;第279-282页 * |
Research on XML Schema Transformation Algorithm;Bin JI.etc;《2017 2nd International Conference on Communications, Information Management and Network Security》;20171022;第267-271页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108519964A (zh) | 2018-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Burmako | Scala macros: Let our powers combine! On how rich syntax and static types work with metaprogramming | |
Bravenboer et al. | Concrete syntax for objects: domain-specific language embedding and assimilation without restrictions | |
Benzaken et al. | CDuce: an XML-centric general-purpose language | |
US7774746B2 (en) | Generating a format translator | |
AU2002318459B2 (en) | Programming language extensions for processing data representation language objects and related applications | |
CN100527127C (zh) | 查询中间语言的方法和*** | |
US7340718B2 (en) | Unified rendering | |
Fu et al. | Model checking XML manipulating software | |
US8782619B2 (en) | Extending programming language semantics while maintaining standard syntax through aliasing | |
CA2400590A1 (en) | Method and apparatus for converting legacy programming language data structures to schema definitions | |
Cánovas Izquierdo et al. | A domain specific language for extracting models in software modernization | |
US7505988B2 (en) | XML validation processing | |
CN108519964B (zh) | 将XML Schema文档转换为Java代码的方法 | |
EP0520708B1 (en) | Method and apparatus for converting high level form abstract syntaxes into an intermediate form | |
US20050234924A1 (en) | Automated patching of code for schema derived classes | |
US8650536B2 (en) | Modular server architecture | |
Klempa et al. | JInfer: A framework for XML schema inference | |
Lechner et al. | Translating XQuery into XSLT | |
Zemke | XMLQuery | |
Bravenboer | Exercises in free syntax. syntax definition, parsing, and assimilation of language conglomerates | |
Bravenboer | Connecting XML processing and term rewriting with tree grammars | |
Ranjan et al. | Relational algebra interpreter in context of query languages | |
Lepper | Simple and Effective Relation-Based Approaches To XPath and XSLT Type Checking (Technical Report, Bad Honnef 2015) | |
Kalnins et al. | LINQ as Model Transformation Language for MDD | |
y Widemann et al. | Simple and effective relation-based approaches to XPath and XSLT type checking |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20220304 |