Java中的XML类型的制作方法

文档序号:6477244阅读:283来源:国知局
专利名称:Java中的XML类型的制作方法
技术领域
本发明涉及数据和数据类型的转换。
背景技术
当前在不同的数据类型间转换或排列数据的方式上存在某些缺陷。在现有系统中,用户启动现有的Java类型并要求系统生成反映Java类型的XML模式,进而将Java数据排列成自动生成的XML。大多数排列XML的产品都通过编译器(例如从Java到WSDL的编译器)运行,以生成XML模式(schema)。这种方法的缺陷之一是只针对从Java到XML的情况。当前的工具不是特别擅长于采用现有XML模式并将整个模式转换成使用方便的Java类型。
当前排列技术的另一个问题出现在用户只想查看一小块XML数据的时候。用户可能希望在不处理该XML数据块的情况下就跳转至其余的XML数据。当前排列技术在简单跳转至其余数据方面不是很有效。通常,在不同的排列之间跳转是很复杂的,因为不是XML中的所有语义都能很容易地在Java中捕获。如果用户输入消息,更改该消息的一小部分,并试图将该消息作为XML重新发送,则除了该被用户更改部分外的其它部分将变得不同,从而丢失很多其它信息。例如,如果XML含有通配符属性或元素,则这些通配符不会被保留。关于元素顺序的信息可能也会丢失或被扰乱,如果模式对元素顺序很敏感的话这就成为一个问题。


