XQuery

2024-05-22

XQuery(共6篇)

XQuery 篇1

摘要:XML已经成为网络上信息描述和信息交换的标准,随着XML应用得越来越广泛,人们提出了多种XML数据的查询方法。但是,很多查询方法都有各自的局限性。利用有意义的最小公共实体结构EntityInMLCAS(Entity In Meaning Lowest Common An- cestor Structure)原理,提出一种优化查询方法。同时采用堆栈技术的方法对XML文档结点树进行自顶向下的遍历,该方法大大提高了优化查询的速度。

关键词:XML,XQuery,EntityInMLCAS,结构化查询

0 引言

XML的出现给基于Web的数据交换带来了一场革命,越来越多的文档以XML格式表示。如何在浩如烟海的XML文档中快速、准确地检索到所需信息,已成为XML研究领域的一项重要课题和迫切任务。目前基于XML文档的查询分为两种,一种是基于关键字的查询,另一种是基于XML文档结构的查询。XKeyword[1]和XSEarch[2]是基于关键字的查询,而XQuery[3]是基于XML文档结构的查询。这两种查询都有自己的缺点,基于关键字的缺点是这种查询不是基于语义的查询,所以最终的结果会带来大量没用的信息,干扰查询的结果;基于XML文档结构的查询能够做到准确的查询,但它需要查询者熟悉XML知识并且了解XML文档结构。

本文介绍一种基于XQuery的插询方法,它不需要查询者了解XML文档结构,具有一定的语义关系,同时又能够准确地查询到查询者想要查询的信息。

1 查询优化

当W3C提出XML文档的Schema后,人们可以很方便地用XML来表示自己的文档,但同时也出现了因为这种自由带来的无序。图]给出了两种XML文档的Schema结构,在查询“张三出版的出版物的题目和年份”,给出XQuery查询算法见算法1。

算法1

在对图1中Schema A进行查询时,得到结点(2),包括了结点(4)和(7),而结点(7)是干扰信息;而在对图1中Schema B进行查询时,得到结点(3)是所要的信息,从而可以知道对不同的XML文档有不同的查询结果,因此查询者必须了解XML文档的结构才能准确地查询,得到没有干扰的信息。下面的算法对查询进行优化,消除干扰信息。

1.1 EntityInMLCAS函数的设计

定义1设XML文档中所有结点为N,存在结点d1、d2和a∈N,当结点a是结点d,的祖先结点,同时也是结点d2的结点,对于∀结点a'∈N,当a'是d1和d2的祖先时,结点a不是结点a'的祖先,则称结点a是结点d1和d2的最小公共祖先LCA(Lowest Common Ancestor)[4,5,6,7]。

定义2设XML文档中所有结点为N,∃结点d1、d2、d3、a'和a∈N,如果结点a是结点d1和d2的LCA,结点d1、d3属于同类(具有相同的标签名),结点a'是d2和d3的LCA,结点a又是结点a'的祖先,则称结点a'是结点d1和d2的有意义的最小公共祖先MLCA(Meaning Lowest Common Ancestor)[8]。

定义3满足MLCA的结点构成了有意义的最小公共祖先结构MLCAS(Meaning Lowest Common Ancestor Structure)。

定义4 XML文档的Schema结构可以看成一个有向图G的二元组(V,E),V对应有向图G中的结点,E对应有向图G中边,边Eab,由结点a指向结点b,则称结点a存在出度,并记λa=1;结点b存在入度,记γb=1。

定义5 XML文档中结点集N中,对于任意结点a,存在λa,=0,则称结点a对应一实体的属性。

定义6 XML文档中结点集N中,对于任意结点a,存在λa>0,则称结点a对应一实体。

边Eab,由结点a指向结点b在有向图G的二元组(V,E)中,存在边Eab,由结点a指向属性结点b,则称结点a为属性结点b对应的实体。

定义7 XML文档中结点集N中,属性和实体可以构成MLCAS,满足MLCAS的属性的实体结构构成了有意义的最小公共实体结构EntityInMLCAS (Entity In Meaning Lowest Common Ancestor Structure)。

