Xml-机器人的制作方法

文档序号:6649331阅读:1287来源:国知局
专利名称:Xml-机器人的制作方法
发明的领域和背景本发明涉及到一种用来直接执行XML文档的方法、系统以及装置,详见权利要求1和7-9。
XML-基础XML被定义为SGML形式的一个子集。简单地说,XML允许按照所谓标注集的方法定义所建立的文档格式。当前的XML既定义了文档的物理结构,又定义了文档的逻辑结构,本发明核心集中在逻辑结构,而在物理结构上使用了预先已有的方法。从物理结构提炼,使用XML来给出文件类型定义(DTD,document type definition)和XML-文档。使用一个特殊的DTDT来区分XML文档中哪些关于T有效,哪些无效。简单的说,所谓DTD T文档,就是那些与T对应有效的文档。在逻辑方面DTD定义了元素与特征。每一个该类型的文档(由DTD方法给出的),所包含的元素和特征的定义情况必须是唯一的,而元素的特征和内容也必须同DTD相匹配。举个例子,一个DTD T定义了一个元素A,其内容包含元素A的从属元素X,Y,Z和特征b和c,它在XML里可以被解释如下<!ELEMENT A(X,Y,Z)><!ATTLIST A b#PCDATAc#PCDATA>在#PCDATA处定义了特征b和c的数据类型。上面用DTD T显示的A文档现在包含了元素A的实例。一个元素A的实例包含一个起始标记符<A...>和一个末尾标记符</A>。在起始标记符中,特征被赋值,在起始标注和末尾标注之间,必须给出组成元素的实例。一个T类型文件必须包含如下所示这样的实例<A b=”string 1”c=”string 2”><X...>...</X><Y...>...</Y><Z...>...</Z></A>其中X,Y和Z实例的准确格式,由对应的DTD T中的元素定义给出。
XML功能的之所以强大,一部分是由于元素组成的定义是允许被递归的,为了说明,一些组成可能性被引入并被用来完成上例。在已经使用的序列(X,Y,Z)中显示了,元素X后跟随着元素Y,元素Y后跟随着元素Z,如上例所示。另一个重要的组成操作是选择(X|Y|Z),它表示对元素X,Y或Z中的一个选择。其他的操作包括+和*操作,表示一个组件的循环。然而,他们在例子并没有被使用。假设Y和Z没有组件(<!ELEMENTY><!ELEMENT Z>),DTDA是通过对X的定义完成的,在这里就使用了对组件的选择和对元素A的递归<!ELEMENTX(Y|A)>。这样X就是Y或者是A。而A类型可能的文档就变成现在这样<A b=”..”c=”..”><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Y></Y><Z></Z></A><A b=”..”c=”..”><Y></Y><Y></Y><Y></Y><Y></Y><Y></Y><Z></Z></A>直到<Y></Y>的无限多次循环。简单地说,没有特殊的组件操作像+和*一样用于上面的循环。<Y></Y>可简写为</Y>。
XML是长期标准化的结果,它现在已被广泛的使用和接受。其现存的应用,按照当前的技术,可以被分成两个不同的基础类型数据交换和文档发布。在数据交换应用中,XML被用来定义数据格式,以便在两个程序之间交换复杂的数据。此外,在一个相关联数据库系统中,XML还被用来作为存储数据的交换格式。这样的例子包括XML-data(Microsoft),MCF(Netscape),和RDF(WBC)的格式。在文档发布应用中,XML是一种理想的数据语言,可以用来构建所有种类的文档格式。主要的思想是将文档的逻辑内容放入一个XML-文档,并将其一般性规划信息传给DTD。这种一般规划性语言的例子包括CSS或XSL。其一般性规划的输出可以分别通过HTTP,SPDL,或者Postscript方式。XML处理现存的软件和应用程序正使用XML来表示数据和文档,这些文档和数据随后被一般目的性编程语言处理。现有的处理XML-文档的方案可以分为事件驱动和树操作技术,这与它是否应用于数据交换领域或是文档发布领域无关。在一个事件驱动的方法中,文档按严格的次序被处理。数据流中的每一个元素都被当成是一个事件触发器,它会触发在应用程序中某个部分的某个特定行动。SAX的应用程序接口(API,application programmerinterface)可以被用来在现有的编程语言中实现事件驱动。树的应用是通过访问一个结构树的形式访问完整的文档。基本上XML-文档的元素就是树的节点。每个元素的组件就是该节点的子节点。常被用来访问这样的树的API是DOM。使用API的不利之处在于,形成了普通用途编程的所有复杂性,尤其是系统和平台的依赖性、可靠性和安全性而导致软件的庞大与复杂。一些XML工具通过为数据交换或文档发布生成专用代码来掩盖这种复杂性。尽管它们能够帮助在传统编程语言中很容易的生成一个程序模式,但它们并没有完全从对明确的程序的使用中抽象出来,来引导必须被处理的文件。XML对比传统性编程与传统结构概念相联系的一个重点正如面向对象的程序设计方法一样。两种方法使用的都是未结构化的数据源,这可以理解为这样的数据没有按某个生成规则给出,比如使用定义的程序结构的XML或是BNF规则的元素定义。这样的数据源,在传统编程的情况下,用于与一个结构相关联,但是却又独立于程序。另一方面,面向对象的程序设计方法结合了含有数据目标的结构化程序代码段。但是目标空间(数据)没有被结构化在上述的程序中。这样,当然有可能使用与这些方法相关联的结构化数据模型。但是,在另一种情况下,由于程序结构独立于数据结构,从而需要进行像上面所提到的复杂的处理。事实上,在当前对XML-文档处理的情况中包含了两个独立的结构,一个是XML-文档而另一个是处理它的程序。这种应用主要有两种不利因素(a)如果一个程序员打算可靠地处理一个DTD在所有情况下的完整结构,这样的代码将会由于对应XML-文档的不同和任务的复杂性而无法完成。(b)处理XML-文档的程序被典型化设计为处理某一DTD的所有文档,从而由于代码的固有一般特性而增加了程序的复杂性。
发明的目的本发明的目的是建立一种方法、系统和装置,通过将数据和软件合并到一个整体结构中,来改进对XML-文档的处理,从而减少或避免复杂性、和/或在数据处理中对编程基本知识的要求以及对现存XML-文档的再使用。
本发明的另一个目的是提供一种新的并且是全面的方法、系统和装置来为XML-文档生成这种整体化的数据和软件结构。本发明更进一步的另一个目的是提供一种新颖的方法、系统和装置来直接执行标准化文档结构,比如说,XML-文档。发明概述本发明对上述问题的解决在权利要求1和7-9中有详细解释。
本发明的思想是基于一种新的方法/系统,在一对并列的整体结构中使用执行软件和数据。当前本发明可能会被当作是一种应用程序,但是并不属于上面所提到的应用范畴,如程序交换或是文档发布。与这些现存的应用程序对比,本发明提供了一种方法和装置直接执行(或是处理)一个XML-文档。
当前,发明再使用了现存的XML-文档结构从而避免了使用一个新的结构和编程概念来处理上述文档。在本发明的创造性方法中,为每一个文档定义了一个程序(而不是为每一个DTD定义一个程序)从而大大减少了处理的复杂性。
直接执行XML-文档的功能,是通过分别定义每一个标识符或每一个代码的特性和作用,并以此来修饰一个已给出的XML-文档和/或它的文件类型定义(DTD)而实现的。
通过将程序结构合成指定串/并行控制和数据流的文本格式和/或图形化流程图,来实现这一功能。特别是,它是通过将一个XML-机器人的实例化结构应用于一个特定的XML-文档的方法来实现的。其结果是生成一个可执行的XML-文档,其中包含了上述XML-文档的完整执行特征。
本发明的一个最佳实施例是应用了一个独特而全面性的DTD来具体指定为XML-机器人模块使用的模块结构。通过将XML-机器人所给出的程序和规范应用于XML-文档,就可以来处理一个特殊的XML-文档。从而,通过直接实现XML-文档的执行来将各个模块合并到上述XML-文档的结构中。在制作中依靠几个函数(初始的)来定义如何接口和如何修改一个给定的XML-文档。此外,用一个特定的流程图来定义上述XML-文档的执行过程。这些基本的独创的定义是完整的。在某种意义上来说,按照本发明给出的XML-机器人示例通向直接执行。
本发明的另一个最佳实施例是使用图像化流程图(GFC)的方法来提供一个给定的XML-文档的每一种元素的完整信息。这种GFC定义了分别通过元素和组件的控制流,以及在控制流中执行的动作。当到达GFC的某一状态时,动作被执行,数据流被发出。GFC的例子包括流程图,有限状态机器,状态图,UML状态机器,所有的Petri网,UML动作框图和其他类型的计算机模型。通过将XML-文档表示为一个结构树,本实施例可以用纯图表的方式来定义和解释,从而为XML-机器人提供一个先进的可视化综合发展环境。另一方面,连续GFC模型(流程图,有限状态机器)按状态执行动作,这种图像方法可以直接映射成文本格式方法。此外本实施例可以被推广到一种允许并行(例如允许平行执行多重动作)和有向动作(如有限状态机器的转变运动)的模式中去。本实施例中所有这些不同都可以通过使用GFC在方法中被映射出来。
这两种实施例的特征在于具有一种模块结构,每一个模块用一个特定标记符,如<A...>,来定义所有元素的执行特征,以及这些元素组件的执行特征,此外通过其他标记符,如<B...>,来添加元素所有情况的执行特征。一个模块中的所有信息,无论是文本还是图像都与一种描述该类元素的实例(<A...>)相关联,叫做self元素。在所有方法中,初始值被用来连接外部函数,引导文件/树结构,涉及某一种元素(<A...>)的所有情况以及定义文档/树的附加特征,它的定义已经在一个纯函数层中被给出了。如果存在一个将被执行的XML-文档的DTD,这个DTD明确提供了元素种类存在的特征,以及那些组件现在是属于这些类的。从而,这样的一个DTD就为书写一个XML-机器人规范提供了结构和指导。虽然两个实施例都不直接依赖于一个的DTD工作,但是还是使用了一个DTD来定义和规范下面所描述的第一种方法。此外,它必须是一个简单的,源于一个没有DTD化的XML-文档的DTD。
在最佳实施例中,其结果由动态创建的和重定义的文档元素特征/结构树节点储存。另外地,基于事件的模式和纯函数/声明的模式可能还是最好的。然而,动态处理信息还是由现存的文档/结构树给出更合适。理解这点很重要,即与现存的处理模式相反,XML-文档或是其结构树直接被用来当作一个作为XML-文档的执行特征定义的GFC(或是一个相应的文本格式)的基础。因此,一个这样的XML-机器人就是应用XML技术和处理XML-文档的基本的新方法。
由于本发明没有限定特定的平台或具体的处理执行方式,例如现存的API如SAX和DOM,其中给出的规范必须是从具体的形式中抽象出来的。然而,使用的原始部分已被定义以便于执行。更进一步的,本发明的初始值被定义为任意可执行的。而且发明并不限定特定的编程语言来实现流程图或实现其他的结构,比如,是否生成中间媒介形式/结果,XML-文档是分别由编译语言执行的,还是解释语言执行的,抑或两者共同执行的。参考附图对实施例的简要描述图1显示一个名叫“query”的DTD实例图2显示一个与图1所示DTD实例对应有效的XML-文档图3显示图2所示的XML-文档的树型结构,该文档被包含在图一给出的DTD“query”中图4显示一个图像化规范,与它的对应的DTD情况见图1图5显示一个规范模块,其中压缩了图4左边关于“query”元素定义的信息图6显示元素“setpoints”和“action”的规范化模块图7显示每个元素定义的局部GFC是如何包含结构树中一个元素的每一种情况的。图8显示如何实现局部GFC同全球层次GFC的连接图9显示定义模块结构的独特的DTD图10-15显示使用流程图定义一个给定XML-文档的执行,该文档使用了与DTD XML-机器人.dtd对应的有效模块图16-18显示图1所示模块实例的文本说明图19a-19b举例说明一个确定的XML-机器人规范是如何执行的图20显示一种实施例的概述,适合于最佳实施例的基于网络的XML-机器人描述本发明的最佳实施例在下文涉及的


