一种xml文档的存储和检索方法

文档序号:6459387阅读:163来源:国知局

专利名称::一种xml文档的存储和检索方法
技术领域
:本发明涉及一种计算机文档的存储和检索方法,特别涉及一种对于XML文档进行处理后存储和检索的方法。
背景技术
:XML是一种专门为Internet所设计的标记语言。XML的重点是管理信息的数据本身,而不是数据的样式,数据的显示则交给另外的技术来解决。虽然XML是一种专门为Internet所设汁的标记语言,但是它已经成为Internet上数据表示和数据交换的标准。随之而来的是堆积如山的XML文档,如何对这些XML文档进行有效管理与快速方便地查询,是当前学术界的研究热点,虽然已经提出了一些XML数据的存储方法,但是XML的存储问题仍然是数据库领域研究的热点之一。目前,存在的XML文件的存储模式主要可以分为以下两类:关系模式和原生模式。关系模式以传统的关系型数据库作为存储后台,将XML文档转化为关系中的表来存储,但从本质上讲,传统的RDBMS不支持层次的和半结构化的数据形式,XML是具有动态结构的数据,这正是XML可扩展性的关键,而传统的RDBMS不能处理这种数据,SQL适合于査询受确定模式支配的表,它不是为具有层次嵌套特性的XML设计的,并不能支持XML元素的层次査询。而原生存储模式通常以文件系统或专门设计的XML存储系统作为后台,将XML文档无转化地存储到文件系统或专门的XML存储系统中,并具有专门的XML査询语言如XQuery、Xpath等。XML査询语言都将路径表达式作为核心内容,反映出了XML元素的层次和嵌套关系。在树状的XML数据中匹配路径査询的基本方式是对数据进行导航式的遍历,它简单、直接,反映出了XML元素的层次关系,但执行效率不能得到保证,尤其是在大数据量的情况下。可以在XML文档上建立外部索引,但当XML文档被更新时,索引是难以维护的。
发明内容本发明针对XML文档存在的问题,结合关系模式的査询效率和原生模式的能反映XML元素层次路径的查询机制,提出了基于XOM和ORM的XML文件存储检索方法,并基于该方法在具体实施过程中提出了一种实现XML数据库Xquery査询引擎的途径。本发明对XML文件存储检索的方法,是通过两步转换机制将XML文件渐进性地存储到关系数据库中,即XOM+ORM=XRM,其中XOM(XMLObjectMap)是XML文件映射到对象,ORM(ObjectRelationMap)是对象映射到关系表,XRM(XMLRelationMap)是XML映射到关系表。公式的字面解释就是XML文件映射到对象,再结合对象映射到关系表,完成XML文件的关系化映射存储。本发明的技术方案为一种XML文档的存储方法,包括所述XML文档映射到对象,所述对象映射到关系表。可选的,所述对象是Java对象,所述XML文档映射到Java对象,再将所述Java对象映射到关系表。可选的,进一步包括,所述XML文档映射到Java对象,使用的工具是JavaTMArchitectureforXMLBinding,即JAXB;所述Java对象映射到关系表,使用的工具是Hibernate。可选的,进一步包括,所述XML文档映射到Java对象,再将所述Java对象映射到关系表,又进一步包括以下步骤生成类,即是将XMLSchema文件用来作为输入,利用所述JAXB绑定编译器生成在此Schema基础上的JAXB类;编译类,即对所有JAXB生成的类、源文件、以及应用程序代码进行编译;创建Configuration对象,进行配置文件和映射文档的装载操作,读取所有的配置文件并进行解析;在所述Configuration对象的基础上创建SessionFactory对象的实例;生成对象树,即是根据所述XMLSchema文件编写成的XML实例文档被JAXBBindingruntimeframework读入,通过XML实例文档的数据内容来实例化所述JAXB所生成的类,从而生成数据内容对象树;创建Session对象,建立与数据库的连接;开始一个事务Transaction,即是在Java中定义一个事务操作的开始;调用Hibernate相关操作存储由XML实例文档生成的对象树,结束事务Transaction,关闭Session,回到生成对象树步骤,如此反复存储多个XML实例文档。本发明的技术方案还包括,一种XML文档的检索方法,从关系表映射到对象,所述对象映射到所述的XML文档。可选的,所述的对象是Java对象。可选的,使用Hibernate的操作和HQL查询语言对存储在数据库中的Java对象进行增加、删除、修改、査询操作。进一步可选的,将所述HQL的查询结果对象转换成所述XML文档,建立一个Xquery査询转换引擎。本发明的有益效果是,本方法在XML文件转换存储过程中,抓住了XML文件的两个基本点,层次结构及其数据内容。对象转化时,将XML元素的嵌套层次关系通过对象的嵌套方式完整地保留了下来,元素之间的层次结构完整地体现在了对象的嵌套上面,而通过对象内的字段封装了XML数据,将XML文档转化后的有嵌套关系的对象集合叫做对象树。再通过ORM工具完成对象树的关系化存储,这样检索时利用面向对象的HQL査询语言通过对象的嵌套层次关系具体地表达了要査询的XML元素的文档路径,反映了要査询的XML元素的结构位置。本方法即利用了关系数据库数据存储査询的效率,又具有了专门的XML查询语言如XQuery、Xpath等的优点即将路径表达式作为核心内容,反映出了XML元素的层次和嵌套关系。需要指出的是,两步转换机制也是可逆向的,即可以从关系表转换到对象,对象转换到XML文件,这就为实现Xquery査询引擎奠定了基础。两步转换机制如图l所示。图l是本发明的技术方案原理框图图2是实施例中的文件结构示显示图具体实施例方式首先对一些工具加以说明。XOM工具说明方法中用到的XOM工具为JavaTMArchitectureforXMLBinding(JAXB)技术。JAXB技术提供了API和工具用于自动映射XML文档和Java对象。在允许灵活定义XML文件格式的基础上,由JAXB生成操作XML文件的源代码(就是类),使你的应用程序将重点放到Java对象上,而不用直接面对XML操作。这正是JAXB的目的所在。JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAX或DOM。JAXB隐藏了细节并且取消了SAX和DOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序。ORM工具说明方法中用到的ORM工具为Hibernate。Hibernate是一种新的ORM映射工具,它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库,使用Hibernate,可以大大减少操作数据库的工作量。Hibernate是Java平台上一个功能全面的、开源的OR映射框架。Hibernate支持开发符合常规Java理念的持久性类——包括关联、继承、多态、复合以及Java集合框架。Hibernate使用XML(力6瓜义W)文件把Java类映射到表,把JavaBean属性映射到数据库表。通过JDBC技术,支持所有的SQL数据库管理系统。Hibernate与所有流行的J2EE应用程序服务器和Web容器都很好地集成。HQL查询语言说明传统的SQL语言采用的是结构化的査询方法,而这种方法对于査询以对象形式存在的数据却无能为力。幸运的是,Hibernate为我们提供了一种语法类似于SQL的语言,Hibernate查询语言(HQL),和SQL不同的是,HQL是一种面向对象的查询语言,它可以査询以对象形式存在的数据,可以理解如嵌套、继承、多态和关联组合之类的概念,可以指定全路径,区分同名实体类。需要说明的是在实施例中虽然选择了Java开发平台,但本发明提供的方法具有平台无关性,并不依赖具体的面向对象程序语言,对〔++,(:#这样的面向对象语言也是适用的。本实施例运行环境包括一台装有操作系统和J2EE开发环境的个人电脑,系统采用EclipseSDK3.3开发平台进行系统开发,数据库采用开源数据库PostgreSQL8.2,XOM工具为JAXB2.0技术,ORM工具为Hibernate—3.2.1。现在结合附图,以"book"XML文件为例,说明整个存储检索过程。"book"XML文件的XMLSchema文件"book,xsd"在软件XMLSpy中以图形方式査看如图2所示。用工具"XMLSpy2007"打开相应的schema文件后,点击下面标签栏的"Schema/WSDL"标签,就可以看到schema文件相应的树状图结构。源文件如下〈7xmlversion=〃l.0〃encoding二〃UTF-8〃"?〉〈xsd:schemaxmlns:xsd=〃http://www.w3.org/2001/XMLSchema〃〉<xsd:elementname=〃book〃>〈xsd:complexType〉<xsd:sequence〉〈xsd:elementname=〃title〃type=〃xsd:string7〉〈xsd:elementname=〃author〃type=〃xsd:string"max0ccurs=〃unbounded7〉〈xsd:elementname=〃price〃type="xsd:integer7>〈xsd:elementname=〃abstract〃type=〃AbstractType〃/〉〈xsd:elementname=〃publish〃type=〃PublishType〃min0ccurs=〃0〃max0ccurs=〃unbounded7〉〈/xsd-sequence〉〈xsd:attributename=〃isbn〃type=〃xsd:string〃/>〈/xsd:complexType〉〈/xsd:element〉〈xsd:complexTypename二〃PublishType〃〉<xsd:sequence〉〈xsd:elementname二〃publisher〃type二〃xsd:string7〉<xsd:elementname二〃pubdate〃type二〃xsd:date7〉〈/xsd:sequence>〈/xsd:complexType〉〈xsd:complexTypename二〃AbstractType〃〉〈xsd:sequence〉<xsd:elementname=〃:resume〃type二"xsd:st:ring7〉〈xsd:elementname二〃recommendation〃type二〃xsd:string7〉〈/xsd:sequence〉〈/xsd:complexType〉〈/xsd:schema〉(1)生成类(X-0转换)将XMLSchema文件用来作为输入,利用JAXB绑定编译器生成在此Schema基础上的JAXB类。以JAXB解析book,xsd文件生成如下三个类-1)book类。含有属性title,author(数组列表形式),price,abstract(AbstractType类),publish(数组列表形式,PublishType类),isbn。船mlRootElement(name=〃book")publicclsssBook{@XmlElement(required二true)protectedStringtitle;船mlElement(required二true)protectedList〈String〉author;@XmlElement(required二true)protectedBiglntegerprice;@XmlElement(name=〃abstract〃,required二true)protectedAbstractType—abstract;protectedList〈PublishType〉publish;@XmlAttributeprotectedStringisbn;存取这些属性的Bean方法省略}2)PublishType类。含有属性publisher,pubdate。船mlRootElement(name二〃publish〃)publicclassPublishType{@XmlElement(required二true)protectedStringpublisher;@XmlElement(required二true)protectedJava.utiLDatepubdate;存取这些属性的方法省略,,}3)AbstmctType类。含有属性resume,reco謹endatioru舰mlRootElement(name=〃publish〃)publicclassAbstractType{@XmlElement(required=true)protectedStringresume;船mlElement(required=true)protectedStringrecommendation;存取这些属性的Bean方法省略,}可以看出JAXB将XML文件中子结点和属性映射成类的属性字段,其中一对多映射的子结点映射成List数组。然后不是叶子结点的结点再映射成一个类,在类中映射它的子结点。如此循环反复,只到映射完所有的叶子结点。(2)建立ORM配置文件(0-R转换)主要是建立映射文档(*.hbm.xml),将由Schema标准生成的JAXB类映射成表,规则如下一对一映射的结点放在一张表内,一对多映射的结点为这个结点新建一张表。于是将Book类,PublishType类以及author分别映射三张表(table),类中的一对一的基本类型属性映射成表中的字段,一对一的复合类型属性根据复合类型含有的属性映射成表中的多个字段,一对多的数组列表属性映射成单独的表,它们通过主表的ID号建立与主表之间一对多的连接关系,这样就完成了对象树到关系表的映射。映射文件如下所示<formula>formulaseeoriginaldocumentpage11</formula>〈/class>〈classname二〃PublishType〃table=〃table2〃lazy=〃true〃〉〈propertyname="publisher"type="Java.lang.String"/〉<propertyname="pubdate〃type=〃Java.util.Date〃/>〈/class>〈/hibernate-mapping>(3)编译类所有JAXB生成的类,源文件,以及应用程序代码必须被编译。(4)创建Configuration对象在这一步中主要为了进行配置文件和映射文档(*.hbm.xral)的装载操作,读取所有的配置文件并进行解析。(5)创建SessionFactory对象通过创建好的Configuration对象可以创建一个SessionFactory对象的实例,它是产生Session对象实例的工厂,它在整个应用中应该是唯一的。(6)生成对象树根据XMLSchema文件编写成的XML实例文档被JAXBBindingruntimeframework读入,通过XML实例文档的数据内容来实例化JAXB所生成的类,从而生成数据内容对象树;这个数据内容对象树,代表了XML实例文档文档的结构和数据内容。(7)创建Session对象Session对象类似于与数据库的连接对象,可以理解为与数据库建立的一个连接,但它的功能要比JDBC中的Connection对象丰富得多。(8)开始一个事务Transaction:在Java中定义一个事务操作的开始,这是使用Hibernate进行持久化操作必不可少的步骤.(10)调用Hibernate相关操作存储由XML实例文档生成的对象树。结束事务Transaction,关闭Session,回到(6),可以反复存储多个XML实例文档。(9)利用Hibernate相关操作和HQL査询语言可以对存储在数据库中的Java对象进行增加,删除,修改,査询等操作,接下来主要介绍查询操作。比如想得到推荐为"大学生"的所有书本的书名,简介以及出版社数目并以价格从低到高排列,可以写出如下査询语言selectbook,title,book,abstract,resume,count(publish)fromBookasbookleftjoinbook,publishaspublishwherebook,abstract,recommendation='大学生,groupbybook,book,priceorderbybook,priceasc可以用Xquery査询语言重写这个查询[5],如下所示for$vin/booklet$c:=$v/publishwhere$v/abstract/recommendation=,大学生,orderby$v/priceascendingreturn$v/title,$v/abstract/resume,count($c)可以看到HQL语言具有Xquery査询语言相同的路径表达能力,并能够将这种能力通过ORM转换为关系表的査询。熟悉SQL/HQL语言和Xquery语言的人不难发现两个査询语言的相互关系,利用Xquery语法分析器,进行语法制导翻译,可以将for语句和let语句翻译成SQL/HQL的from语句和groupby语句,其中for语句建立from语句的主表book,let语句建立表的左外连接,最后gro叩by主表book。而where禾口orderby两者相同,return语句等价于select语句。若建立Xquery的词法分析,变量表以及通过语法制导翻译成HQL语言,并将HQL查询结果对象通过XOM工具转换成XML文件,将建立一个Xquery査询转换引擎,发明人在上海市科技攻关项目《基于元数据管理的世博知识共享系统研究》中已经通过上述方法实现了这样的一个Xquery査询转换引擎。权利要求1、一种XML文档的存储方法,其特征在于,包括所述XML文档映射到对象,所述对象映射到关系表。2、如权利要求1所述的XML文档的存储方法,其特征在于,所述对象是Java对象,所述XML文档映射到Java对象,再将所述Java对象映射到关系表。3、如权利要求2所述的XML文档的存储方法,其特征在于,所述XML文档映射到Java对象,使用的工具是JavaTMArchitectureforXMLBinding,即JAXB;所述Java对象映射到关系表,使用的工具是Hibernate。4、如权利要求3所述的XML文档的存储方法,其特征在于,所述XML文档映射到Java对象,再将所述Java对象映射到关系表,包括以下步骤步骤20:生成类,即是将XMLSchema文件用来作为输入,利用所述JAXB绑定编译器生成在此Schema基础上的JAXB类;步骤21:编译类,即对所有JAXB生成的类、源文件、以及应用程序代码进行编译;步骤22:创建Configuration对象,进行配置文件和映射文档的装载操作,读取所有的配置文件并进行解析;步骤23:在所述Configuration对象的基础上创建SessionFactory对象的实例;步骤24:生成对象树,即是根据所述XMLSchema文件编写成的XML实例文档被J"AXBBindingruntimeframework读入,通过XML实例文档的数据内容来实例化所述JAXB所生成的类,从而生成数据内容对象树;步骤25:创建Session对象,建立与数据库的连接;步骤26:开始一个事务Transaction,即是在Java中定义一个事务操作的开始;步骤27:调用Hibernate相关操作存储由XML实例文档生成的对象树,结束事务Transaction,关闭Session,回到步骤24,如此反复存储多个XML实例文档。5、一种XML文档的检索方法,其特征在于,包括-从关系表映射到对象,所述对象映射到所述的XML文档。6、如权利要求5所述的一种XML文档的检索方法,其特征在于,所述的对象是Java对象。7、如权利要求6所述的一种XML文档的检索方法,其特征在于,使用Hibernate的操作和HQL査询语言对存储在数据库中的Java对象进行增加、删除、修改、查询操作。8、如权利要求7所述的一种XML文档的检索方法,其特征在于,将所述HQL的査询结果对象转换成所述XML文档,建立一个Xquery查询转换引擎。全文摘要本发明涉及一种对于XML文档进行处理后存储和检索的方法,结合关系模式的查询效率和原生模式的能反映XML元素层次路径的查询机制,提出了基于XOM和ORM的XML文件存储检索方法。本方法抓住了XML文件的两个基本点,层次结构及其数据内容。通过XOM工具将XML文件转化成对象时,XML元素的嵌套层次关系通过对象的嵌套方式完整地保留了下来,元素之间的层次结构完整地体现在了对象的嵌套上面,而通过对象内的字段封装了XML数据,将XML文档转化后的有嵌套关系的对象集合定义为对象树。再通过ORM工具完成对象树的关系化存储,这样检索时利用面向对象的HQL查询语言通过对象的嵌套层次关系具体地表达了要查询的XML元素的文档路径,反映了要查询的XML元素的结构位置。本发明既利用了关系数据库数据存储查询的效率,又具有了专门的XML查询语言如XQuery、Xpath等的优点,同时为实现Xquery查询引擎奠定了基础。文档编号G06F17/30GK101290625SQ200810038789公开日2008年10月22日申请日期2008年6月11日优先权日2008年6月11日发明者涵任,何正华,峰刘,刘海学,芳吴,孟玲玲,静杨,王海棠,鹏秦,费静婷,宇闫,顾君忠申请人:华东师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1