如图2的A中结点a是d1和d2构成了MLCAS记作MLCAS(a,d1,d2),属性结点{d1,d2}的实体为{a,a},所以{a,a{构成了EntityInMLCAS,记作EntityInMLCAS(a,a,a);B中的结点a是结点d1的祖先,结点a'是d2和d3的最小公共祖先,而a又是结点a'的祖先,所以结点a、d1、d2和d3构成了ML-CAS,记作MLCAS(a,d1,d2,d3),属性结点{d1,d2,d3}的实体为{a,a',a'},所以{a,a',a'}构成了EntityInMLCAS,记作EntityInMLCAS(a,a,a',a')。

1.2 算法优化

在查询时,根据输入的关键字属性,通过EntityInMLCAS运算,可以得到关键字属性的有意义的最小公共实体结构集,然后再通过XQuery条件判断出满足条件的实体,最后将实体的属性返回给用户,即为用户需要的信息。

按照这个思想将算法1改进,得到了算法2,是基于XQuery的优化的查询算法。

按照算法2再对图1A中的“张三出版的出版物的题目和年份”进行查询,先找出属性{作者,题目,年份}对应的EntityInMLCAS,可以得到{4,4,2}、{7,7,2}、{13,13,2}、{17,17,2},再根据XQuery条件判断,因为结点4的属性的题目值为“XML”,即4/题目=XML,从而可以得出{4,4,2}满足要求。

算法2

2 优化查询的实现

XML文档的结点树可以用(DocID,Start)来表示(其中DocID为XML文档ID,Start为结点在文档中的开始位置),通过EntityInMLCAS函数得到实体集,然后利用XQuery条件判断得到相应实体,根据实体结点(DocID,Start)可以索引到该结点,从而可以查询出该实体属性的值,即得到用户需要的信息。本文用堆栈的方法来实现EntityInMLCAS函数的实体集,能较大程度地减少查询的时间,这样提高了查询的效率。

当XML文档被读入的时候,首先采用EntityInMLCAS()函数(EntityInMLCAS()函数见函数1)来找出要查询属性的实体集。

函数1

对图1中Schema A找出实体集的过程如下(见图3):首先读入结点1,进栈,因为结点1有子结点2,结点2入栈;读入栈顶结点2的子结点3,因为结点3是要查询的第三个变量,所以将栈顶结点2(结点3的实体)传给E[2],同时将有意义的最小公共祖先指向栈顶结点2,结点3入栈;此时结点3没有子结点,所以出栈;读入结点4,有子结点则将4入栈,同时读入子结点5,结点5是要查询的第二个变量,将栈顶结点4传给E[1],结点5入栈,因为结点5没有子结点所以出栈;同样读入结点6,并将栈顶结点4传给E[0];此时没有子结点则结点4出栈,读入结点7,同样E[4]=结点7,E[3]=结点7,同时栈顶结点7出栈;栈顶结点2没有子结点,则出栈,因为结点2是有意义的最小公共祖先,所以将E中元素传给EList为{4,4,2},{7,7,2};接着读入结点11,结点11有子结点所以入栈,接着读入结点11的子结点12同结点3,结点13同结点7,结点17同结点4。最后等到EList为{4,4,2},{7,7,2},1 13,13,12},{17,17,12},所以“结点4/题目/text()=XML”满足要求。

此算法采用堆栈方法,对XML文档只扫描一次,因此所需的最大时间为O(n)(其中n为XML文档的结点个数)。

3 实验

我们用一台P4 2.4G的电脑,内存512M,Windows Xp操作系统能够作为实验平台,对网上的含有大量信息的XML文档分别采用EntityInMLCAS和XSEarch方法进行查询,可以得出如图4所示的结论。

图4是两种方法对XML文档进行查询的召回率,可以看出采用EntityInMLCAS函数方法的召回率明显要优于采用XSEarch方法的召回率。同时EntityInMLCAS所需最大的查询时间为遍历结点的时间,这是每个查询所需的最少时间,因此本文介绍的查询方法是效率高的。

4 结论

本文提出的基于XQuery的优化查询方法,只要查询者输入查询的关键字,无需了解XML文档结构也无需熟悉XML与XQuery语法,就可以方便快捷而且准确地查询出所要查询的信息,可以在这个高速发展的时代充分提高效率。实验证明这种查询方法是较为有效的,能够达到查询者的要求。

参考文献

[1]Hristidis V,et al.Keyword proximity search on XML graphs.In ICDE,2003.

[2]Cohen S,et al.XSEarch:A semantic search engine for XML.In VLDB,2003.

[3]Chamberlin D.XQuery:An XML query language.IBM System Jour- nal,2003,41:597-615.

[4]Florescu D,et al.Integrating keyword search into XML query process- ing.Computer Networks,2000,33:119-135.

[5]Cohen S,et al.XSEarch:A semantic search engine for XML.In VLDB,2003.

[6]Gun L,et al.XRANK:Ranked keyword search over XML documents. In SIGMOD,2003.

[7]Hristidis V,et al.Keyword proximity search on XML graphs.In IC- DE,2003.

[8]Yunyao Li ,Cong Yu H V.Jagudish Schema-Free XQuery.Proceedings of the 30th VLDB Conference,Toronto,Canada,2004.

XQuery 篇2

XQuer y injection is very similar as a variant of the classic SQL injection attack.It uses improperly validated data that is passed to XQuery command, which will be executed to have illegal access to confidential information stored in either relational databse or XML database[1].Also, an attacker can pass XQuery expression embedded in standard XML documents, or, simply, the attacker can inject XQuery content as part of a SOAP message, which causes a SOAP destination service to manipulate an XML document incorrectly[2].

A typical XQuery, i.e.in a file named“profiles.xml”with profiles, profile and name labels, is as follows.

doc (“profiles.xml”) /profiles/profile[name=“Alice”]

This query is used to find a user named Alice’s information in the XML file-“profiles.xml”.

However, if the attacker can manage to pass“something’or‘1’=’1”to XQuery to make it look like

doc (“profiles.xml”) /profiles/profile[name=“something”or“1”=“1”]

This would cause database to return the set of all users’information, because“name=’something’or‘1’=’1’is always true.

Just like there are different SQL injection problems, XQuery also has other injection problems.In particular, with XPath[3]that bears some resemblance to an SQL query and XQuery update facility service, an attacker will find himself/herself easier to change or delete important information in a XML database.For example, a typical SQL injection query used to delete a database table file looks like the one below.

SELECT email, passwd, login_id, full_nameFROM members WHERE email=‘x’;DROP TABLE members;--’;

In this query, “members”represents database table names.This query with injection“DROP TABLE members;--”deletes the table named“members”.Here this email address can any email address and“—“means the start of an SQL comment.The injection still works even without the“—”.

A very simple and extreme XQuery injection is similar to the above SQL injecton.An example that erases anything from the collection and leaves empty document elements is as below[1], which is for$u in//user return update delete$u/ (@*|node ()

In a word, in a similar way that SQL injection allows an attacker to exploit SQL calls to SQL database systems, XQuery/XPath commands are passed to application in server, which will traverse and execute commands in the XQuery routines that have access to.In fact, besides the attacks mentioned above, there are many other attacks that can be done by XQuery.XQuery is powerful language that allows direct calls into JVM through external function.This will would allow an attacker, for instance, to call System.exit (-1) thought a specialty crafted query.

Under this situation, the countermeasures to these crafted attack strings are very important.

2 XQuery Interceptor

The XQuery interceptor is used to intercept the user input that are associated with XQuery, which will provide resource for XQuery analyzer in next step.In my implementation, all input from webpage is defined as type xs:string in XQuery.In real scenario, it might have other data types like xs:integer, xs:date and etc.The snippet of XQuery module code that transfers the input to the interceptor Java class is as follows.The Java class named“Interceptor Module”is imported in the first line and the class method“read And Parse”with the input string is in the try clause.

This model and the following two models should be located in web server since their purpose is to sanitize the client’s inputs before they are passed to application software and get executed.

3 XQuery Analyzer

This analyz er module basically takes the intercepted XQuery input from XQuery interceptor and tokenizes the query to retrieve the input parameter.The process needs to be generic and effective in order to detect any type of possible injection.Although several methods are available, a powerful technique is to convert the input parameter to a XML, a well-formed document with independent platform.This XML file will be validated by a constructed scheme.

For example consider the following query

This XML file consists of only the input parameters inputted by the user from the client application, which can be easily validated by the constructed validation schema, which will be talked below.

In my implementation, for simplicity, I only considered about one injection case, which is“‘anything’or‘1’=‘1’, but in a real scenario, all malicious injection cases should be taken into account.In order to have a more efficient defense mechanism, people in industry should collect all kind of injection data and put them into a database for this analyzer module.Below are several other typical injection strings that are similar to the one I used for experiment.

4 XQuery Validation

The validat ion process is to identify the injected parameters by a constructed schema and the generated XML input file as Example 1 in section 4.2.XML schema is very powerful and effective since the XML schema can be used to define the structure of the XML document and even provide various constraints for it.The proposed schema is a generalized Meta data, which defines structure and type of user input.Basically, the validation process identifies any possible injections in the input values, which are stored in such an input XML file like example 1.Once an injection is detected, the error information can be written to a log file.Because my program is just based on a simple case, I just simply returned the error information back to XQuery module, which correspondingly refuses to show up any information on client’s webpage (Figure 1) .

5 Conclusions and Future Work

My experiment illustrates that poor software without a validation mechanism can cause severe security problem to XML database.A simply crafted input string with simple suffix like“or 1=1”would expose confidential information to attackers.To defeat this kind of injection problem, a simple input validation mechanism that focuses on malicious“keyword”sanitization would be very effective.In order to efficiently defeat this kind of injection problems, software developers or network administers should have a complete injection data database.Besides, a good learning algorithm can be a good solution, too, because it will help enrich a injection database.

Just as traditional relational database does not have access control mechanism, XML database does not have any such kind of security mechanism, either.As I discussed in introduction, with the publication of update service facility, attackers would get more chances to modify or expose confidential information stored by XML information.Without a synchronized access control mechanism, even ordinary users could ruin the data saved in databases.In my future work, I proposed to implement an access control mechanism by using XACML and security policy that assigns different access rights to different users on corresponding information.Besides, a synchronization mechanism is proposed to be implemented as well, because this will avoid such a situation such as two users are trying to write information at the same time.

In addition, for a XML database like Base X that supports Java import or URI rewriting, it definitely gives attackers the chances to do malicious attack.My future work will also include exploring these vulnerabilities and seeking the way to fix these problems.

参考文献

[1]Eric van der Vlist.XQuery Injection--Easy to exploit, easy to prevent[M].2011, 8.

[2]http://www.w3.org/TR/2011/WD-xpath-30-20111213/[OL].

XQuery 篇3

XML(eXtensible Markup Language,可扩展标记语言)[1]是一种通用标记语言,能够非常灵活地标记Web上多种不同数据源中的信息,具有开放性、灵活性、易读性和平台无关性等特点。随着基于Internet商业应用的迅速发展,XML已经成为Internet上数据表示和数据交换的标准格式,就现状和发展趋势来看,关系数据库经过多年发展已经非常成熟,在商业数据管理领域中占据着主导地位。XML在过去几年的时间里得到了极大地发展,它从最开始的为文档保留语义的标记语言变成了异构系统间交换数据的格式。不仅如此,越来越多的研究项目把纯XML数据库作为他们的研究对象[2]。随着有效地存储和查询XML的需求不断升温,这样就涌现出许多查询语言来解决存在的一系列问题。其中最有代表性的XML查询语言就是XQuery。

1、XQuery优化背景

过去几年里,在以文档为中心和以数据为中心的环境里,作为信息的一种格式化语言,XML迅速得到了广泛的欢迎。基于XML的标准(XML-based standards)爆炸似地增长,表明XML受到了许许多多不同技术联盟(Communities)的关注。现在,许多应用程序使用XML来传送消息,如SOAP、XML-RPC消息;或者作为数据的永久性存储,如XML数据库、内容管理系统。一个以XML为基础的Web,将替代以HTML为基础的Web,听起来不再是幻想。

由于Web数据的特点,传统的数据库技术和信息检索技术已经不能满足用户的要求,而随着存储在XML文档中信息量的增长,能有效并且高效地存取XML信息就变得越来越重要。要做到这一点,必须要有一个让你能够准确地获得所需信息、更新XML数据源中数据的可表达的查询语言。XQuery正是这样的语言。有了相应的查询语言,但在XML数据查询处理研究中,需要关注下列问题:

(1)如何定义完善的查询代数。

(2)复杂路径表达式是XML查询语句的核心,必须将复杂、不确定的路径表达式转换为系统可识别的、明确的形式。

(3)XML数据信息统计和代价计算。

基于上面的各种问题,为了满足用户查询的需要,高效的查询性能对于查询来说非常重要。因此,本文主要针对XQuery的查询优化技术进行研究。

2、本文主要研究内容

本文讨论的是XQuery语言的查询优化问题。基于这样的前提,文章对问题采用XQuery到SQL的查询语言转换方案[32,33,34,35,36,37,38,39],目的不仅是实现XQuery在关系数据库中的查询处理,更具现实意义的是能够充分利用关系引擎的已有功能,降低问题难度并可提高解决问题的效果。

二、XQuery相关知识

1、XQuery语言

XQuery是一个从XML格式的文档中获取数据的查询语言,起源于XML数据查询语言Quilt[40]。

(1)查询结构和表达式

XQuery遵循一定的查询结构,一个完整的查询包含两个部分:查询序言(Query Prolog)和查询体(Query Body)。查询序言包括一系列处理查询体的定义声明;查询体是一段查询表达式,是XQuery的主体部分。当查询体需要用到名字空间、模式信息、或函数时,就需要在查询序言部分有相应的声明。XQuery表达式是XQuery中每一个元素的最高程度的抽象,并且是XQuery中的基本构建块,是XQuery查询的基础。

XQuery定义的表达式由关键字、符号以及操作数组成。通常,表达式中的操作数也是表达式。XQuery是函数化的语言。XQuery也是一种强结构化的语言,表达式中的操作数、算子、函数必须遵循已经定义好的模式。XQuery中共有七种表达式[44]:路径表达式、构造器(Constructor)、FLWOR表达式、包含算子和函数的表达式、条件(Conditional)表达式、量词(Quantified)表达式、检查和修改数据类型的表达式。

三、基于关系数据库的XQuery查询处理

1、XQuery查询技术概述

随着SQL/XML标准的出现,一些数据库管理系统通过使用XMLType表和XMLType列,将XML存储在关系数据库系统中,甚至用户通过使用SQL/XML发布函数,例如XMLElement()、XMLConcat()等,将关系数据转化成XMLType视图。但是随着技术的发展,将XML查询执行嵌入到关系数据库中已成为研究的热点,其中最有代表的就是在SQL中使用XQuery,即一种新的SQL函数XMLQuery()以及from语句的构造函数XMLTable的出现。

为了支持XMLQuery()以及XMLTable构造函数,一个很直接的方法就是在已有的处理器上再加入一个协作处理器,即将它嵌入到XQuery处理器中。但是这种方法会遭到性能问题的困扰。在这里将介绍一种新的机制,即本地XQuery编译,优化以及执行。具体来说就是将XQuery重写成SQL,然后将重写后的结果送入底层的关系优化器进行优化,最终在关系执行引擎中执行。

2、SQL/XML混合执行策略

上面讲到的XMLQuery()函数和XMLTable构造函数的重写发生在SQL查询编译期间。在SQL解析时,依据语法在内建的XQSeq()表函数中将XMLTable转化成XMLQuery()函数,然后在SQL语法分析、类型检查以及视图扩展完毕后开始进行XMLQuery()函数的重写。具体就是重写驱动程序将静态XQuery表达式进行解析,也就是在XQuery上进行静态分析和类型检查,并将它转化成本地带有XML扩展操作符的SQL数据结构,并将原先的XMLQuery()函数进行替换。若XQuery表达式不能重写成SQL,那么将XMLQuery()函数完整无缺的保留。在重写语句完成后,SQL直接进行各种转化,比如操作符树的优化、视图合并、子查询分解嵌套等,然后将结果输入到优化器中产生一个最优的执行计划。

3、XQuery重写成SQL

每一种XQuery表达式都与它能被编译成的SQL表达式相对应。每一个表达式能被转化成一个新的SQL操作符、操作符树或一个子查询块。例如FLWOR表达式重写成SQL子查询,XQuery构造表达式重写成SQL/XML函数等等。表1给出了一些常用的XML/XQuery内部SQL操作符。

上面的这些函数对于进行XQuery重写有很大的贡献。下面就分别介绍XQuery重写的内容。

(1)FLWOR表达式的重写

FLWOR表达式的重写实质上是构造一个SQL子查询成为重写结果。其中FLWOR表达式中的for语句转变成SQL语句中的from语句,而where语句重写成SQL中的where语句,order语句重写成SQL中的order语句,返回语句重写成SQL中的select列表。

(2)构造函数的重写

这种重写实质上是构造一个SQL操作符树作为重写。这棵树由SQL/XML函数组成,例如XMLElement()、XMLAttributes()、XMLPI()、XMLComment()。增强上述这些函数的功能来处理标记名。但是这些标记名的值仅仅在运行时才可用,因为仅仅在构造操作进行时重写才是必需的。

(3路径表达式的重写

这种重写实质上是构造XQExtract()SQL操作符,它是对XPath进行运算并返回XML结果。构造操作符完成后在XQExtract()操作符上对XPath进行重写,重写成SQL/XML和对象关系型原始操作符。

(4)Literals重写

这种重写实质上是重写成SQL literal,然后用Mk XQFromSQL()函数将结果进行封装。

(5)条件表达式的重写

这种重写实质上是构造一个SQL CASE操作符作为重写结果。

(6)存在量词表达式的重写

这种重写实质上是构造一个SQL EXIST/NOT EXISTS子查询。

(7)聚集函数表达式重写

这种重写实质上是构造相应的SQL聚集函数,例如min()、max()、count()等。然后将重写结果用Mk XQFrom SQL()函数进行封装。

(8)XQuery序列构造重写

这种重写实质上是构造一个新的XQConcat()操作符作为重写结果。

(9)算术、逻辑、比较运算重写

这种重写实质上就是构造相应的SQL算术、逻辑以及比较运算操作符作为重写结果。对于一般的比较运算符,将它们重写成EXISTS子查询。因为XQuery允许带有内建类型的基本算术和比较函数的多次使用,所以如果输入的类型在静态类型检查原语中有不同的内建类型可供选择,则需要构造多态SQL算术和比较运算符。

(10)范围表达式的重写

这种重写实质上是构造XQRange()操作符作为重写结果

(11)Cast和构造函数的重写

这种重写实质上就是使用底层SQL casting函数,然后用Mk XQFrom SQL()函数将结果进行封装。

(12)序列类型表达式重写

这种重写实质上是用SQL CASE操作符来构造XQ-Typ Check()操作符作为重写结果。

(13)验证表达式重写

这种重写实质上是构造内部XMLValidate()操作符作为重写结果

(14)XQuery函数/操作符重写

将XQuery函数和操作符映射成为存在的SQL函数或操作符。对于某一个XQuery函数或操作符没有等价的SQL函数或操作符相对应的情况,新的SQL操作符在RDBMS引擎中被创建,并实现相应的XQuery操作符的语义。对于fn:doc()和fn:collection()函数而言,将它们重写成SQL查询块。当然可以通过SQL/XML函数将关系视图转化成XML,从而直接查询XML,例如使用ora:view()函数。

(15)用户自定义XQuery函数重写

最常见的就是将自定义的函数重写成某一个RDBMS中的某一类内建函数。例如在Oracle中就是重写成PL/SQL函数。

4、混合执行策略的代数优化

XMLTable构造和XMLQuery()函数重写成SQL的语法转化,常导致一个复杂的SQL语句块的产生。例如每一个XML-Query()本质上都要变成带有很大一棵操作符树的一组嵌套查询块。接下来就要对这棵庞大的操作符树进行削减优化。但是没有嵌套的子查询和视图合并机制能简化这SQL语句块的结果,因此必须增强当前的代数规则,以致于用这种增强的规则来处理由XQuery重写产生的SQL函数以及操作符。

5、实验分析

本实验在Oracle 10g上运用SQL/Plus实现。

(1)运行XQuery表达式访问XML文档

首先打开SQL PLUS工具,以OE身份登录到数据库

(1)运行下面的第一个XQuery将选择所有XML文档,代码如下:

得到的结果如图1所示,返回所有XML文档的结果。

(2)接下来运行第二个XQuery将选择特定的订货单,代码如下:

则得到的结果如图2所示,且相应的执行计划如图3所示。

(3)运行第三个XQuery,将列出包含特定部件ID的所有订货单,代码如下:

则得到的结果如图4所示,相应的执行计划如图5所示。

(未使用索引的执行计划)

(4)运行第四个XQuery将列出特定订货单中每行项目的描述,代码如下:

则得到的结果如图6所示,相应的执行计划如图7所示。

(2)性能分析

对比图5和图3-14,可以明显地看到使用索引前后,Rows、Bytes以及Cost(%CPU)的值相差是很大的。关注SELECT STATEMENT行,在图5中Rows值是2,而在图3-14中相应的值是1,同样Bytes值在图5中的值是36770,而在图3-14中的值是226,并且Cost(%CPU)值在图5中25,而在图3-14中只有6。从各方面的参数可以清楚地看到使用索引后的值都偏小。说明在使用索引后可以大大改进查询性能。

四、结束语

本章就文章所针对的问题加以分析,对基于关系数据库的XQuery查询进行阐述,主要运用SQL/XML来进行查询和查询优化。首先给出XQuery查询技术的一般概念,其中重点对协处理器执行方案进行阐述,同时给出相应的XQuery查询实例,最后给出一种SQL/XML混合执行策略,并通过实验进行性能的分析。

参考文献

[1]Extensible Markup Language(XML)1.0(Second Edi-tion).W3C Reconmmendation(6 October2000)[EB/OL].http://www.w3.org/TR/REC-xml

[2]Jason Mchugh,Jennifer Widom.Query Optimization for XML[C].In:Proceedings of the 25th International Conference on VeryLarge Data Bases.315~326

[3]刘政怡,谢荣传,李伟.XQuery查询语言的规范化[J].微机发展,2003,13(6),50~52,56.

[4]李延东,李相枢,陈鹏.基于XSD实现XML与关系数据库之间的数据转换[J].计算机应用,2003,24(3),97~99.

[5]郑仕辉,周傲英等.基于SQL的XML查询的有效实现[J].计算机研究与发展,2001,38(4),50~58;422~429.

[6]万常选,刘云生,徐升华,林大海.基于X-RESTORE查询XML视图[J].小型微型计算机系统,2004年,25(10),1000~1220

XQuery 篇4

RSS起源于Netscape的MY Netscrpe项目, 他是资源描述框架 (Resource Description Framework, RDF) 的一种应用, 当时Netscrpe希望通过使用RSS来描述新闻报导并且允许通过选择想再个人门户上显示得新闻资源来构建他们自己的信息门户, 所以得名为RDF站点概要 (RDF Site Summery, RSS) , 通过树状结构变现文档来列出数据, 目前很多门户网站都向用户提供了RSS文档。RSS文档作为一种资源共享模式的延伸, 给用户提供了信息检索上的便利。

自1999年RSS诞生起, 短短的10年间, RSS经历了飞速地发展, 包括最近两年IETF (Internet Engineering Task Force, 国际互联网工程任务组) 发布的RSS新格式Atom在内, 一共有10个版本的RSS格式, 其中有很多版本已被废弃, 但是还有很多依然在被许多互联网站点使用。

本文针对RSS提出一种可以实现的资源查询RSS方法。这种方法改变并简化网站对RSS的管理维护, 改变信息网站对RSS的管理模式, 同时又使得用户可以更自由地选择自己所需要的RSS资源, 使RSS可以得到更充分的应用。

二、基于Xquery的RSS资源查询方法

本文借鉴Xquery规范, 使用Qexo框架实现对RSS数据管理, Xquery是由W3C组织针对对xml数据源查询管理制定的一套查询语言规范, 根据Xquery规范, 查询xml数据可以和sql语言一样简单。for对应select..from语句, 选择RSS数据资源地址, where为条件语句, return返回一个值。以下是xquery制定下对xml数据检索的语句。

Qexo模型是由java语言编译而成, 使用了kawa框架进行转化为符合Xquery规范的xml数据查询模型。Qexo通过拦截所有xql结尾的文件, 把xquery查询语句读入Kawa Page Servlet中, 并对其中的查询语句进行编译执行, 最后再返回用户所需要的XML资源显示。基于这种对于XML格式数据的操作, Qexo完全可以应用到RSS的数据管理上。把Qexo比作一个RSS过滤器, 把RSS资源根据要求过滤为相应的RSS结果集输出。由于Qexo输出的依然还是RSS格式文档, 这样, 就不需要再设计程序把其转化为原来的格式或HTML格式, 一般的IE浏览器可以直接显示输出RSS结果集。

对于数据的基本操作一般包括查询, 排序, 归并等, 这里使用声明函数编写最常用的数据处理操作:

函数写入RSS或Atom的pubdate (文件的日期) , 可以自动对这些信息进行排序。

对RSS进行查询:

Xquery根据where条件句筛选RSS数据, 并返回用户指定元素集。

Qexo将过滤指令函数嵌入到用来生成输出格式的文档 (*.xql) 中后。在前台页面调用这些函数时, 通过项目调用saxon2.jar包, 使用{local:Function Name (“url”) }调用当页函数进行操作处理出来的, url是从门户网站抓取来的RSS地址。通过这种查询RSS方式, 用户不仅可以从定制更加个性化的RSS资源库, 即满足所需即所得, 同时, 对于提供RSS的网站, 也可以简化工作量, 提高效率, 网站可以把所有的RSS资源合并成一个文档管理, 并使用xquery查询修改对其进行更新, 而用户则可以使用xquery把抓取过来的RSS资源根据自己的需要进行筛选、归类, 实现正真意义上的个性化信息索取。

三、总结

在20世纪90年代末, 博客软件以及web门户的开发者需要一种标准的数据格式, 以便他们能够轻松地联合web上的内容, 因此RSS, Atom就此诞生了, RSS从出现到现在10个年头里, 将来的web的许多应用都将基于RSS, 也正是这个原因, 对于RSS的具有数据处理方法也将是一种必要的网页搜索功能得到更广泛的应用, 本论文对RSS的数据管理提出了一种基于Qexo模型可行的实现方式, 使RSS查询更易管理, 为RSS的发展提供了一个可行的方案。

参考文献

[1]Xquery1.0An XML Query Language[EB/OL]http://wwww.w3c.org/TR/2005/CR-xquery~20051103

XQuery 篇5

数据挖掘是从大量的数据中挖掘出有用的信息,即从大量的、不完整的、有噪声的、模糊的、随机的实际记录数据中发现隐含的、规律性的、人们事先未知的但又是潜在有用的,且最终可理解的信息和知识的非平凡过程。关联规则挖掘就是发现隐藏在信息中的关联关系,Apriori算法是较为经典的关联规则挖掘算法,该算法利用逐层迭代搜索的方法挖掘数据间的关联关系[1]。

XML文档查询语言XQuery的出现,使直接挖掘XML数据成为可能。应用XQuery查询语言,无需对数据进行预处理和后处理,便能够挖掘出XML数据的关联规则。一般的对XML文档的关联规则挖掘算法都是对单个XML文档进行挖掘,而对于有些情况下相关的数据存放在多个没有必然联系的文档中,就要同时考虑多个文档来进行挖掘。即群组XML文档,它的挖掘对象与文档标记无关,只与标记的值有关。此时,XML文档标记的值在被提取出来之后,组成的内容的集合和文本基本等价。因此,在群组XML文档上进行的内容挖掘也就退化为一般的文本挖掘,可以采用文本挖掘的方法[2]。在基于XQuery语言的Apriori算法中引入了collection函数,此函数能够实现对多个XML文档组成集合的节点进行访问,使其可以对多个XML文档进行挖掘,扩大了使用范围。

1 Apriori算法原理

1.1 关联规则

设I={i1, i2,... in }是n个不同项的集合,D是基于I的数据库事务的集合。D中的一个事务T是一个项集,包含若干I中的项,即T⊂I,每个事务都对应一个标识符TID。用以下几个概念来描述关联规则:

(1)关联规则,形如X⇒Y的蕴涵式,其中X,Y⊂I,且X∩Y=Ф。

(2)支持度,在事务数据库D中,如果有s%的事务包含了X∪Y,那么X⇒Y的支持度为s%。

(3)置信度,在事务数据库D中,如果有包含X的事务中有c%同时也包含了Y,那么X⇒Y的置信度为c%。

假定交易总数为N,则关联规则X⇒Y的支持度和置信度的数学表示分别为:

Support(X⇒Y)=Support(XUY)/N=s% (Ⅰ)

Confidence(X⇒Y)=Support(XUY)/Support(X)=c% (Ⅱ)

(4)强规则,如果X⇒Y同时满足最小支持度阈值,则X⇒Y为强规则。

(5)大项集,项集是项的集合,大项集即是其支持度满足最小支持度的项集。

1.2 Apriori算法

给定一个交易集D,挖掘关联规则的问题就是产生支持度和置信度分别大于用户给定的最小支持度 (minsupport)和最小置信度(minconfidence)的关联规则。其挖掘过程一般由以下两个方面组成:①挖掘事务数据库D中的所有频繁项集,即找出所有支持度均不低于用户给定的最小支持度的项集。②基于频繁项集生成所有的关联规则,即从第一步得到的频繁项集中生成置信度不小于用户给定的最小置信度的关联规则。

Apriori算法是一种挖掘布尔关联规则频繁项集的算法,它使用一种称作逐层搜索的迭代方法,用k-项集来搜索(k+1)-项集。首先找出频繁1-项集的集合,该集合记作L1,再通过L1找频繁2-项集L2,通过L2找L3,这样下去,直到不能找到频繁k-项集为止。此挖掘频繁项集的算法包括连接和剪枝两个步骤:

(1)连接步:通过Lk-1与自己连接产生候选k-项集的集合,记作Ck。

(2)剪枝步:Ck是Lk的超集,即Ck的成员不一定全是频繁项集,但所有的频繁k-项集都包含在Ck中。根据Apriori的性质:频繁项集的所有非空子集都必须是频繁的,如果一个候选k-项集的(k-1)-子集不在Lk-1中,则该候选集也不可能是频繁的,从而可以从Ck中删除。这样就实现了对Ck进行压缩,从而得到Lk[3]。

2 对XML文档的关联关系挖掘

2.1 XML查询语言XQuery

XQuery是W3C[4]提出的,为XML引入的一种函数式的、易于使用的、高水平的查询语言。XQuery相对于XML的关系,等同于SQL相对于数据库表的关系。XQuery被设计用来查询XML数据,不仅仅限于XML文件,还包括任何可以XML形态呈现的数据,包括数据库。XQuery主要由路径表达式、元素构建表达式、FLWOR表达式、带运算符和函数表达式、条件表达式等几个部分组成。XQuery查询语言中绝大部分都是FLWOR结构,其中FLWOR表达式是XQuery按照SQL的select-from-where模式定义的for|let-where-order by-return表达式,它是XQuery语言的重要组成部分,也主要使用了这种FLWOR结构。

2.2 XQuery中的collection函数

collection函数返回组成集合的节点。集合可以是任何类型节点的序列,由URL(统一资源定位符)进行标识。实现工具定义了URI(统一资源标识符)如何准确地与节点关联起来。例如,一个实现工具可能认为URI是文件系统的目录名,返回存放在该目录下的XML文件的文档节点。另一个实现工具可能把URI和具体的数据库关联起来。第三个实现工具可能会允许把一个含有URI的XML文件的URI指定给集合中的所有XML文档。

该函数把单个URI作为参数。例如,函数调用:

collection("http://datypic.com/orders")返回与集合http://datypic.com/orders相关联的XML文档的所有文档节点。该函数也可以不带参数,如collection(),查询由实现工具定义的默认集合[5]。

函数collection是稳定的。这意味着如果在同一个查询语句中多次调用collection函数,若传入的参数完全一样,即使某些资源关联的URI改变了,其返回的结果还是一样的。

2.3 改进后的算法

为了便于讨论算法的具体实现,以两个XML样例文档为例,这两个文档存放在transaction文件夹中,如下:

在这里,交易集用<transactions>标识,交易用<transaction>标识,项集用<items>标识,项用<item>标识。由于所用到的算法只能挖掘那些可以写出路径表达式的结构规整的项集。而现实中的XML数据结构往往很复杂和不规则,使得识别挖掘数据变得非常困难。为了解决这个问题,需对输人的数据源进行一系列的预处理,通过使用XSLT将复杂和不规则的XML文档转换为可以实现挖掘算法的标准模板,这样就使挖掘复杂、不规则的XML文档成为可能,具体可参考文献[6]。在此,为了便于算法的实现,所使用的文档数据都是符合标准模板的规整项集。假定最小支持度(minsupport)为40%,最小信任度(minconfidence)为80%,基于XQuery从XML文档集合中抽取大项集的算法如下:

这里用$db表示XML数据源变量,$minsupport表示最小支持度变量,$total表示XML数据源文档的交易总数变量。在此引入了XQuery语言中的collection函数,用来集合数据源,这里的数据源可以是多个XML文档,相比原算法中的document函数只能对单一文档进行访问,使用范围更广。算法首先产生候选1-项集的集合$C,接着通过扫描交易XML数据源计算出每个候选1-项集的支持度,并与最小支持度作比较产生频繁1-项集$Ll,算法用$L收集产生的频繁项集合。最后通过递归调用函数Apriori($Ll,$L,$minsupport,$total,$db)产生所有的频繁k-项集集合。其中用XQuery描述函数Apriori的算法描述如下:

在这里只给出XQuery表示的Apriori算法的大致框架,具体内容可参考文献[7]。下面给出根据如上算法产生的所有频繁项集:

此为所列交易文档的所有频繁项集集合(large.xml),根据Apriori算法产生XML交易文档的关联规则算法同在关系数据库中挖掘关联关系。由于篇幅有限,具体内容这里不再赘述。

3 试验结果及分析

用原生数据库X-Hive/DB[8]的查询引擎实现了基于XQuery应用的算法Apriori。在CPU为Intel Pentium 2.66G 、内存为512DDR、操作系统为Window XP Professional的计算机上进行了实验,实验中用到的数据描述如表1所示,表中列出了两个数据集,对每个数据集中的xml文档个数,交易数目及每个交易中的项目数进行了描述,其中对于多个xml文档的描述列举了2,3,5个文档的情况,对两组数据的实验表明:存放在单个文档中的数据使用document函数,数据存放在多个文档中,则使用collection函数,此函数的应用使得能够对多个xml文档进行访问,达到使用document函数处理单个xml文档的效果,collection函数的引入解决了某些情况下由于数据量过大等原因需要将数据存放于多个文档中的挖掘其关联关系的问题,使此算法的应用范围更广,可以对多个文档进行挖掘。

4 结束语

首先介绍了关联规则的有关概念、Apriori算法以及XQuery查询语言,接着引入了collection函数,结合基于XML的查询语言XQuery应用的算法,讨论了在不需要对数据进行必要的预处理和后处理的情况下能够有效挖掘XML数据中的关联规则,使其能同时从多个XML数据源文档中抽取出关联关系,达到对单个XML文档进行关联关系挖掘的效果,并通过实验得到验证。

参考文献

[1]吴斌,肖刚,陆佳炜.基于关联规则挖掘领域的Apriori算法的优化研究[J].计算机工程与科学,2009,31(6):116-118.

[2]曹春静.基于XML和Web数据的关联规则挖掘研究[D].华东师范大学硕士学位论文,2008:22.

[3]邱长春.基于XQuery应用的XML数据关联关系的挖掘[J].微计算机应用,2007,28(3):332-336.

[4]World Wide Web Consortium(W3C)[EB/OL].http://www.w3.org.

[5]Priscilla Walmsley.XQuery权威指南[M].王银辉,译.北京:电子工业出版社,2009.

[6]曹春静,王新伟.基于XQUERY和XSLT的不规则XML文档的关联规则挖掘[J].计算机应用,2007,27:251-253.

[7]J W W Wan,Dobbie G.Extracting Association Rules from XMLDocuments using XQuery[C]//Proceedings of Fifth InternationalWorkshop on Web Information and Data Management,NewOrleans,LA,USA:94-97.

XQuery 篇6

随着军队信息化建设的不断推进和数据库技术、网络技术的发展,装备保障过程中各相关业务部门开发了各种不同的信息管理系统,由于各种装备保障信息分散在各业务部门的分系统中,这必将导致在综合层面无法进行高效的通用装备保障数据汇总、查询和应用,装备保障综合数据汇总、查询困难。因此,无论从现代化战争要求对信息的全面快速的掌控来看,还是从数据库技术发展的趋势来看,都需要建立一个强大的系统,为综合部门提供快速的数据汇总和数据支撑。近年来,XML技术的发展为各级应用子系统的数据交换提供了一个统一、规范、方便的数据交换平台,为整个系统提供信息共享和数据整合手段,解决因数据类型、开发运行环境、网络环境差异而导致的“信息孤岛”问题。装备保障信息综合管理系统就是一个基于XML技术开发的综合性的信息管理系统,系统采用Web方式进行开发。

对于任何Web应用系统来说,表格数据的显示都是其中不可或缺的一个重要功能,在开发的过程中,进行数据查询时经常会遇到这样的情况,即一个数据库查询会返回很多的结果行。如果把这些数据都放在一个页面中发送给客户端会产生下面几个问题:

(1)数据在页面中显示过程非常漫长,有时会造成数据的缺损、遗漏或丢失。

(2)造成网络资源的严重浪费,甚至会产生严重的网络堵塞现象。

(3)大量的数据在一个页面内显示会使得用户在阅读时感到不适。

因此,无论是从节约时间和网络带宽上,还是从阅读时的习惯方面考虑,用户总是希望表格数据能够进行分页显示(比如每页显示20条),因此对于本系统来说,表格数据的分页显示是必备的功能。

2 相关技术

2.1 GridView控件

ASP.NET是微软.NET平台的核心元素,程序开发人员可以使用它构建动态Web站点、开发Web应用程序、提高基于XML的Web服务。ASP.NET完全基于模块和组件,具有很好的可扩展性和可定制性,可为用户提供功能强大、外观丰富的可编程Web页面[1]。

ASP.NET2.0提供了许多工具在网格中显示表格数据,GridView控件和DataGrid控件是其中最重要的两种,二者都是由从WebControl类派生而来,都可以用来显示、编辑和删除多种不同的数据源中的数据。但是,与DataGrid相比,GridView具有许多新的功能和优势,主要包括:

①更丰富的设计时功能。

②改进的数据源绑定功能。

③排序、分页、更新和删除的自动处理。

④其他类型和设计时列操作。

⑤具有PagerTemplate属性的自定义页导航用户界面(UI)。

这些优势使得GridView控件已经逐渐取代了DataGrid控件,成为Web应用系统开发中实现信息显示与编辑功能的首选。

2.2 XML查询语言XQuery

装备保障信息综合管理系统将各级应用子系统的数据库映射为一个虚拟的XML数据库,因而将数据映射为XML数据,这样就需要采用XQuery语言对虚拟数据库进行查询和编辑。

XQuery是国际W3C组织所定义的对XML文档进行查询和编辑的语言,它起源于XML数据查询语言Quilt,并将XPath2.0作为其子集。Quilt有很多非常优秀的特性,集SQL、ODMG、XPath1.0、XQL以及XML-QL等诸多特性于一身,然而随着存储在XML文档中的信息量的增长,为了能够高效存取和查询XML信息,Quilt显示出了它的不足[2],XQuery就是为了弥补Quilt的不足而出现的。XQuery能同时满足数据库和文档两方面的需求,为用户提供了一种更优化的查询解决方案,弥补了非结构性数据的查询工作和关系数据库自身的缺陷。

XQuery的主要表达式有以下8种基本模式构成:

(1)路径表达式(Path expressions)

(2)元素构造符(Element constructors)

(3)FLWR表达式(FLWR expressions)

(4)算子和函数表达式(Expressions involving operators and functions)

(5)条件表达式(Conditional expressions)

(6)限定表达式(Quantified expressions)

(7)列表构造符(List constructors)

(8)数据类型表达式(Expression that test or modify datatypes)

3 分页的实现

GridView控件的分页技术按具体实现方法可以分为应用客户端分页与数据库服务器端分页。如果分页逻辑主要使用应用程序编码语言(如Visual Basic、Visual C#等)进行描述,即为应用客户端分页;如果分页逻辑主要使用数据库端SQL脚本(如Microsoft SQL Server、Sybase、XQuery等)进行描述,即为数据库服务器端分页。前者依赖于语言本身强大的逻辑描述功能,开发效率高;而后者由数据库服务器来完成整个计算过程,能有效减少网络流量,执行效率更高,具有更广普适用性[3]。

首先,为了叙述方便,作出如下的定义:

①PageIndex 表示当前页索引,其初值为0。

②PageSize 表示每页显示的记录数。

③RecordCount 表示记录集中的记录总数。

④PageCount 表示总页数。

3.1 GridView控件的分页原理[4]

采用GridView控件的内置分页技术,当数据量很大时,性能就会大大地降低,要理解这个问题需要了解内置分页技术的原理。GridView控件的内置分页技术绑定数据的原理是:假设,数据源内存中有8万条数据,GridView的分页大小即PageSize是20,那么针对每个请求,GridView每次都会从数据源中取回全部8万条数据绑定到GridView中,然后根据PageIndex过滤出当前页所需要的数据显示出来,即只选择20条数据显示在GridView中,而放弃79800条记录。每次都要返回这么大的数据集,对应用程序的性能影响是非常大的。随着系统的不断应用,数据源中记录数量不断增加时,应用程序的性能就会受到更大的影响,因为针对每个请求数据库服务器每次都必须读取全部的结果集,然后再按照PageSize将数据加载到相应的GridView分页。这种会产生两个问题,一是客户端的响应速度非常慢,二是浪费服务器端的资源。

3.2 采用GridView控件的内置分页技术实现分页

采用GridView控件的内置分页技术,必须首先将控件的AllowPaging属性设置为true,然后通过设置PageSize属性[5]来定义每个分页的大小(代码中用粗体表示)。

ForeColor=″#333333″ GridLines=″Vertical″ Width=″100%″ AllowPaging=″true″ PageSize=″20″>

GridView控件的内置分页技术提供了多种分页方式供用户选择,可以通过设置GridView控件的PagerSettings属性来自定义用于分页的用户界面[6],此外,GridView控件还为用户提供了PagerTemplate模板,通过使用模板,用户可以设计开发出自己喜欢的分页用户界面。界面设计完成后,通过以下简单的几行代码就可以实现分页功能。

grdResult.DataSource=DataSave;//设置数据源

grdResult.DataBind();//绑定数据

grdResult.PageIndex=nPageIndex;

//设置分页索引,其中nPageIndex为将要显示的分页的索引

3.3 利用改进的查询语句实现自定义分页

采用GridView控件的内置分页技术进行分页的优点是复杂的分页逻辑对开发人员完全透明,实现较为简捷,从而提高了开发的效率,但是这种方法也存在的一定的缺点:

由于每次点击链接按钮进行页面导航的时候,都要对数据重新进行绑定,因此,在代码中我们定义了一个DataTable类的全局对象DataSave,用来存储数据源。采用这种方法实现分页要始终存储DataSave,当数据量非常大时会极大地消耗内存资源,造成服务器端的负担;同时,当服务器端每次接受请求时都需要读取整个数据集,但只加载一个GridView分页,这使得服务器端资源的利用效率也很低。

为了解决上述的问题,应该采用自定义的方式对表格记录进行分页。相比于GridView的内置分页技术,自定义分页方式更加快速有效,因为每次处理请求时,它只需要发送每个页面需要的数据集,这样,客户端响应时间会大大地缩短,服务器端的内存开销也可以大大减少;同时,由于每次读取的数据集全部加载到GridView分页,因此服务器资源的利用率也很高。

改进后的查询语句如下:

string strquery=string.Format(″for undefined wdzlxx in document(″db://装备保障信息综合管理系统.xml″)/wdzlxxList/wdzlxx[{0} to {1}]{2}″, nStart, nEnd, strFilter);

其中,strFilter是一个字符串,用于记录查询条件,nStart,nEnd为两个整数,分别用于定义记录集开始位置和结束位置。从代码中可以看出,修改后的查询语句在执行数据查询时,每次只返回满足条件的nEnd-nStart+1条记录,这样,在程序运行过程中只需保存strFilter、nStart和nEnd三个全局变量就可以了,这将大大减少对服务器端内存资源的占用。

修改后的代码在进行数据绑定时需要解决的最重要的一个问题是确定nStart和nEnd的值,因为这两个值关系到是否能够得到正确的返回的结果,我们可以利用PageIndex*PageSize+1得到nStart的值,但是,为了能够在大量用户访问服务器时减少服务器端的运算负担,应该尽量避免乘法运算的数量,因此我们采用下面的方法来确定nStart和nEnd的值,代码如下:

上述方法及代码在Visual Studio 2005上编译通过,在Windows 2003 Server+IIS 6+.NET2.0环境下正常运行,其运行速度明显高于利用GridView控件的内置分页技术实现分页。

4 结束语

给出了一种基于XQuery查询的表格数据分页的实现方法。与直接使用GridView控件的内置分页技术进行分页相比,在一定程度上提高了效率,减轻了服务器端的负担。这种方法已经得到实践验证并已经应用到装备保障信息综合管理系统的开发中,取得了预期的效果,同时,这种方法还具有较好的通用性,对开发类似的Web应用系统具有一定的借鉴作用。

参考文献

[1]岳国伟,梁永全,陈玉娥.ASP.NET中数据分页技术的研究[J].计算机应用研究,2007,9(24):159-161.

[2]万常选.XML数据库技术[M].北京:清华大学出版社,2005:15.

[3]卢成钧.ASP.NET中数据列表分页方法研究[J].计算机系统应用,2006(11):83.

[4]ASP.NET程序中DataGrid控件的内置分页机理及效率提高的研究[J].计算机应用与软件,2007,12(24):97-100.

[5]哈特.ASP.NET2.0经典教程—C#篇[M].孟宪瑞,易磊,译.北京:人民邮电出版社,2007.

【XQuery】推荐阅读:

上一篇:两个译本下一篇:复合型物流管理人才

本站热搜

    相关推荐