图1示出根据本发明实施例的示例XML模式定义文件。
图2示出根据本发明实施例的、用于XML排列和解排列(marshaling andunmarshaling)的示例系统的框图。
图3示出由可以用于根据本发明实施例的XML模式编译的XML类型的示例代码。
图4示出可以用于根据本发明实施例的基于注释的格式的示例代码。
图5示出可以用于根据本发明实施例的实现Web服务的示例代码。
图6示出可以用于根据本发明实施例的类型转换的示例代码。
图7示出可以用于根据本发明实施例的用于默认类型申明的示例代码。
图8示出可以用于根据本发明实施例的用于XML转换的示例代码。
图9示出可以用于根据本发明实施例的用于XML转换的示例代码。
图10示出可以用于根据本发明实施例的示例XML转换系统的框图。
图11示出可以用于根据本发明实施例的用于XML存储的示例系统的框图。
图12示出可以用于根据本发明实施例的用于XML模式的示例系统的框图。
图13示出根据本发明实施例的用于XML类型的示例系统的框图。
图14示出根据本发明实施例的示例分层结构图。
具体实施例方式
以下用示例而非限制为附图的方式说明本发明,附图中相似的附图标记表示相似的部件。应当注意,本公开文献中“一”或“一个”实施例不一定指同一实施例,这样描述的意思是至少一个。
根据本发明一个实施例的系统和方法通过在XML和Java之间排列数据时将在XML文件中定义XML数据的XML模式翻译为Java中的XML类型,克服了现有排列和解排列系统中的很多不足。XML类型实际上是除了常规Javabean功能和访问数据库之外还能以有效的、类型安全的、鲁棒和方便的方式访问和更新Java内XML数据的Java类型。在至少一个实施例中可以使用的体系结构能够处理几乎100%用户引入的模式。
XML类型的使用准许将XML类型系统和Java类型系统组合在一起。这可以通过准许开发者实现松耦合来完成。作为XML类型实现的XML模式可以完全符合XML。开发者很容易控制现有Java类型和现有XML类型之间的精确转换。通过同时采用几种技术,包括例如强烈类型化为从Java访问XML数据文件的模式意识、紧密和有索引的存储器内XML存储、快速和最小(推进)分析和(二进制)序列化、轻便的文件光标移动、XPath和XQuery导航和转换、以及无缝Java IDE集成,XML类型可以涉及Java/XML分界。
对于面向XML的“XML通过Java代码至XML”的例子,图1示出可以用于根据本发明实施例的简单示例XML模式定义(XSD)文件。该特定XML模式描述一个购买订单的类型。该模式可以是由模式工具生成或由用户创建的预先存在的文件。在本例中,可能需要“清除”或“固定”无效的XML购买订单信息。
在XSD顶层是针对名为“购买订单”的元素的模式定义。该元素被定义为复合类型,并包含名为“排列项目(line-item)”的元素。将“maxOccurs”属性设置为“unbounded”,意思是该排列项目可以重复任意次数。每个排列项目具有4个子元素desc,itemid,price,qty。子元素desc表示是字符串的描述元素,itemid表示是整数的项目标识符元素(类型为int),price表示是浮点数的价格元素(类型为float),qty表示是整数的数量元素。这些子元素都是模式的内置类型。该模式基本上描述或表现一个有效购买订单是什么样子。
为了采用XML类型编程,可以将XML模式文件添加到Java方案中。用于XML排列和解排列的系统示例在图2中示出。在一个实施例中,该系统可以用不仅知晓如何编译Java方案101、还能编译XSD文件102的编译器100处理该文件。在编译XSD文件时,除了常规Java类型104之外还能生成很多XML类型103。然后可以将这些XML类型添加到类路径(classpath)中。例如,名为“购买订单(puchase order)”的XML类型可以从名为“购买-订单(puchase-order)”的模式类型来生成。
表示用图1中的示例模式编译的XML类型的Java源代码在图3中示出,其中生成这些Java类型的来源是模式文件本身。名为LineItem的类型对应于嵌入XSD文件中的购买订单元素内的排列项目元素。在Java中,XML排列项目元素可以转换为类似的东西。可以为一个类型中的每个元素生成Java文件。例如,对于XSD中的desc元素,在每个排列项目的生成类型中都存在对应的getDesc和setDesc方法。对于整个购买订单,用户可以获得或发送个别排列项目。所生成类型的名称可以自动地从模式名称中推导出来。每个生成的类型都可以注解上其来源的相关模式名称。每个类型还可以扩展现有XML类型。
在一个实施例中,XML类型可以实现名为XMLObject的通用基本XML类型。该XML类型可以执行多个面向XML的数据操作,并在此称为XBean。XBean不是标准的Java bean,而是从XMLObject继承而来的XBean。XMLObject是与众不同的,因为XMLObject作为XML类型为每个XBean提供了检索其原始或对应XML的方法。XBean可以被认为是用于表达数据(例如业务数据)的Java类型的设计模式,这些数据可以序列化以及去序列化为XML,并且能从Java以类型安全的方式访问。XBean还可以被认为是自然语言的习惯用语的一个小子集,是经过注释的Java或非Java,用于生成这些类型。通常,当应用程序开发者或组件开发者决定如何表示业务数据时存在一个折衷。如果该数据表示为类型安全的Java,则难以序列化为XML或数据库。如果数据表示为XML,则难以转换为Java类型。如果数据在来自数据库的一个结果子集中,则对于转换为任意一种其它类型来说存在同样的情况。因此,有利的是提供单一种类的Java类型,其能作为XML和Java方便地传递、使用和操作。有利的还有同一类型便于数据库访问和格式输入及验证。
如图2所示,在一个实施例中的XBean可以处于三种业务数据的交叉点XML数据105、Java数据106和数据库107。XBean可以只包含数据,而没有用于通信或计算的任何逻辑或方法。可以用多个惯用语中任意一个来定义XBean。一旦定义了XBean,则该XBean可以用于各种语境。例如,可以使用XML模式来定义XBean,然后通过将该XBean附加到XML输入流来进行实例化。这样,可以分发生成的Java类型并用做一个具有友好getter和setter的Javabean。
例如,应用程序开发者可以定义名为Mydata.schemabean的文件,具有如下内容<xsd:element name="maData">
<xsd:sequence>
<xsd:element name="a"type="xsd:string">
<xsd:element name="i"type="xsd:int">
</xsd:sequence>
</xsd:element>
该文件可以编译为具有元数据的XBean,如图4所示,示出基于注解的示例格式,这可以是表达XBean的另一种方式。
例如,如果该数据曾是面向XML的,则用户可能关心名称在描述之前还是描述在名称之前。根据本发明的系统和方法允许用户取回原始的有序XML。可能存在任意一种基于XMLObject类型的方法,例如名为getXMLCursor和executeXPath的方法。XML类型可以具有多个XML数据操作,包括用XPath查询值,用XQuery转换值,或用XMLCursor在数据文件上迭代。该基本类型可以将几种技术集中到一起。
某些方法可以及时确定XML在任一点的样子。例如,XML类型可以用于实施执行请求操作的Web服务,如图5所示。在该图中的示例代码可以用于固定整个购买订单中的数量。在图5的1-2行中,该方法被申明为采用PurchaseOrder XML类型的Web服务操作。该Web服务运行时可以识别XML类型,并有效的传递输入信息,而无需完全分析XML。在该模式中申明的另一种XML类型是LineItem,在4、5、7行中可以看出是名为emptyItems的数组。由于编译的XML类型是强类型化的,因此它们准许确认两个模式,例如针对模式文件确认PurchaseOrder,和Java编译器检查,例如验证emptyItems[i].setQty(1)的变量类型是整数。
例如,用户可能接收多个购买订单,其具有多个错误地用数量0来设置该排列项目的排列项目。用户可能希望操纵这些购买订单,使得无论何时有人将数量字段设置为0,则该系统就将该数量字段设置为1。一个函数可以将购买订单XBean作为输入,并且可以对该购买订单执行XPath,其查询购买订单标记下的、数量等于0的任意排列项目标记。这例如从图5中的第5行开始。与该XPath匹配的节点列表可以返回给用户。该节点列表可以还原为用户知道的XBean类型。该系统选择可以投射为数组的排列项目集合。一旦由XPath获得结果,就可以通过该结果进行迭代,并用XBean方法来操纵结果节点。
强类型化的Java访问器可能不适合所有XML应用。在一个实施例中,XML类型可以扩展提供XPath,XQuery,XMLCursor和XMLReader的基本面向XML的XMLObject类型。在第5行,XMLObject getAllValues方法对输入执行XPath,以找到所有qty=0的排列项目元素。在第6行和第7行,可以看出LineItem类型可以用于更新XML数据文件。该类型的每个实例都表示该文件中的一个特定节点,并且当调用诸如setQty(1)的方法时,以方便、类型安全的方式操纵该文件的数据。在第8行,该类型直接从Web服务中返回,以结束该函数并发送响应消息。
根据本发明实施例的系统和方法还可以处理不同XML类型之间的转换,其中用户可能需要处理XBean来检索数据。例如,可能需要通过将说明和价格更改为与项目ID匹配来清除排列项目。这在一个实施例中可以通过在现有应用数据库中查询每个目录项来完成。该工作可以利用采用整数项目id并返回CatalogItem类型的Java查询方法来完成。例如CatalogItem findCatalogItem(int catalogID);
class CatalogItem{int getCatalogIDO;
String getDescriptionO;
float getPriceO;
}该类与LineItem XML类型类似,但具有一些比较次要的差异。例如,CatalogItem没有数量,项目ID名为catalogID而不是itemID。实际上,由于CatalogItem与LineItem非常相似,因此希望在某些情况下编写诸如图6所示的代码。在图6中,复合XML类型、即LineItems的值设置为复合Java类型,即CatalogItem。每个XML类型都具有可以采用任意类型的设置方法,从而上述代码可以编译和运行。但在运行时,用户可能得到XML转换意外,抱怨说“没有定义转换来从CatalogItem映射到LineItem”。在这种情况下,用户可以选择合适的CatalogItem类型名称并检查对应的XML转换。如果用户具有一个查询项目名称并返回名为CatalogItem的Java类型的现有bean,则CatalogItem将具有看似排列项的catalogID说明,但与前一个例子略有不同。例如,没有数量字段,并且前面称为itemID的现在称为catalogID。
在根据本发明实施例的系统和方法中,每个XML转换都可以采用存储在转换目录中的XQuery来实现。每个XQuery都可以从一个或多个具有已知XML模式的类型转换为一个特定类型。可以采用具有限制为排列项类型的输入和输出类型和CatalogItem的默认类型的可视XQuery编辑器。XQuery编辑器准许系统或用户将itemID与catalogID连接,并表明该数量应当为0。
图7示出CatalogItem类的默认类型申明的例子。该申明可以由XQuery写入到包含所有转换的目录的一个文件内。可以定义告诉系统如何将目录项转换为常规排列项的XQuery。这种查询的例子在图8中示出。图8中的黑体文本对应于将catalogID映射为itemID并将额外字段qty设置为0的XQuery。其余的是将该XQuery容纳在XML文件中的外壳。该0值可以被纠正,例如在图9所示的Java中完成。在图9的第13行,可以看见目录项被发送到项目行的示例代码。可能期望采用用户从现有API中得到的目录项,并将该目录项放入将表示排列项的XBean中。这种代码通常不会起作用,因为目录项和排列项是不同的。
XML转换系统的例子在图10中示出。在一个实施例中,转换(XQuery)的全局记录111可以用于从一种数据类型到另一种数据类型。一旦获得XQuery的子集,转换系统110就可以自动查询是否存在从源类型108到目标类型109的转换。在另一实施例中,仍然可以使用转换库112,但自动从源类型转换为目标类型,每次转换都赋予一个名称。当给定目录项并且常规的排列项需要设置时,用户例如在设置被唤醒之前简单地用名称唤醒转换。在图9中黑体字表示的13和14行,在set和findCatalogItem之间将存在告诉系统将目录项转换为排列项的函数调用。澄清该转换的一个原因是不可见的转换记录对很多用户来说可能太抽象,并且“看不见”。如果用户让数据被转换,则该用户可能希望实际上在代码中看见转换的名称。如果用户能看见该名称,则该用户可以在代码中浏览以确定什么转换影响了数据以及如何影响该数据。这可以是一种检查,因此用户可以确信该转换被理解,无论该代码属于该用户还是其它人。
另一种保证数量是正确的方式是通过排列项转换定义CatalogItem,以采用两个输入变量,如CatalogItem和整数数量。从该例中可以看出,存在转换的全局记录来表示源类型和目标类型。源和目标可以是Java类型。每当两个不同类型之间需要自动翻译时,就要查询该记录。可以使用允许一个Java类型根据情况映射为任意多个不同XML类型的记录。记录还具有任意两个给定类型之间的每次映射只需要定义一次、然后可方便地再使用的优点。
在某些系统中,可能出现这样的困难,可能需要同时在一个程序中处理一种模式的多个版本。由于这个原因,可以规定每个模式都要标记一个版本标识符。相关Java类型和转换都可以分开处理,将每个版本都当作自己的类型系统。
在另一示例中,用户可能希望编写将目录项作为输入的Web服务,或希望将诸如findCatalogItem的现有Java函数外露为Web服务。例如,可以编写如下代码来在现有系统中将findCatalogItem外露为Web服务class MyWebService{/**@jws:operation*/CatalogItem findCatalogItem(int catalogID){return MyDbUtilities.findCatalogItem(catalogID);
}}当用户定义适用于该用户的Web服务的WSDL类型时可以接受这种方法。不幸的是,该情况可能是存在描述期望结果类型的现有XML模式。例如,结果可能作为标准的购买订单排列项元素返回,如上述例子中所示。在这种情况下,实际的WSDL可能与现有的XML模式不一致。可以试图创建采用XML转换的合适模式,但不是提供方便的语法,现有系统无助于确保该映射与该模式一致。但是,如果采用根据本发明各实施例的转换记录,则可以容易的保证返回结果与合适类型一致。
例如,该代码可以修改为如下class MyWebService{/***@jws:operation*@jws:return-schema type="po:line-item"*/CatalogItem findCatalogItem(int catalogID){return MyDbUtilities.findCatalogItem(catalogID);
}}上述代码要求存在已定义的、将CatalogItem类型映射为po:line-item元素的类型的XML转换。如果没有,则IDE在返回模式注释上通报一个错误。但是,如果存在定义的转换,则Web服务方法的返回类型可以与要求的模式一致,并且需要的模式可以包含在发送的WSDL中。
在该例中,在包含return-shema type=po:line-item的行中,系统准许用户返回目录项,但在XML中具有排列项。该系统可以跳转至XQuery的记录并执行使用清楚XQuery的指令。该实施例提供了XQuery与XML映射的关联,对每一种模式的支持和同时访问数据的强类型化视图和XML视图的途径。
如图11所示,当根据一个实施例的系统和方法加载一段XML作为XML类型114时,该XML类型可以加载到一个轻便的内部XML存储器115中。这类似于用W3C文件对象模型(DOM)可以做的事,只是以更为方便的方式完成,这可以完全忠实于原始XML。该存储器是很轻便的,因为它只包含XML数据113作为可搜索的索引或在当前示例中近似处于文本或标记级别。因此,当用户具有诸如购买订单的XML类型时,该用户可以只具有指向其中一个轻便XML存储器地址的句柄,这可以类似于XML树。当用户获得引用时,可能还没有任何排列。当用户调用诸如getLineItem、getLineItem.getDesc或getQty的方法时,可以调用getter,该getter用于排列、确定类型和返回应答。该方法非常节省时间,因为只处理一部分数据。
根据一些实施例的系统和方法可以将XML模式和对应的Java类型保持同步。例如具有强类型化Java的用户可以开始添加新的排列项或改变数量。然后如果该用户希望在Java类型上运行XPath路径,则该XPath可能需要在XML数据文件上以该数据的当前格式运行。在这种情况下,如果用户在XML方面或者强类型化的Java方面更改文件,则可以使另一方面的适当部分无效。当随后用户查看该另一方面时,可以找出先前被无效信息的问题。
为了编译XML模式,可能需要分析该模式或XSD文件,这称为“模式为模式(schema for schema)”,换句话说,是代表适用于XSD文件本身的模式的XSD文件。如果系统假定能100%处理传递给该系统的模式,并且该系统产生方便的Java可访问性,则期待该系统在读取模式时使用自己的生成类型来理解XSD文件。用户应当能够采用模式为模式并编译到Java中,从而使系统只使用Java。
如图12所示,根据一些实施例的系统和方法,可以存在至少两部分和任意数据块,或XML数据,包括数据116的合法类型和原始数据119的含义。数据的合法类型定义何种数据被认为对当前应用是有效的。模式可以包含涉及数据合法类型的非常具体的细节,在某些情况下还可以包含涉及数据含义的细节。一旦已知数据的合法类型,则可以生成以强类型化方式提供对该数据访问的自动类型。这部分是由于该模式可以识别给定数据字段的所有有效子字段。然后可以在合适位置给用户赋予强类型化的Java访问。即使在用户加载该数据并使该数据在合适类型中之后,该用户可能仍然不知道该数据的含义。在这种情况下,可采用了解该原始数据的模式编译器117。其有些类似于称为编译器的编译器,如YACC(另一个编译器的编译器),它们能采用抽象文法并将该抽象文法编译到语法树中。由于XML已经是语法树,因此这不是一个问题。但是,XML不是受约束的语法树。在该树中,任何节点都可以在其下拥有很多元素。一旦用户具有可能被认为是XML语法的模式,则该用户就明确知道在任意给定节点下所假定的东西。因此,代之以使用原始XML语法树,用户可以利用受模式约束的语法树的优点。
根据本发明实施例的系统和方法将每个模式保持为Java类型,包括简单类型。如果用户具有的模式是有限的简单类型,则可以在该模式中表明。例如,如果用户定义的类型是整数这种合法类型,其必须是一个在10000-99000之间的5位数字。无需象在现有系统中那样定义为简单整数类型。相反,该信息可以产生到Java类型中。Java类型的名称可以用该模式生成,例如名称“有限整数”。
由根据本发明的系统和方法保持的另一种变形出现在模式中存在至少两个类型作为基本类型的情况下。如果其中一个类型是另一个的基本类型,则该关系在Java中连接这两个类型。类型化系统的高度忠实的翻译允许基本类型受到保留。
使用编译的XML类型约束118的有效引擎还可以用于准许用户确定根据该XML任意相关XML类型120是否有效。例如,在XML中购买订单排列项可能具有说明数量、目录号和价格。还能限制合适的XML模式,即标明“说明”是可选的,而catalogItemNumber不是可选的。在Java中,无法表明一个字段不是可选的,或不可能是空的。这样,进行排列的大多数人不能验证一个豆(bean)。可以使用根据本发明实施例的、准许用户针对XML类型约束来验证任意bean、并被告知任何有效性问题的验证方法。
在根据一些实施例的系统和方法中,可以在多个Java组件中共享XML类型。XBean可以自动发送,例如在为用户定义的组件定义自动生成的XML类型的地方发挥作用。在这种情况下,代表参数和返回值的XBean可以作为内部类自动生成到为该组件生成的XML控制接口上。如果实际上在很多组件之间共享消息类型,则使私有XBean类型用于该消息的每个实例可能是没有意义的。在这种情况下,应当可以在定义用户定义的组件时清楚地指出一个Xbean类型,以便清楚地控制该组件的XML类型是如何被共享的。例如package mypackage;
/***@jws:xml-interface enable="true"*/class MyComponent{/***@jws:operation*parameter-xml-type="MyData"*return-xml-type="MyStringMessage"*/String myOperation(String a,inti){return a+i;}}通过在该组件中例如为参数xml引用XBean类型MyData,可以断言该bean具有对应于自变量名的getter。例如,getA应当返回一个String,getI应当返回一个int。如果这些类型不排列,则可能导致编译时错误。对于返回xml,可以断言该bean类型是返回值,或其具有类型与返回值匹配的单一特性。通过引用XML类型,引用了定义该方法的输入和输出消息类型的XML模式。该模式可以再次使用,因为它们具有诸如MyData的名称。映射也可以在XML和Java类型之间引用。该映射可作为元数据添加到MyData类型,因为它是添加到已命名的类型,该映射可以再次使用。
可以在组件上指定显式的XBean时获得的生成XML控制接口如下package mypackage;
interface MyComponentXMLControl{/***@jws:return-xml xml-type="MyStringResult"*@jws:parameter-xml xml-type="MyData"*/XML myOperation(XMLx);
}在该例中,命名的XBean类型用于指定允许的xml模式,没有生成内部类。
XBean类型可以扩展基本XML类型,从而使得能够传递XML的地方也能传递XBean。此外,任何XBean都能附加到XML数据文件,因此可以获得XML的地方也能为了方便地访问该数据而创建XBean。在根据一些实施例的系统和方法中,可以容易地创建XBean并以几种不同的方式来使用。例如,可以隐含通过定义JWS(Java Web服务)方法来创建XBean。可以基于该函数的参数列表和与该函数关联的映射来创建XBean。还可以利用*.xbean文件来显式地创建XBean。至少有两种不同的方法来实现*.xbean文件,如JavaBean+Maps或XML+Query,每一种都能自由地使用注释。在JWS操作上隐含创建bean的例子可能如下所示/***@jws:operation*@jws:usebean beanName::creditCardInfo::
**/updateCreditCardInfo(String custId,String ccNumber,Date expDate,Address addr)这会用该操作的默认映射隐含地创建XBean。将特定映射用于该操作会用输入和输出的这些映射来创建XBean。如果已经定义了beanName,则可以使用现有bean。创建bean时可以使用单独的语法,而不是使用现有语法。
一个简单的JavaBean+Maps*.xbean文件如下所示{/***@xbean:property**/String name;
/***@xbean:property**/String address;
}这会创建具有公用get和set方法的文件,以及为该特性集定义的标准XML。比较复杂的文件具有附加的映射,如public interface xbeanl extends JavaXBean{/***@jws:inputxml xml-map::
*<PERSON><NAME>{name}</NAME><ADDRESS>{address}</ADDRESS>::
**//***@xbean:property**/String name;
/***@xbean:property**/String address;
}
上述例子将单个Java成员用作本地存储器。同样重要的是可以将XML用作本地存储器。相反,一个简单文件可以使用XQuery来返回值,如下所示public interface xbean1 extends XML XBean{private XML xml;
void xbeanl(XML xmlParam){xml=xmlParam;
}/***@jws:xquery statement::$xml/name/text()::
**/String getName();
}在根据一些实施例的系统和方法中,可以存在两种XML类型以开发者观点来看的可移动光标和不可移动值。在移动光标时,由光标浏览的XML数据文件部分可以改变,因此类型可以设计为在XML数据文件内任何地方进行操作。另一方面,不可移动值可以固定在一个地方,因此它们可以是强类型化的、与其引用的数据文件部分的模式匹配的方法。图13示出这种实现的例子,其中XMLIndex121代表可移动值,而XMLCursor122或123代表底层XML数据的可移动光标。强XML类型的实际实现可以不使用XMLCursor,但应当注意购买订单接口124提供了同类引用到底层XMLIndex中,即是它是不可移动的。
尽管用户可以就像普通Java类型那样使用和操纵诸如PurchaseOrder的强类型,该类型后可以实施为直接访问和操作底层XML数据。例如,紧接在一个值设置在强类型后,可以用任意使用XPath搜索同一数据集的光标获得同样的值。
在保持、查询、操纵和重新使用XML数据文件时图13所示的模型是很有用的。在其它时候,可能需要为一次性使用而流输出XML,而无需保持该数据文件。对于这些情况,可以存在XMLReader类,如XML推进分析器。每个XMLValue对象可以通过采用XMLReader将自己流输出。还可以存在加载和索引XMLReader内容的XMLIndex构造器。
图14示出XML类型API的示例类分层结构图。在该图中,当方框制定具体类时圆角框指定接口。从文件或原始输入流开始的用户可以用XMLParser排列XML,然后用XMLIndex索引排列的文件。这里只示出两个具体类,这些类是用于XML类型的、实施所有其它接口的工厂。
XML类型可以将模式添加到Java运行时模型中。例如,每个模式可以在编译时编译到Java类型中。该模式可以包括复合类型和简单类型。诸如XMLString和XMLDate的预编译类型可以用于内置于XML模式中的基础和简单类型。XMLObject本身对应于xsd任意类型。此外对每个模式,可以在目标类分层中生成指针资源,用于将所有具有给定名称的模式映射到对应的Java类型名称。
准许多个模式具有相同的XML名称,但具有相同名称的不同类型可以标有不同的“XML域”名称。只允许一个域是默认域。控制类型生成的一种途径是在编译时通过与.xsd文件邻近的.xval文件。在运行时,被索引的XML可以自动意识到模式。模式的可视性与当前ClassLoader联系在一起。可以保持可视模式的线程本地索引。当通过完全合格的XML名称请求一个新模式时,可以调用ClassLoader.getResourceAsStream用于例如在默认域中找到指向对应Java类型的指针。也可以进行在特定域中的查询。XMLIndex的实现可以自动将所有XML分解为使用该模式的类型。如果没有指定“XML域”,则可以使用默认域。还可以指定准许使用不同版本模式的其它可选方面。
可以采用根据本发明教义编程的传统的通用或特殊数字计算机或微处理器来实现一个实施例,这对计算机领域的技术人员来说是显而易见的。编程人员基于本发明的教义很容易准备合适的软件,这对软件领域的技术人员来说是显而易见的。本发明还可以通过准备集成电路或通过搭建传统组件电路的合适网络来实现,这对本领域的技术人员来说是显而易见的。
一个实施例包括计算机程序产品,其是存储介质,具有存储于其上的指令/用于对计算机编程以执行在此呈现的任一特征。存储介质可以包括但不仅限于任意类型的盘,包括软盘、光盘、DVD、CD-ROM、微驱动器和磁光盘、ROM、RAM、EPROM、EEPROM、DRAM、VRAM、闪存装置、磁卡或光卡、极小系统(包括分子存储IC)、或适合于存储指令和/或数据的任意类型的介质或装置。
存储在任意一种计算机可读介质上,本发明包括用于控制通用/特殊计算机或微处理器的硬件、并使得该计算机或微处理器可以与人或其它利用本发明结果的机械交互的软件。这种软件可以包括但不仅限于装置驱动程序、操作系统、执行环境/容器和应用程序。
本发明的优选实施例的上述描述是为了说明目的,并不是穷尽的或将本发明限制为公开的确定形式。本发明的技术人员可以进行很多修改和变化。特别是,虽然在上述系统和方法的实施例中概念“类型”用于XML和Java,很明显,该概念也可以互换地和等价概念使用,如接口、形式、类、对象、bean、和其它合适概念。选择和描述实施例是为了最好的描述本发明及其实际应用的原理,由此使其它技术人员能够理解本发明,各种实施例以及具有各种适用于特殊应用的修改的实施例都在预料之中。本发明的范围由权利要求及其等价物限定。
权利要求
1.一种在XML和Java之间排列和解排列数据的系统,包括XML数据;定义XML数据的XML模式;XML类型,其是可以在Java内访问XML数据的Java类型;以及可以从XML模式生成XML类型的编译器。
2.根据权利要求1所述的系统,其中所述编译器可以基于Java万维网服务方法的定义来生成XML类型。
3.根据权利要求1所述的系统,其中所述编译器可以基于定义文件来生成XML类型。
4.根据权利要求1所述的系统,其中所述编译器可以将Java方案编译成一个或多个常规Java类型。
5.根据权利要求1所述的系统,其中所述XML类型可以是可移动光标,能在XML数据内的任意地方进行读取。
6.根据权利要求1所述的系统,其中所述XML类型可以是不可移动值,能引用XML数据的固定部分。
7.根据权利要求1所述的系统,其中所述XML类型可以在多个Java组件之间共享。
8.根据权利要求1所述的系统,其中所述XML类型可以在Java内更新XML数据。
9.根据权利要求1所述的系统,其中所述XML类型可以使用Java类型方法来访问和更新Java数据。
10.根据权利要求1所述的系统,其中所述XML类型可以访问和更新数据库。
11.根据权利要求1所述的系统,其中所述XML类型可以进行多个XML数据操作,包括查询XML数据、在XML类型之间转换、以及在XML数据文件上进行迭代。
12.根据权利要求1所述的系统,还包括可以定义XML数据的合法类型的XML模式,该合法类型包括对数据类型和数据范围的约束;以及对数据类型和XML类型范围的约束。
13.根据权利要求12所述的系统,其中所述编译器可以由关于XML数据的合法类型的XML模式生成XML类型的约束。
14.根据权利要求12所述的系统,其中所述对XML类型的约束可以验证该XML类型。
15.一种在XML和Java之间转换类型的系统,包括Java类型;XML类型,其是可以在Java内访问XML数据的Java类型;以及可以将源类型转换为目标类型的XML转换,其中所述源类型和目标类型可以是XML类型或Java类型。
16.根据权利要求15所述的系统,还包括XML转换的全局记录,可以查询在源类型和目标类型之间的现有XML转换。
17.根据权利要求15所述的系统,还包括XML转换库,可以在源类型和目标类型之间通过名称来查询现有的XML转换。
18.一种在XML和Java之间排列和解排列数据的系统,包括XML数据;可以将XML数据作为可搜索索引保持的轻便XML存储器;XML类型,其是可以在Java内引用该轻便XML存储器并访问XML数据的Java类型。
19.一种在XML和Java之间排列和解排列数据的系统,包括XML数据;可以将XML数据保持在文本或标记级别的轻便XML存储器;XML类型,其是可以在Java内引用该轻便XML存储器并访问XML数据的Java类型。
20.根据权利要求19所述的系统,其中所述轻便XML存储器可以将保持的XML数据表示为分层结构。
21.根据权利要求20所述的系统,其中所述分层结构可以是树。
22.根据权利要求19所述的系统,其中所述XML类型可以增量地访问XML数据。
23.一种用于在XML和Java之间排列和解排列数据的方法,包括用XML模式定义XML数据;在Java内通过XML类型访问XML数据;以及用编译器从XML模式中生成XML类型。
24.根据权利要求23所述的方法,还包括基于Java万维网服务方法的定义来生成XML类型。
25.根据权利要求23所述的方法,还包括基于定义文件来生成XML类型。
26.根据权利要求23所述的方法,还包括将Java方案编译为一个或多个常规Java类型。
27.根据权利要求23所述的方法,还包括将所述XML类型用作可移动光标来在XML数据内的任意地方进行读取。
28.根据权利要求23所述的方法,还包括将所述XML类型用作不可移动值来引用XML数据的固定部分。
29.根据权利要求23所述的方法,还包括在多个Java组件之间共享所述XML类型。
30.根据权利要求23所述的方法,还包括在Java内通过所述XML类型更新XML数据。
31.根据权利要求23所述的方法,还包括使用Java类型方法来访问和更新Java数据。
32.根据权利要求23所述的方法,还包括通过所述XML类型来访问和更新数据库。
33.根据权利要求23所述的方法,还包括通过所述XML类型来利用多个XML数据操作,这些操作包括查询XML数据、在XML类型之间转换、以及在XML数据文件上进行迭代。
34.根据权利要求23所述的方法,还包括通过XML模式定义XML数据的合法类型,该合法类型包括对数据类型和XML数据范围的约束。
35.根据权利要求34所述的方法,还包括由关于XML数据的合法类型的XML模式生成数据类型和XML类型范围的约束。
36.根据权利要求34所述的方法,还包括利用所述对XML类型的约束来验证该XML类型。
37.一种在XML和Java之间转换类型的方法,包括采用Java类型;采用XML类型,其是可以在Java内访问XML数据的Java类型;以及通过XML转换将源类型转换为目标类型,其中所述源类型和目标类型可以是XML类型或Java类型。
38.根据权利要求37所述的方法,还包括通过XML转换的全局记录查询在源类型和目标类型之间的现有XML转换。
39.根据权利要求37所述的方法,还包括通过XML转换库在源类型和目标类型之间用名称来查询现有的XML转换。
40.一种在XML和Java之间排列和解排列数据的方法,包括通过轻便XML存储器将XML数据保持为可搜索索引;以及通过XML类型在Java内引用该轻便XML存储器并访问XML数据。
41.一种在XML和Java之间排列和解排列数据的方法,包括通过轻便XML存储器将XML数据保持在文本或标记级别;通过XML类型在Java内引用该轻便XML存储器并访问该XML数据。
42.根据权利要求41所述的方法,还包括将保持的XML数据表示为分层结构,该分层结构可以是树。
43.根据权利要求41所述的方法,还包括通过XML类型增量地访问XML数据。
44.一种存储了指令的机器可读介质,其在由处理器执行时使得系统用XML模式定义XML数据;在Java内通过XML类型访问XML数据;以及用编译器从XML模式中生成XML类型。
45.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统基于Java万维网服务方法的定义来生成XML类型。
46.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统基于定义文件来生成XML类型。
47.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统用编译器将Java方案编译为一个或多个常规Java类型。
48.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统将所述XML类型用作可移动光标来在XML数据内的任意地方进行读取。
49.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统将所述XML类型用作不可移动值来引用XML数据的固定部分。
50.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统在多个Java组件之间共享所述XML类型。
51.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统在Java内通过所述XML类型来更新XML数据。
52.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统使用常规Java类型方法来访问和更新Java数据。
53.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统通过所述XML类型来访问和更新数据库。
54.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统通过所述XML类型来利用多个XML数据操作,这些操作包括查询XML数据、在XML类型之间转换、以及在XML数据文件上进行迭代。
55.根据权利要求44所述的机器可读介质,还包括指令,使得在执行时让系统通过XML模式定义XML数据的合法类型,该合法类型包括对数据类型和XML数据范围的约束。
56.根据权利要求55所述的机器可读介质,还包括指令,使得在执行时让系统用关于XML数据的合法类型的XML模式生成对XML类型的约束。
57.根据权利要求55所述的机器可读介质,还包括指令,使得在执行时让系统利用所述对XML类型的约束验证XML类型。
58.一种存储了指令的机器可读介质,其在由处理器执行时让系统采用Java类型;采用XML类型,其是可以在Java内访问XML数据的Java类型;以及通过XML转换将源类型转换为目标类型,其中所述源类型和目标类型可以是XML类型或Java类型。
59.根据权利要求58所述的机器可读介质,还包括指令,使得在执行时让系统通过XML转换的全局记录在源类型和目标类型之间查询现有的XML转换。
60.根据权利要求58所述的机器可读介质,还包括指令,使得在执行时让系统通过XML转换库在源类型和目标类型之间用名称来查询现有的XML转换。
61.一种存储了指令的机器可读介质,其在由处理器执行时让系统通过轻便XML存储器将XML数据保持为可搜索索引;以及通过XML类型在Java内引用该轻便XML存储器并访问XML数据。
62.一种存储了指令的机器可读介质,其在由处理器执行时让系统通过轻便XML存储器将XML数据保持在文本或标记级别;以及通过XML类型在Java内引用该轻便XML存储器并访问该XML数据。
63.根据权利要求62所述的机器可读介质,还包括指令使得在执行时让系统将保持的XML数据表示为分层结构,所述分层结构可以是树。
64.根据权利要求62所述的机器可读介质,还包括指令,使得在执行时让系统通过XML类型增量地访问XML数据。
65.一种在XML和Java之间排列和解排列数据的系统,包括用XML模式定义XML数据的装置;在Java内通过XML类型访问XML数据的装置;以及用编译器从XML模式中生成XML类型的装置。
66.一种体现为传输介质中的计算机数据信号,包括包括用XML模式定义XML数据的指令的代码段;包括在Java内通过XML类型访问XML数据的指令的代码段;以及包括用编译器从XML模式中生成XML类型的指令的代码段。
全文摘要
XML类型的使用可以准许XML类型系统和Java类型系统的组合,这通过将在XML文件中定义XML数据的XML模式翻译为在Java中的XML类型,克服了现有排列和解排列系统中的很多缺陷。与在XML和Java之间进行翻译的传统尝试不同,实现为XML类型的XML模式可以完全忠实于XML,并能进行很多XML数据操作。此外,XML类型可以在它们自身和Java类型之间转换,并且以标记级别保留XML信息的轻便存储器准许增量的XML排列和解排列。该说明不是为了穷尽本发明的描述或限制本发明的范围。本发明的其它特征、方面和目的可以从说明书、附图以及权利要求的查看中获得。
文档编号G06F9/45GK1799029SQ200480002764
公开日2006年7月5日 申请日期2004年1月23日 优先权日2003年1月24日
发明者戴维·鲍 申请人:Bea系统公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1