中将详述。
本发明实现了一个XML-文档的直接执行。接下来的实施例中描述了对其手段,系统和工具的图像和文字实现。虽然后面的例子是关于一个已知DTD的XML-文档的,但是必须理解的一点是,出于考虑到某些不利之处,如不明确的结果,本发明允许在未知DTD的情况下处理XML-文档。无论何种DTD(如果预先知道)或是XML-文档都被直接合并成XML-机器人规范(对DTD或XML-文档的“修饰”)。如上面所描述的,本发明是基本上独立于具体的媒介(平台,编程语言,结构化形式如存储和处理)的。然而,在需要的地方,最佳实施例使用了下面所描述的确定的媒介。
参考图1至8介绍本发明的第一图示实施例。
图1显示一个DTD例子的元素query,它包含三个组件,两个是动作类型而一个是query类型的可选择组件。元素query的特征清单包含一个特征问题,一个必需的特征数据。元素的行动由元素setpoint或query确定。元素setpoint没有组件只是个单一特征点。
图2显示了一个与图1中的DTD例子对应的有效文档,在图1中可查到这个叫做“query.dtd”的DTD。这个实例提供了一个实例文档,用于在下文中进行更深入的表述。
图3显示了一个与图2文档相对应的可能的特征结构树画法。这样一个特征结构树是对XML-文档的一种选择性图像表述。节点1和3是元素query的实例。它们有两个必需的子行动即s1-行动和s2-行动,而对query子行动并没有进行选择。如果要对一个query的子节点进行选择,即用到S-query。节点2,4和5是元素setpoint的实例,它没有子节点。在方框中可见它的特征和数值。
图4显示了一个DTD的执行规范和DTD实例的执行之间的关系。规格包括纯粹的DTD定义和最合适的图像化流程图(GFC),以及到达流程图某一状态所触发的动作。左边的方框显示了一个DTD执行规范,它被结构化成纯DTD组件,图像化流程图定义(形象描述)和转换规则。后者在控制流通过图表的时候被激活。作为一种选择,同样的规范可以应用于没有DTD的XML-文档的元素实例。
右边的方框中图解了这个结构是如何代表XML-文档的直接执行的。DTD如果存在的话,就被用来验证XML-文档。一个特征结构树(AST)被建立。GFC被用来修饰这个AST,从而生成一个整体流程图对应于分解的XML-文档。文档的执行是通过执行GFC完成的,例如,与GFC特定状态相关的动作触发和伴随GFC状况的控制流处理。
一个完整的执行规范被结构化成许多规范模块。每一个规范模块对应于一个描述元素执行特征的元素声明,和附加的该元素组件的执行特征以及其他元素类的实例。
图5给出了一个例子,显示了图1中query元素的规范模块。模块最上面的部分包含了相关的元素和特征定义。中间部分给出了一个GFC段,它指定了元素query实例的执行特性。GFC段用图像表述的最佳方法给出。最后,在图5的底部显示的是转换规则。
现在详细说明一下在图4和图5中涉及的,对图1DTD示例的最佳图像表示方法。例子描述了伴随连续控制的GFC,与有限状态机,状态图,正规流程图,或UML状态机相似。分散的GFC工作程序同Petr1网的变量,或UML动态图表类似。在这种方法中一个XML-文档的执行特征,由一个连续的,其状态与动作相关联的图像化流程图给出。在选择性实施例中,GFC的箭头可以代表动作。在当前示例的实施例中,处于GFC的任意状态下,当一种状态转变成下一种状态时,相应的行动就会被实施。同其他的基于状态的形式体系中(如Harel’s状态图)相似,当前的GFC控制箭头可以用布尔变量标志,它被用以监测控制流来确定标注为何被省略。一个没有标注的控制箭头有其缺省特征,例如,如果从箭头源中引出的其他箭头都没有被设为真,那么无标注的箭头就为真。
一个如图4左边所示的DTD特征规范中包含三个部分DTD的自身定义,一个代表GFC的可视化的符号,以及动作规范。另外可能还有一个在制作前计算附加特性的规范,它可能以函数形式给出。还有安全条件,由DTD和附加导出特征规范做出的特征定义给出。DTD被用来生成一个剖析算法,然后按照规范的方法将被剖析的XML-文档绘制成一个AST。规范的第二部分描述了与GFC状态转变相关的控制流。关于DTD声明中每一个元素的图像化描述,定义了一个局部GFC,并进而指定了该GFC如何通过一个AST修饰嵌入到全局GFC中去。这一部分的最后,AST的每一个节点都被一个GFC段复本的图像说明所修饰。一个节点的子部分引用,定义了一个全局GFC的相应结构,在下面(如图7和8)解释了它的执行。最后一部分包含转换规则,指定在文档执行过程中的动作的触发。GFC的任何一个状态都同一个转换规则对应,当到达这一状态时,就会套用该规则。GFC的转化是有条件的,其条件是从AST节点中建立的。
图5的GFC包含了一个圆形节点,它代表名叫“ask”的状态。如果到达这个状态,在模块中最下面所示的相应的行动就会被触发。之后,控制信息将会流向标有S1-action的框图或是标有S2-action的框图,具体流向由箭头上标注的条件决定。框图表示了对应于子节点的GFC,这些子节点由标签引用。I和T箭头表示控制流的入口和出口。
在第一实施例中,像后者所描述的一样,I和T被看作是一种标准状态叫做“起点initial”和“终点terminal”。此外,进入框图的箭头必须被明确指向框图的“initial”状态,而离开框图的箭头必须从框图的“terminal”状态离开。联系图1至8,用文本格式表示GFC,这样的对应关系就很容易理解。
图6显示了图1中的DTD示例的模块action和setpoint的规范。Action就是在setpoint和query中做选择,从而它继承了这些元素定义的GFC定义。setpoint元素模块引入了一个仅包含一个状态的微型GFC,它的响应动作就是增加一个点计数器的值,具体增加的数值是由特征点给出的。
如注释,每个规范模块中的可视化符号包含了的局部GFC的信息,该GFC是同AST的每个节点相对应的,而该AST是与规范模块,以及将这个GFC嵌入到对应输入文档的全局GFC中所需的信息相对应的。
图7显示了来源于每个图像化表述的图像化片段是怎样与示例文件的AST节点建立连接的。并且举例说明,通过将图5和图6所示的GFC同AST相应的节点相匹配,一个全局GFC是如何被一个AST所包含的。一个中间包含了模块query(如图5)的GFC片段的两个实例,和模块setpoint(如图6)的微型GFC片段的3个实例。本图再次用图像表示法显示了对每个AST节点的修饰。这种图像修饰可以更好的获得控制流。然而,必须理解的是,本发明也可以应用于其他情况,即用文本程序指令或其他手段来取代本例中的用图像化流程图所获得的控制流和动作触发。
图8显示了一个由这些片段相互嵌套形成的分级GFC。图7中的GFC片段包含了引用子节点的框图,通过分解这些引用来完成嵌套。
在接下来的说明书中,将对用于控制流的可视化符号,给出一个更详细解释。在说明书模块中使用的图像化符号的含义可以被表述如下有两种节点椭圆框和方框。椭圆框表示GFC的一般状态。同时他们还标有一个动作名,该动作(由转化规则指定)在到达该状态时被激发。方框图对应特殊的状态,这些状态自身就是GFC。另外方框还同AST节点相对应。这种GFC中的特殊状态和AST中的节点之间直接的一一对应关系是,AST结构和执行特征结构的标识的详细方法。当然,被描述的方框的用途,对它们的组件的引用以及结构之间一一对应的关系,都是独立于GFC,流条件以及行动的具体构成的。
方框图就是GFC,它对应着元素定义右边的组件。这些GFC的定义是由分别对应各个元素的说明模块给出的。箭头指向生成的GFC的分级状态转化图框的边缘。箭头的来源和目标可以是椭圆框或方框。除此以外,还有两个箭头,一个的来源被标志为I(作为起点),它的目标是一个方框或一个椭圆框,另一个的目标被标志为T(作为终点),它的来源是一个方框或椭圆框。标志有I的箭头代表局部GFC的输入端,标志有T的箭头代表其输出端。一个向GFC特殊状态的转变引发了一个输入,进入这个特殊状态的GFC的第一个状态(由箭头I标志)。在每个规范模块的可视化描述中,方框是对相应的GFC的引用。对图7所示的被修饰的文档例子的引用进行分解,生成了如图8所示的GFC。所生成的这个分级GFC给出了XML-文档的执行特征,并且该分级GFC的直接执行是可能的,从而允许直接执行XML-文档。直接执行XML-文档的能力并不依赖于特定的,在最佳实施例所显示的那一类GFC,任意形式的GFC都适用。
在例子所示的GFC的形式中,就像在状态图中,从初始状态进入一个分级状态,由一个箭头I来表示。如果到达末状态(由输出箭头T标志),那么就实现了向一个高一级状态的转化。
这样一个如图8所示的分级GFC的工作如下。控制进入结构树的根部,例如,节点1。相应的GFC的初始状态就是节点1中的询问状态。这个节点中的问题是“Is Paris the Capital of France?”。在触发了询问行动之后,就要给出回答“是”或“否”。如果回答等于“是”,控制沿着上面一条控制箭头离开询问状态,进入特殊状态2。特殊状态2的起始状态和末端状态是固定动作。当执行了固定动作之后,离开特殊状态2,访问子节点(任意的,事实上不存在的)S-query,并不触发任何动作,就离开了特殊状态1。如果在特殊状态1的询问状态中回答“否”,就进入了特殊状态3,特殊状态3的初始询问状态被访问。这次提出的问题是“Are you sure?”。如果答案坚持“是”,点计数器就被置为0,反之则置为1(特殊状态4和5)。
在发明的最佳实施例中,使用数据块的方法来处理上述状态。动作的转化规则重新定义了这些数据块中每一点的内容。通过假设一个必要的编程系统的简单模型,将有助于更好的理解它。系统状态由一个多维数据库给出。数据库包含了n-维块。一个n-维块f的内容可以从下面的条件f(t1;:::;tn)读出,其中t1;:::;tn是建立在数据库块基础上的条件。一个一般变量对应一个0-维块,反之一个列和记录集可以被模型化成1-维块。
可能储存在块中的数值会包含很多常见的数据类型像整型、实型、布尔变量或其他在一个特定应用中需要的类型,例如结构树节点或动态生成的对象。结构树节点的特征被模型化成一维块,而节点n中特征a的值可以通过条件a(n)得到。为了方便,在特征语法和面向对象的程序中使用了点这个符号,例如用n.a来替代a(n)使用。
举个例子,一个基本的更新规则的形式如f(t1;:::;tn)=v,其中f(t1;:::;tn)和v都是基于系统中块建立的条件。这个规则的含义是通过对v进行调整,来更新块f。规则可以由串接或是并列的方式组成,以便于一次执行完相应的更新。除了上面提到的基本转化规则之外,还可以存在其它的转化规则,例如依靠布尔变量的条件来激活的条件化规则,允许对所有某一类元素使用同样的规则的全局有效规则,允许从一类元素中选择其中的一个的选择性规则,而最后是用来引入新的元素的扩展规则。转化规则是在这些规则之上递归建立的。
下面详述转换规则的执行过程,依然是引用图8。用图5和图6的图像化表述中的动作规则来描述简单程序的执行是可能的。初始状态是一个被标志为动作ask的简单状态,它的入口在属于AST根节点的图像片段中,由箭头I标出。询问动作在前面所提到的query-模块(如图3)中指定,其结果是将问题打印出来,可用的特征问题是“Is Paris the Capital ofFrance?”。然后获取一个用户输入(例如get(stdin))并将特征答案作为输入。这个动作之后规则就被执行了,从这个状态出发的输出箭头情况被确定。从询问状态引出两个箭头,一个标志着条件答案=“是”,另一个标志着条件答案=“否”。根据答案的值选择相应的箭头,通向特殊状态节点2,或是特殊状态节点3。假定答案是“否”,那么就要沿着下面的箭头,进入特殊状态3。因为这是一个特殊状态,它导致一系列的转化,这些转化是沿着组成该特殊状态的流程图进行的。在这种情况下,进入这个特殊状态的初始状态还是一个用椭圆表示的简单状态,它也再一次被标志为动作ask。这一次打印出来的特征问题是“Are you sure?”,根据用户的答案的不同,接下来将紧跟着节点4或节点5。这些节点就是特殊状态,它包含一个被标志为动作set的单一状态。该动作把由得分特征确定的得分值添加到0-维块中去。这样,在初始问题中回答“是”的用户得到10分,一个先回答“否”,又选择了“是”的用户得0分,第一次回答“否”而第二次回答“否”的用户得1分。按照生成的GFC结构,第一次回答了“是”的用户就不会被问及第二个问题。
更抽象一些,一个XML-文档被执行,是通过像上面叙述的那样,通过生成它的GFC,然后从它的根元素的初始状态(或同时执行的状态)开始。初始状态是在特殊状态的入口,对应文档的根部,顺着箭头I。如果箭头I指向一个普通的状态,就进入这个状态,否则就沿着箭头I按递归原则向下走。如果初始状态被进入,那么它的动作就被触发。然后评估流出控制箭头上的条件,选择符合条件的一个箭头(或同一情况的多个箭头)。如果该箭头指向一个一般状态,该状态被执行,程序被重复。如果箭头指向一个特殊状态,沿I-箭头递归向下,至下一个状态执行,程序被重复。如果箭头是一个T箭头,那么退出特殊状态,选择一个拥有合适条件的特殊状态输出箭头。然后像上文所描述的那样沿该箭头进行下去。
这样,一个XML-元素定义的动作组成,可通过图像化和/或文本化的,连续或并行的控制和/或数据流程图来表述。特殊的文本化和/或图像化方法被用来代表XML-元素定义的组件,允许组件动作同步或不同步执行,以便于由每个元素定义中的组件给出的文档结构,在由组件动作的触发给出执行结构中能被直接再使用。此外,特殊的、被用来定义动作成分的连续或并行的执行顺序的图像化和/或文本化方法,和用来保证指定顺序的执行路径的条件一起给出。这些特殊的图像化和/或文本化方法可能被包含在条件和行动的定义中,或定义合并行动的节点引用中,用来引用它的组件,和引用它的特征,组件和特征由XML-特征定义给出。
参考图9到18为对本发明第二文本实施例的描述。
图9显示了发明中表示XML-文档执行特征的XML-机器人模块的特殊而全面的DTD。在下文图9ff的引用中,对一个用文本实现发明的实施例进行了更详细的描述。为了描述图9ff,所必需的语法和主要的函数将首先在下面被定义和解释。下面的定义其重点集中于文本化(基于文本的)实现。
一个要被执行的XML-文档名叫“doc.xml”,而XML-机器人由文档所定义,如果元素名为X,给出的文件名就为“moduleX.xml”的。此外,假定所有这些文件可以被图10ff所示的流程图随意替换,来解释doc.xml的执行。执行的状态内包含了上面提及的文档,以及十一个全局变量,分别命名为cur,mod,state,derived,subcur,submod,curstate,action,trans,src,和trg。通过新建和重定义特征,通过将元素状态模块传送到文档“doc.xml”中去,执行改变了上述给出的文档。此外在执行中重定义(更新)全局变量的值。例如,如果在当前执行状态中,变量cur的值为v1,执行更新cur=v2的结果就是进入了一个新状态,在该状态中变量cur的值为v2。在前面的定义中,全局变量的值在XML-文档中或由undef中给出。
前面所描述的标准化结构被用来处理XML-文档,其中的元素的起始和末尾的标注形式如<A...>...</A>。元素的引用即文档中的指示器。引用的实现,可以通过(a)使用文本定位(如果过多的文本被粘贴到文档中将会促进它们的更新),(b)在XML-链接定义中现存的引用机制,(c)指向在XML-结构树的一个目标模型中的目标的指示器,如DOM,或是在使用GFC的实施例中描述的树。
为了更好的理解执行过程,重点将集中于上述元素的特征。举个例子,一个元素A的特征aa通过如下语句赋值为“13”<A aa=“13”>...</A>。为了读出特征值,给出了一个函数evalAttr(_,_),有两个变量,分别代表一个元素名和一个特征名,并返回一个特征的值。假设doc.xml包含上述元素A,r是这个元素的引用,条件evalAttr(r,“aa”)被赋值为“13”。语句“r.evalAttr(“aa”)”,同evalAttr(r,“aa”)等价,其他动作的类似语法也被用于图10ff中,以方便描述。
在下面这一段中描述的XML-文档的执行,需要动态更新和/或创建的特征。这样,就给出了一个函数setAttr(_,_,_),它包含3个变量第一个是一个元素的引用,第二个是一个特征名,第三个是要被更新(新建)的新的(初始的)特征值。例如,动作r.setAttr(“aa”,“15”)将文档doc.xml中,上述被r引用的元素A,变为形如<A aa=“15”>...</A>。一个动作r.setAttr(“bb”,“7”)变换文档doc.xml中r所引用的元素为形如<A aa=“15”bb=“7”>...</A>。如果这两个动作被按任一次序触发,其结果都是使r所引用的元素形式变为<A aa=“15”bb=“7”>...</A>。在这一方法中,被引用的元素是物理文档的一部分,如doc.xml。对上述元素的变换将造成XML-文档的破坏性的、不可逆的变化。
此外,除了XML中存在的标准值v以外,像字符串和数字,特征还可以通过引用文档中(其他)的元素来赋值,例如,在上面例子中的引用r。正如所提到的,这样的引用可以通过不同的方式来实现,动作r1.setAttr(a,v)的执行使得条件r1.evalAttr(a)的状态值被定为v,直到另一个动作r1.setAttr(a,v’)被触发,它基于同一个元素,同一个特征,但有不同的值v’。
动作“Pasteinside”被用来把文本粘贴进一个XML-文档。它有两个变量,第一个代表一个元素,而第二个是要被粘贴的文本。文本被粘贴在指定元素的起始标注之后。再次使用引用r,动作r.Pasteinside(“textsample”)将doc.xml中元素A的引用变换成了如下形式<A aa=“13”>textsample...</A>
动作“Copy”被用来在引用中添加一个字符串。再次使用指向doc.xml中元素A的引用r这个例子,条件r.copy定义字符串为“<A aa=13>...</A>”,它与元素引用的语法相同,但物理结构不同。如果这个元素被复制,元素特征保持不变,但被复制元素的引用仅指向复制源。
上述动作Pasteinside和Copy被用来从一个文档中复制一部分到另一个文档。给出两个文档doc1.XML<A>
<B><A></A>
</B>
</A>doc2.XML<C>
<D><C a=””12””b=””2””>
<D></D>
</C>
</D>
</C>和引用r1指向文档doc1.XML的元素B。r2指向doc2.XML的内部元素C,动作r1.pasteinside(r2.copy)导致了一种变换doc1.XML<A>
<B><A></A>
<C a=”12”b=”2”>
<D></D>
</C>
</B>
</A>doc2.XML保持不变。元素C的特征被r2引用,是复制的,但是在doc2.XML中的引用没有改变。
给出一个物理文档,例如,文件doc.xml(或者模块XYZ.xml的一个文件),条件getRef(“doc.xml”)得到一个对文件根部的引用,例如,最外一层的一对开始/结束标注符。此外,条件r.getLabel得到被r引用的元素的名称。在上面的关于doc1.XML和doc2.XML的例子中,r1.getLabel得到了“B”而r2.getLabel得到了“C”。
XML-文档内的定位用函数getFirst(_,_),getNext(_),和parent(_)。这3个函数的第一个变量是一个由引用r给出的XML-文档中的一个内部元素的引用,例如,r.getFirst(″A″)为在r的开始和结束标注之间的第一个直系元素引用定值。没有考虑嵌套的情况。在doc1.XML和doc2.XML的例子中,引用r1可以通过使用条件函数getRef(″doc1.XML″)获得,引用r2可以通过使用条件函数getRef(“doc2.XML”)获得。
如果没有所要求名字的元素,getFirst会按undef确定。此外getRef并不涉及嵌套的元素。在上面的例子中,getRef(doc1.XML).getFirst(″A″)并没有得到在内部A元素的引用,而是得到undef中的定义。为了得到内部A元素的引用,必须使用getRef(doc1.XML).getFirst(“B”).getFirst(“A”)。
如果存在这样一个元素的话,函数getNext(_,_)返回下一个有同样标记的元素的引用,否则就返回undef。下面给出一个XML-片段的引用。<A>
<B x=”1”></B>
<B x=”2”><B x=”3”></B></B>
<b x=”4”></B></A>引用r.getFirst(”B”)取出B-元素的x=”1”,引用r.getFirst(”B”).getNext取出B-元素的x=”2”,引用r.getFirst(”B”).getNext.getNext取出B-元素的x=”4”,为了取出B-元素中的x=”3”,就必须写成r.getFirst(”B”).getNext..getFirst(”B”)。
函数“parent”对一个元素的引用映射到最小封闭元素的引用。在doc1.XML和doc.XML的例子中,r1.parent=getRef(“doc1.XML”)而rl.parent=getRef(“doc1.XML”)。
函数“<CopyList(_,_)”的第一个变量是一个引用,第二个变量是一个元素名。r.CopyList(a)将r中所有直属的(不是嵌套的)元素A集合成一个字符串。因此,在上面所举的getNext例子段中,r.CopyList生成了一个字符串“<B x=”1”></B><B x=”2”><B x=”3”><</B></B><B x=”4”></B>”,包含3个B元素,其中第二个包含了一个相同的而嵌套的B元素。
最后给出的是函数traverse。从根部的说明开始,traverse按某种顺序列举了文档中所有的元素。
现在,在图9中,定义DTD的模块。这个DTD中的元素在下面逐一被解释。有代表性的是,模块是由不同的模块文件给出。当然,DTD必须由唯一的根元素来完成。然而,一个有所有模块清单的完整语言可以被一个DTD包含。最上端的模块元素就是这些模块文件的根部。
一个模块的组件包括一个导出特征清单,一个选择表达式,一个状态清单和一个模块清单(下级模块)。名字特征告诉元素哪个模块是可用的。定义是基于假设在当前被处理文档中有一个元素“X”,这样的XML-文档名为“moduleX.xml”,它的根元素是一个“module”元素,上述根元素有一个“name”特征,它的值是“X”。
<!element module(derived*,expression?,state*,module*)>
<!attlist module name CDATA#REQUIREDnumber CDATA“1”>
导出特征的清单中包含特征定义,这些特征定义由调用其他特征定义的函数给出。选择表达式给出一个安全条件,该条件必须在该一个元素的每一种情况中实现。状态清单指的是这样一个元素的每一种情况的(非嵌套的)状态。最后,模块清单指向元素的每一个模块,其中的每一个下级模块都包含状态和更下一级的模块。对下级模块而言,其数字特征表示它代表那一种情况。如果它代表第一种情况,数字值就定为“1”,等等。如果它代表所有情况,数字值就定为“all”。
<!element derived(argument*,expression)>
<!attlist derived name CDATA>
<!element argument EMPTY>
<!attlist argument name CDATA>
一个导出特征定义由两个部分组成变量,在定义和当前的定义中用到的,由表达式的形式给出;名字特征,给出了导出特征名。一个导出特征通过确定变量值和给定义表达式赋值来确定其属性。
一个状态的组件包含一个动作清单,如果到达该状态就被触发;和一个从该状态出发的转化清单。状态名被用来作为某些转化的目标来引用。<!element state(action*,transition)><!attlist state name CDATA>
一个转化有两个组件,一个是表达式,用来对转化提供保护;另一个是路径,用来指示转化的目标。所有导出函数的表达式,路径,动作和定义取决于它们的初始端,即模块的根,也就是在将被执行的XML-文档中它的各个情况。<!element transition(expression,path)>
一个路径包括一个选择性组件,和一个特征状态。状态表示了路径指向的状态的名称。典型的状态如表示初始状态的“initial”,和表示结束状态的“terminal”。组件指向被嵌套的组件,特征数字再一次表示被选择的实例。如果数字的值是“all”,路径就对应指向所有实例的路径集合。<!element path(component?)><!attlist path state CDATA“initial”><!element component(component?)><!attlist component name CDATA #REQUIREDnumber CDATA“1”>表达式有不同的使用情况,其定义如下<!element expression(path|self|src|trg|evalattr|getfirst|getnext|parent|root|apply|external|constant)>
path被用来表示是对应元素而不是对应引用路径的状态。Self表示该元素是包含了使用自身的定义的模块实例。Src如果在动作中使用,表示了包含最后被执行的状态的元素;如果在转化中使用,表示包含转化来源的元素。Trg表示包含转化目标的元素。Evalattr,getfirst,getnext,parent表示上面提到的对应的主要函数。root表示被执行文件的根部。Apply被用来固定二元的和一元的操作,像数学运算(+,-,*,...),布尔量运算(和,或,否,...)和字符串操作(添加,合并,...)。External被用来调用由任意的编程语言写成的外部函数。最后,constant被用来表示常量,像数字,布尔量和字符串。
在流程图中,一个抽象函数evaluate(_)被用来对元素的表述进行评估。
如果达到一种状态,那么就触发动作,且它们具有这种结构<!element action(setAttr|ifthen|forall|external)>
该setAttr动作符合上面所描述的setAttr基元。使用ifthen来执行只有满足某些条件的某些动作,而使用forall来执行文档中某一要素所有状态的动作。该external结构再次用来调用扩展函数。
在流程图中,使用一个抽象程序execute(_)来执行动作要素。
既然定义应当独立于表达式和动作语法的具体选择而有效,按照图9所得的DTD使用起始于带有要素<!element src EMPTY>的第19行的剩余行来完成。
关于图10~16,将更加详细地解释一个给定的XML-文档doc.xml的执行。图10~16显示六张固定的流程图F1、F2、F2、F3、F4和F7,它们规定了执行过程。与首选方法的语言环境中所描述的GFC的执行过程相比较,这些流程图并不依赖于需要执行的文档和机器人-模块,但对任何文档和任何机器人-模块来说,都是固定的。每张流程图引用一个给定的、即将执行的XML-文档doc.xml的一个执行逻辑块。作为独立的文件moduleX.xml,为每一要素-名称X提供模块。使用[Fx.Sy]来引用每一张流程图Fy的状态,此处的x表示流程图的编号,而y表示相应的流程图中的状态编号。
按照本发明,首先遍历XML-文档(或在其它实施例中的一个DTD),而且来自模块的所有状态和转换都被复制到XML-文档中。随后,独立执行XML-文档。在复制过程中,设定每一状态的“origin”特征为当前转换的要素,例如,来自已经触发复制动作的要素。因而引用初始特征值给doc.xml的要素。
在所示的图10中,执行的初始状态是[F1.S1]。全局变量cur的值设定为引用文档“doc.xml”的根目录。然后控制转向状态[F1.S2],设定全局变量mod的值为引用描述根目录执行特征的“module”要素,例如,具有相应的cur标记名称的模块。然后,控制转向流程图F2的状态[F2.S1]。F2的作用是将所有“state”-和“derived”-要素从模块mod复制到要素cur,设定所有状态和派生的特征“origin”为cur。控制从F2的最终状态[F2.S99]转向F3的初始状态[F1.S3]。F3的作用是将模块mod的子模块的“state”-和“derived”-要素复制到要素cur的相应部分,仍然设定所有状态和派生的特征“origin”为cur。控制从F3的最终状态[F3.S99]转向[F1.S3],将cur更新为cur.traverse。接下来,决策[F1.S2]依赖条件cur=undef而分叉。如果条件估算为真,终止遍历,并将控制转向[F5];否则,控制返回到[F1.S2]。
模块F5可能包含附加程序,用于处理嵌套在嵌套模块中的模块和校验安全条件。仅仅在特殊的装置中使用的这些程序,可能使用标准过程结构来执行。控制从[F5]转向[F6]。此外,只为特殊装置使用模块F6,而且F6包含根据不同策略记录的状态、转换和派生特征,例如转换中关于条件的参数选择和执行的类。控制从F6转向F7的初始状态[F7.S1]。
作为注释,F2(图11)的作用是将模块mod的“state”-和“derived”-要素复制到要素cur,并设定这些要素的“origin”-特征为cur。不是先复制要素再设定特征,而是先设定特征为模块mod中的正确值,然后将这些“state”-和“derived”-要素从模块mod复制到要素cur。使用全局变量state遍历mod中的“state”-要素,而使用全局变量derived遍历“derived”-要素。初始状态[F2.S1]设定变量state为mod中的初始“state”-要素。接下来,控制转向[F2.D1],而且,如果state=undef,控制从那儿转向[F2.S3];否则转向[F2.S4]。在[F2.S3]中,如果state不等于undef,那就到达[F2.S3],设定state的特征“origin”为cur。控制从那儿转向[F2.S3],设定state为state.getNext。控制再次从那儿转向决策[F2.D1]。在[F2.S4]中,所有“state”-要素复制完后,就到达它,设定全局变量derived为初始“derived”-要素。同“state”-要素一样,决策[F2.D2]依赖条件derived=undef而分叉;而且,状态[F2.S6]触发derived=derived.getNext,使用[F2.S6]来迭代遍历所有“derived”-要素,在[F2.S5]中,设定“origin”-特征为cur。如果迭代终止,控制转向[F2.S7],将deriveds的完整列表传递给cur。接下来,在[F2.S99]中,将“state”-要素的列表从mod复制并粘贴到cur中。
在F3(图12)中,使用迭代变量submod来访问mod的所有子模块。如果迭代终止,例如如果决策[F3.D1]估算出submod等于undef,那么将控制转向F3的最终状态,[F3.S99]。否则,控制转向[F3.S2],在这儿设定变量subcur为第一个部件,它的标记与子模块submod的标记相匹配。如果子模块submod的“number”-特征是“1”或“all”,那么正确地设定subcur为初始状态,并将控制从决策[F3.D2]转向F4的初始状态,[F4.S1]。否则,设定[F3.S3]中的subcur为下一种状态,并将控制转向决策[F3.D3],它检查subcur是否等于undef。如果不等于,那么假定必须检查第二种状态或者所有状态,并再次将控制转向状态[F4.S1]。F4的作用与F2的作用正好一样,但是不是用mod和cur,而是使用submod和subcur,除了设定“origin”的特征为cur以外。
控制从最终状态[F4.S99]转向决策[F3.D4]。如果分支条件估算出子模块submod的“number”-特征是“all”,那么控制转向[F3.S3],用正确的标记遍历所有状态。如果遍历停止,那么通过触发决策[F3.D3]为真,或通过在决策[F3.D4]中寻找数目不是“all”,来继续访问状态[F3.S4]中的所有子模块。在这儿设定submod为“module”-要素的下一种状态。控制再次从[F3.S4]转向决策[F3.D1],注明一下,它要么继续访问子模块,要么将控制发送到F3的最终状态,即[F3.S99]。
按照上面所述,F4(图13)的工作原理同F2完全一样。使用变量state和derived来迭代遍历模块submod的“state”-要素和“derived”-要素,设定它们的“origin”-特征为要素cur。然后将所有“state”-和“derived”-要素复制并粘贴到要素subcur中。
在状态[F4.S99]中,将所有“state”-和“derived”-要素复制并粘贴到文档doc.xml的相应要素中,并设定“origin”-特征,这样就不再需要那些模块了。既然只需设定状态的一种特征,且所有的“transition”-、“action”-和“derived”-要素是并保留原封不动,一种可供选择的办法是只复制“state”-要素和“derived”-要素最外面的部分,并引用其余模块。
在所示的图14中,流程图F7的初始状态[F7.S1]表示了实际执行阶段的开始。在F7中,触发与当前状态curstate相匹配的所有状态的动作。设定cur返回到文档doc.xml的根目录。然后将控制转向[F7.S2],在此处将全局变量curstate设定为“initial”。变量curstate的作用是指明当前要素cur内部的当前状态。在[F7.S3],[F7.D1]和[F7.S9]中,通过变量state来迭代遍历当前要素cur的所有“state”-要素。初始化迭代[F7.S3],[F7.D1]是终止条件,如果它终止,就发送控制给[F8.S1];[F7.S9]是实际迭代程序,它设定state为“state”-要素的下一种状态。在迭代内部,决策[F7.D2]用来校验state的“name”-特征是否与当前状态curstate相匹配。如果匹配,接下来访问[F7.S4],设定变量cur为state的“origin”特征值。该更新的作用是估算右边的动作。在[F7.S5],[F7.D3]和[F7.S7]中,通过变量action来迭代遍历state内部的所有动作,并在[F7.S6]中执行它们。当迭代终止时,控制转向[F7.S8],在这儿重新设定cur的值为其初始值。states的迭代从那儿重新开始,终止后通向[F8.S1]。
最后,如图15所示,在F8中,触发转换,更新当前要素cur和当前状态curstate。转换条件的估算取决于它们的定义的初值、转换的源-要素src和转换的目标-要素trg。在表示条件的“expression”-要素中,这三个要素可以分别作为<self/>、<src/>和<trg/>来访问。在流程图F8中,两个嵌套的迭代代替了“state”-要素和其“transition”-要素。初始状态[F8.S1]设定src等于当前要素cur。接下来,[F8.S2]、[F8.D1]和[F8.S9]迭代变量state来遍历当前要素cur的所有状态。如果迭代终止,控制返回到[F7.S3],再次执行同样的动作。否则,[F8.D2]校验state的“name”-特征是否与当前状态curstate相匹配。如果匹配,那么进入[F8.S4],并设定变量cur为state的“origin”特征值。接下来,使用[F8.S5]、[F8.D3]和[F8.S8]来迭代变量trans遍历state内部的所有转换。在迭代内部,[F8.S6]设定trg等于估算通路的结果。接下来,[F8.D4]验证trans的表达式是否估算为真。必须指出,对于该估算来说,必须正确地设定cur、src和trg。如果估算的结果为真,那么设定cur等于trg,并将curstate设定为trans的通路-组件的“state”-特征。然后控制转向[F7.S3]。目的是为了执行新当前要素和状态的动作。
在图16、17和18中,显示了按照图1ff而定的询问程序语言例子的模块。这些模块关于图11给出的DTD来说,是有效的。示例XML-文档的执行可以使用图12所述的过程来完成。根据上述的图象化流程图,可以自动从图象化输入生成上面所说的模块。另一方面,可以从这儿给出的文本形式生成它们的图象化表示。
关于图19a-19d,XML-机器人规范的执行,它按照上面的解释给出了XML-文档的执行特征,这儿将更加详细地描述它。给定XML-机器人规范m0,写入XML-机器人规范语言M,如上面所描述的可视化/文本化询问程序语言那样,以及关于m0的文档类型定义DTD0有效的XML-文档d,执行规范给出关于抽象过程m0Exec(d)为了执行d将做何动作的所有信息。为了执行抽象过程m0Exec(d),需要在现存的计算机上执行一个程序,例如,按程序化语言C或Java书写的一个程序。这儿有四种基本方式来执行上面所说的程序。
在图19a-19d中,以方框的形式显示所有过程,以普通方式显示文档,即一个带曲线顶边的方框和一个可执行文档,例如,一个程序显示为一个文档和一个过程的结合,如程序的执行。每一过程可能有一个以文档形式的输入,有一个以文档形式的输出,并且它可能是另一过程的开始。可以在一台真实的机器上执行的具体过程,显示在实线方框中;而抽象的过程,如过程m0Exec(d),显示在点划线方框中。所描述的执行XML-机器人的可能性是通过编译器和解释器技术的不同组合来实现的。可以为元形式记法M和形式记法DTD0使用两种技术中的一种。因此,通常有四种组合形式,编译器后跟解释器(图19a),编译器后跟编译器(图19b),解释器后跟解释器(图19c),以及解释器后跟编译器(图19d)。
图19a显示,通过从XML规范m0生成一个解释器IntDTD0的一种执行方式。解释器IntDTD0选用XML-文档d作为输入,并校验它关于DTD0是否有效。随后它启动执行这样一个文档d的过程,以这样的一种方式进行该过程与上面所介绍的抽象过程m0Exec(d)等效。通过一个可执行文档IG给出执行,它的执行选用XML-机器人执行规范m0作为输入,并生成一个可执行文档intDTD0作为输出,即所说的解释器。
图19b显示另一种可能性,它提供一个编译器生成程序,通过一个可执行文档CG给出来,该CG从XML规范m0生成一个编译器CompDTD0。编译器CompDTD0变换文档d,并接收d作为输入,进入到可执行文档d’,它的执行必须与抽象的过程m0Exec(d)等效。
图19c显示,规范语言M的解释器IntMtoInt以m0的一个解释过程作为开始。解释器IntMtoInt以一个XML-机器人规范m0作为输入,并启动过程IntDTD0,而它又作为XML-文档d的输入。过程IntDTD0现在启动一系列执行文档d的过程,该过程必须与抽象的过程m0Exec(d)等效。
作为最后一种可能性,图19d显示了规范语言M的一种解释器IntMtoComp。解释器IntMtoComp以XML-机器人规范m0作为输入,但与前述的解释器IntMtoInt相比,它启动一个编译器过程CompDTD0,并以XML-文档d作为输入,产生一个可执行文档d’作为输出,d’的执行必须与抽象的过程m0Exec(d)等效。
可能很容易认识到,上述的每一种可能性都有其独特的优点和缺点。大家知道,使用解释器技术的优点是执行的即时有效性,更复杂的编译器技术的优点是良好的运行和产生的可执行文档的有效性,它可以单独地重复使用,独立于XML-机器人规范m0。
在图20中,显示了一种基于网络XML-机器人的最佳实施例。服务器21,通常是一个高效网络服务器,连接一个数据库22和一个或更多个功能性程序库23。通过网络连接,尤其是因特网,一个或更多个客户25.1、25.2,通常使用一个在远程系统上运行的浏览器,可以访问上述的服务器21。这些客户25.1和25.2的接受力或多或少的受到限制,通常可能是运行诸如Java虚拟机器之类的有限抽象机器。
服务器21按照上述的XML-机器人规范,提供执行XML-文档的服务。XML-机器人规范中的动作在服务器21上执行,例如,访问服务器的数据库22或者调用服务器的函数功能库23。此外还有一些动作和可能附加的工具27,通过电子邮件、网页、WAP、存储管理服务和类似的形式来公布结果,来管理访问权和管理潜在的数据库和软件系统的结构。XML-机器人规范可能只在服务器21上执行,但也可能用作服务文件提供给客户。
这种情况可以和应用程序服务供应商(ASP)模型相比较,应用程序在服务器上运行,所有的客户都能访问他们。本发明分享了ASP的优点,所有的计算都是在服务器上完成。因此,客户可以是非常小的装置,如因特网工具。而且,本发明具有先进之处,即一个有限的XML-机器人规范可以执行无限多不同的XML-文档,只要与相应的文件类型定义(DTD)相匹配。
执行服务供应商方法的应用程序范围,包括从现存应用程序的输入/控制,到新应用程序的规划或设计。输入/控制应用程序使用XML-文档来控制一个应用程序。XML-机器人规范将简单地把文档翻译成交互式的输入/控制序列,用来控制应用程序。在新应用程序的规划/设计中,XML-文档符合程序的语法结构,而XML-机器人规范给出执行特征。下面给出一个例子,一个带有DTD的XML-机器人规范,它表示了C语言程序的句法结构,而XML-机器人给出了它们的执行特征,这将允许发送任意的C语言程序到服务器并让它们在服务器上执行。
与前面所描述的带有执行服务供应商的装置相比较,另一种首选装置可以分别提供LangLets(小XML-机器人规范)和可移植语言。这里,服务器21为客户25.1和25.2提供服务,它首先发送XML-机器人规范,然后按照规格执行XML-文档。这种装置要求客户25.1和25.2来执行XML-文档,这些客户能够从XML-机器人规范那儿生成解释器/编译器。因此XML-机器人规范的动作在客户25.1和25.2上面执行。这种方法可以在较大意义上比喻为发送Java代码到一个客户,随后它可以执行这段代码。然而,与整个Java相比,XML-机器人规范所给出的执行特征非常简单且远不及Java那样富有表达力。尽管如此,像Java这样的语言可能用来设计XML-机器人规范的动作。在XML-机器人规范中,按照这样一个XML-机器人规范来执行的所有XML-文档(无限多的)执行特征,被限制在有限数目且固定的(但参数化的)Java-动作中。
本发明一个重要的优点是,可以调查一个限定的XML-机器人规范的安全特性。对那些打算在客户25.1和25.2上执行的、无限多的不同XML文档来说,这些特性可以分别被担保或检查。例如,如果某一关键性的安全动作没有包含到XML-机器人规范的动作中去,那么对于那些按照这种XML-机器人规范执行的任何一个XML文档来说,可以担保(基于直接定义)不执行这个动作。或者,如果另一个关键性动作只有通过某一条件保护的状态来触发,那么它可以担保只有完成了这个条件,才触发这个动作。
再考虑一下可移植代码可能有所帮助,在那儿源代码发送到网络上。然而,与它对比,这儿首先发送XML-机器人规范,它给出可移植语言/DTD的执行特征,然后传递程序/XML-文档。因此,通过给定的网络,提供一种可移植语言。借助可移植代码的可移植语言的优点是,通过类的方式,在XML-机器人规范中嵌入了重复计算,而且,描述计算的实际例子的XML-文档并不复杂。
这样使用本发明的XML-机器人规范,允许定义一种新的语言,并执行上面所说语言中所写的代码,然后产生相应的编译器和/或解释器。进一步可能建立编辑器,调试器和分析工具。所描述的数据和代码相互协作,直接允许我们定义有效XML-文档的执行或其它过程,并不需要书写一个单独的程序来清楚地解析和分析该文档的结构树。
本发明提供一种装置25.1和25.2,尤其是因特网装置,这可以用于网络环境中,尤其是因特网,它包含从远程计算机接受和发送数据的方法。该装置提供存储和访问数据(XML-文档)的设备,这些数据发送到上述的远程计算机。该装置还包含检验从上述远程计算机所接收到的数据的设备,如果合适,验证这些数据是否有效和/或是否接受XML-机器人规范。该装置进一步包含使XML-机器人规范和XML-文档相结合的方法。然后通过该装置执行XML-文档,更可取地是通过一个处理部件来执行,它可以执行XML-文档的指令。对该技术领域中的熟练人员来说,他们很容易理解,该工具所包含的方法归结为这样一种方式,即用于执行XML-文档的处理部件可以为该装置的发送/接受操作提供函数功能性。而且,该装置通常包含一个用户界面,如果愿意,它可以提供激励执行和分析XML-文档或XML-机器人规范的设备。然而,它只可以用作一个网络内部的一个服务平台。
本发明进一步提供一种装置,它包含XML-机器人规范的图象化显示方法,例如,在一个高级的可视化完整发展环境中,参考图3ff.描述的那样。按照上述的规范,这种图象化表示法用来生成描绘上述XML-机器人规范的XML-文档。
本发明进一步允许提供XML-文档的分布式执行。使用多路XML-机器人来分布XML-文档的计算,应归于这样一个事实文档的结构同时是处理它们的应用程序的结构。因此,XML-文档的一部分可以轻易地在XML-机器人的不同情况下执行,这些XML-机器人可能放置在不同场所。同样地,专用的应用程序可能要求文档的一部分在服务器上执行,文档的另一部分在客户端执行。
权利要求
1.用于直接执行XML-文档的方法,其特征在于通过对XML-文档的每一个要素定义局部行为和过程,和使可执行的指令和文档类型定义(DTD)、XML-文档或其作为结构树的表示法相结合,并通过动态创建和重新定义元素特征来存储中间状态。
2.根据权利要求1所述的方法,进一步包含如下步骤a)通过规定每一个XML-元素的定义和它的状态来使可执行指令更完整,通过简单的可执行动作组成的动作,以及这些动作要么引用为要素的组件之一定义的动作,要么引用为任何其它要素定义的动作;b)通过执行为它的根段定义的动作来执行XML-文档。
3.按照前面的声明之一所采用的方法,其特征在于通过表示时序或并行控制和/或数据流的图象化流程图,至少为一个XML-要素的定义或状态规定动作的组成。
4.按照前面的权利要求之一所述的方法,其特征在于以表示时序或并行控制和/或数据流的文本形式,至少为一个XML-要素的定义或状态规定动作的组成。
5.根据前面的权利要求之一所述的方法,其特征在于以n维数据块的形式来表示系统状态,具有一个开放的面向系统的界面,它使n维数据块可读写其它程序和/或数据库系统,且可从上述的系统中访问其它程序和数据库系统的数据结构和功能性函数。
6.按照前面的权利要求之一所述的方法,其特征在于为每一要素定义过程的模块,这些模块关于下面的DTD有效<![CDATA[<!element module(derived*,expression?,state*,module*><!attlist module name CDATA#REQUIRED  number CDATA”1”><!element derived(argument*,expression)><!attlist derived name CDATA><!element argument EMPTY><!attlist argument name CDATA><!element state(action*,transition*)><!attlist state name CDATA><!element transition(expression,path)><!element path(component?)><!attlist path state CDATA“initial”><!element component(component?)><!attlist component name CDATA#REQUIRED   number CDATA”1”><!element expression(path|self|src|trg|evalattr|getfirst|   getnext|parent|root|apply|external|constant><!element action(setattr|ifthen|forall|external)><!element src EMPTY><!element trg EMPTY><!element self EMPTY><!element evalattr(expression?)><!attlist evalattr attribute CDATA#REQUIRED><!element getfirst(expression?)><!attlist getfirst attribute CDATA#REQUIRED><!element getnext(expression?)><!element parent(expression?)><!element root EMPTY><!element apply(expression,expression?)><!attlist apply op CDATA#REQUIRED><!element external(expression*)><!attlist external name CDATA   language CDATA><!element constant EMPTY><!attlist constant value CDATA#REQUIRED><!element setAttr(expression?,expression)><!attlist setAttr attribute CDATA#REQUIRED><!element ifthenelse(expression,action*)><!element forall(action*)><!attlist forall range CDATA“all-elements”  variable CDATA>]]>
7.一种使用前面权利要求之一所述的方法的系统,其特征在于服务器按照从客户发送到服务器的XML-机器人规范,至少执行XML-文档的一部分为至少一个客户提供服务;或者,服务器通过发送一个XML-机器人规范和一个XML-文档给客户,为至少一个客户提供服务,使得通过至少执行客户端所发送文档的一部分来提供上述服务,该文档符合所发送的XML-机器人规范。
8.一种使用前面权利要求1~5之一所述的方法的装置,包含用于往远程计算机发送和接收数据的设备;存取和访问XML-文档的设备;使XML-机器人规范和XML-文档相结合的设备,以及执行这些完整的文档的设备。
9.一种使用前面权利要求1~7之一所述的方法的装置,包含在一个高级可视化完整发展环境中,用于XML-机器人规范的图象化显示的设备,以及生成表示上述XML-机器人规范的XML-文档的设备。
10.一种根据权利要求8或9所述的装置,进一步包含检验、验证或激励XML-文档或XML-机器人规范的设备。
全文摘要
本发明涉及一种直接执行XML-文档的方法,系统和工具,是通过分别使用文本化或图像化流程图,将XML-文档、文件类型定义(DTD)或他们的代表修饰成结构树。XML-文档的数据结构被重新用于处理其代码并与其合并。
文档编号G06F9/45GK1454357SQ00819741
公开日2003年11月5日 申请日期2000年8月2日 优先权日2000年8月2日
发明者菲利普·库特 申请人:菲利普·库特
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1