微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > XQJ解析 用于XQuery查询的Java API

XQJ解析 用于XQuery查询的Java API

时间:06-02 来源:IT专家网 点击:

XQuery有双重的"上下文"概念:静态的上下文和动态的上下文。XQJ提供了XQStaticContext和XQDynamicContext接口来为它们建模。XQStaticContext提供了方法检索定义在XQuery静态上下文中的信息,比如base URI、the boundary-space policy等等,允许应用检索关于全局静态上下文中的信息。比如,XQConnection接口扩展了XQStaticContext接口。

  相比之下,XQDynamicContext接口让应用检索关于动态上下文的信息,并且改变这些信息。尤其,它提供方法绑定XQuery变量到各种数值,这些变量是动态上下文的一部分。XQPreparedExpression和XQExpression接口都扩展XQDynamicContext。上面的例子可以对XQPreparedExpression调用bindString()方法,因为bindString()是基类的XQDynamicContext接口中定义的方法。

  和JDBC不同的是由于绑定到XQuery变量的值不一定是简单的标量值,XQDynamicContext中的bindXXX()方法可以有一种延迟绑定模式(deferred binding mode)。在延迟绑定模式中,这个绑定的数值可能直到XQuery处理器真正的访问了该变量才会被使用,这让XQJ潜在的使用基于流水线的惰性数值赋值模型。

  XQuery数据模型的支持

  再次,XQuery的结果是XQuery数据模型的一个实例,它由XQuery元素的序列组成。每个元素可以是原子数值或者XML节点(文档, 元素, 属性, 注释, 处理指令, 或者文本)。XQSequence接口建模XQuery数据模型。它包含零个或者多个XQItem接口对象。XQItem接口代表了XQuery 数据模型中的元素。程序员通过调用XQSequence.getItem()或XQConnection.createItem()方法获得XQItem 。

  虽然XQItem和XQSequence代表了独立于XQuery结果的XQuery的元素和序列,XQResultItem和XQResultSequence(分别扩展了XQItem和XQSequence)代表了从XQuery执行结果中得到的XQuery元素和序列。

  如果XQItem是原子数值,你可以使用某种getXXX()方法将它转换到对应的Java数据类型,这些方法包括getInt()、getString()等等。假如XQItem是XML节点,你可以通过已有的XML节点操作接口访问它,这些接口包括DOM、SAX或者StAX。XQItem和XQSequence都扩展了XQItemAccessor接口,该接口定义了各种元素访问方法。比如,getNode()方法返回了DOM节点。writeItemToSAX()方法通过将序列顺序化为SAX事件来产生SAX事件。getItemAsStream()方法将序列顺序化为XMLStreamReader事件流。进一步,XQJ定义了一套进行Java数据类型和XQuery数据类型之间的标准映射,来辅助将标准的Java类型绑定到XQuery变量。

XQuery类型系统的支持

  XQuery有类型--并且还有支持它们的接口。XQSequenceType和XQItemType接口允许用户使用XQuery类型系统。XQSequenceType接口代表了XQuery中定义的序列类型(sequence ),而XQItemType接口代表了XQuery中定义的元素类型(item type) 。XQItemType扩展了XQSequenceType 但是将出现次数限制为1。XQItem接口包含了获得关于XQuery元素类型信息的方法,比如元素类型、基础类型、节点名(如果有的话)、节点类型名(如果有的话)以及和类型有联系的任何XML Schema URI。

  XQJ给予了实现很大的自由处理XML模式类型。因为XQJ被设计为能够和各种XQuery引擎协同工作,你不能为XQJ的实现和底层的XQuery引擎之间假设任何特定的关系。因此你不能假设某个XQJ的时间和XQuery引擎会共享相同的XML模式仓储。为了解决这个问题,XQJ API使用叫做isUserDefinedXMLSchemaTypeSupported()的XQMetaData方法来判断是否XQJ的实现可以回答关于对XML模式依赖的问题。对于紧耦合的系统,XQuery引擎和XQJ实现共享了相同的XML模式仓储,isUserDefinedXMLSchemaTypeSupported 就会返回ture,对于松耦合的系统,这个值被设为false。

  使用XQMetaData

  XQMetaData接口为用户提供了关于底层XQJ和XQuery实现的额外的信息。它包含方法查询某些特定的XQuery的功能,比如StaticTypingFeature和SchemaImportFeature,是否被支持。它还提供了关于数据源的通用信息。XQMetaData接口为XQJ用户起到了可移植层的作用。这类似于JDBC中的DatabaseMetaData接口。

  未来的发展方向

随着SQL/XML成为标准,程序员将能够在SQL中嵌入和执行XQuery--这样JDBC最终会支持XQuery。但是,我们相信XQJ仍然是必要的,由于不是所有的需要XQJ的XQuery处理器都支持SQL和SQL/XML。进一步,XQJ已经定义了一些重要的接口(上面已提到)来建模XQuery中的关键概念,以及经典的XML Java接口,比如DOM、SAX和StaX。当JDBC最终支持SQL/XML 2006,它让SQL调用XQuery,这些XQJ接口会被使用。潜在的集成

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top