两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

基于關(guān)系數(shù)據(jù)庫的xml數(shù)據(jù)存儲與訪問方法

文檔序號:6650179閱讀:209來源:國知局
專利名稱:基于關(guān)系數(shù)據(jù)庫的xml數(shù)據(jù)存儲與訪問方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種對XML數(shù)據(jù)進(jìn)行存儲和訪問的方法,尤其涉及一種在關(guān)系數(shù)據(jù)庫的基礎(chǔ)上,將XML數(shù)據(jù)映射為關(guān)系數(shù)據(jù)進(jìn)行存儲,并通過DOM(Docuement Object Model,文檔對象模型)操作接口進(jìn)行訪問的方法。
背景技術(shù)
XML是可擴(kuò)展標(biāo)記語言(Extensible Markup Language)的簡稱。它由互聯(lián)網(wǎng)協(xié)會(W3C)在1998年提出后,得到廣泛應(yīng)用,已成為數(shù)據(jù)交換的事實(shí)標(biāo)準(zhǔn)及Web Service等眾多新興技術(shù)的基礎(chǔ)。
XML數(shù)據(jù)是結(jié)構(gòu)化的,這一特點(diǎn)對于大型和復(fù)雜的文檔來說是很理想的。用戶不僅可以指定一個(gè)定義了文檔中的元素的詞匯表,而且還可以指定元素之間的關(guān)系。XML也提供客戶端的包括機(jī)制,可以根據(jù)多種來源集成數(shù)據(jù)并將其作為一個(gè)文檔來顯示。數(shù)據(jù)還可以馬上進(jìn)行重新排列。數(shù)據(jù)的各個(gè)部分可以根據(jù)用戶的操作顯示或隱藏。當(dāng)處理大型的信息倉庫,比如關(guān)系型數(shù)據(jù)庫時(shí)是極為有用的。因此,XML技術(shù)在數(shù)據(jù)庫中得到廣泛的應(yīng)用。在這一背景下,對大量XML數(shù)據(jù)進(jìn)行有效的存儲及訪問成為目前急需解決的一大課題。
XML數(shù)據(jù)的存儲與訪問功能的實(shí)現(xiàn)技術(shù)之一為XML數(shù)據(jù)庫。其可以分為XML原生數(shù)據(jù)庫(XML Native Database)和XML使能數(shù)據(jù)庫(XML EnabledDatabase)兩大類。XML原生數(shù)據(jù)庫是指單純?yōu)閄ML的存儲與查詢目的而專門設(shè)計(jì)的數(shù)據(jù)庫管理系統(tǒng);而XML使能數(shù)據(jù)庫則是在傳統(tǒng)的關(guān)系數(shù)據(jù)庫基礎(chǔ)之上,增加對XML數(shù)據(jù)的存儲與查詢功能。目前主流的關(guān)系數(shù)據(jù)庫產(chǎn)品與MSSQL Server、DB2、Oracle等都提供了XML使能數(shù)據(jù)庫的實(shí)現(xiàn)。但是,現(xiàn)有XML數(shù)據(jù)庫產(chǎn)品提供給用戶的操作方式一般只限于文檔的導(dǎo)入導(dǎo)出和XPath查詢,這在實(shí)踐中是往往不夠的。
XML數(shù)據(jù)的存儲與訪問功能的另一實(shí)現(xiàn)技術(shù)是將XML數(shù)據(jù)存儲為普通文件,而后通過DOM操作接口進(jìn)行解析與訪問。DOM接口方便靈活,但目前的DOM實(shí)現(xiàn)技術(shù)中,如Xerces XML解析器等在對XML數(shù)據(jù)進(jìn)行任何操作之間必須在內(nèi)存中對該數(shù)據(jù)進(jìn)行完全解析,因此能夠操作的XML數(shù)據(jù)的大小很受限制,同時(shí)多用戶并發(fā)操作也無法實(shí)現(xiàn)。
另一方面,對象只能存在于內(nèi)存中,而內(nèi)存不能永久保存數(shù)據(jù)。如果要永久保存對象的狀態(tài),需要進(jìn)行對象的持久化,即把對象存儲到專門的數(shù)據(jù)存儲庫中。目前,關(guān)系數(shù)據(jù)庫仍然是使用最廣泛的數(shù)據(jù)存儲庫。關(guān)系數(shù)據(jù)庫中存放的是關(guān)系數(shù)據(jù),它是非面向?qū)ο蟮?。目前,把對象持久化到關(guān)系數(shù)據(jù)庫中,需要進(jìn)行對象-關(guān)系的映射(Object/Relation Mapping,簡稱ORM),這是一項(xiàng)繁瑣耗時(shí)的工作。在實(shí)際應(yīng)用中,除了需要把內(nèi)存中的對象持久化到數(shù)據(jù)庫外,還需要把數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)再重新加載到內(nèi)存中,以滿足用戶查詢業(yè)務(wù)數(shù)據(jù)的需求。由此造成頻繁地訪問數(shù)據(jù)庫,會對應(yīng)用的性能造成很大影響。

發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種在關(guān)系數(shù)據(jù)庫的基礎(chǔ)上,將XML數(shù)據(jù)映射為關(guān)系數(shù)據(jù)進(jìn)行存儲,并通過DOM操作接口進(jìn)行訪問的方法。
為實(shí)現(xiàn)上述的發(fā)明目的,本發(fā)明采用下述的技術(shù)方案一種基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法,其特征在于包括如下步驟(1)使用SAX接口實(shí)現(xiàn)解析XML數(shù)據(jù);(2)在SAX事件處理函數(shù)中,調(diào)用系統(tǒng)內(nèi)建函數(shù)執(zhí)行DOM操作;(3)將所有XML文檔的基本信息存儲在XML文檔表中,一個(gè)文檔對應(yīng)一行;(4)將所有XML節(jié)點(diǎn)的名稱、類型、父子關(guān)系存儲在XML節(jié)點(diǎn)表中,一個(gè)節(jié)點(diǎn)對應(yīng)一行;(5)將所有XML文本類型節(jié)點(diǎn)或?qū)傩缘闹荡鎯υ赬ML節(jié)點(diǎn)值表中,一個(gè)文本類型節(jié)點(diǎn)或一個(gè)屬性的值對應(yīng)一行;(6)對所述節(jié)點(diǎn)進(jìn)行Dewey編碼。
在通過DOM操作接口訪問XML數(shù)據(jù)時(shí),首先將操作轉(zhuǎn)化為對應(yīng)的SQL語句,然后執(zhí)行轉(zhuǎn)化后的SQL語句。
所述SAX事件處理函數(shù)包括startElement事件,首先調(diào)用實(shí)現(xiàn)“插入子節(jié)點(diǎn)”功能的函數(shù)將元素節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中,而后對于每個(gè)屬性,分別調(diào)用“插入子節(jié)點(diǎn)”函數(shù)將屬性節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中和調(diào)用“設(shè)置屬性值”函數(shù)將屬性節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表,并將屬性值插入到XML節(jié)點(diǎn)值表。
所述SAX事件處理函數(shù)包括charData事件,首先調(diào)用“創(chuàng)建子節(jié)點(diǎn)”函數(shù)將文本節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中,而后調(diào)用“追加文本內(nèi)容”函數(shù)將文本的值插入到XML節(jié)點(diǎn)值表中。
本發(fā)明所述的基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法通過系統(tǒng)內(nèi)建函數(shù)實(shí)現(xiàn)了對文檔節(jié)點(diǎn)級的操作,提供了DOM接口的持久化實(shí)現(xiàn),從而提供給用戶更靈活、細(xì)粒度的操作方式。與基于內(nèi)存的DOM實(shí)現(xiàn)方式相比,本發(fā)明所提出的方法在進(jìn)行DOM操作之前不需要對文檔內(nèi)容進(jìn)行完全解析,可以操作更大規(guī)模的XML數(shù)據(jù),并為多用戶并發(fā)操作提供了并發(fā)控制功能。


下面結(jié)合附圖和具體實(shí)施方式
對本發(fā)明作進(jìn)一步的說明。
圖1是本發(fā)明中將XML數(shù)據(jù)持久化為關(guān)系數(shù)據(jù)的流程圖;圖2是本發(fā)明所提供的實(shí)現(xiàn)類DOM訪問接口的流程圖。
具體實(shí)施例方式
下面,首先介紹本發(fā)明中將XML數(shù)據(jù)映射為關(guān)系數(shù)據(jù),并持久化的方法。所謂持久化簡單地說就是把二進(jìn)制數(shù)據(jù)對象比如Java類等存儲在數(shù)據(jù)庫里。使用XML有助于簡化對象的持久化過程,使數(shù)據(jù)的持久化成為一個(gè)普通的開發(fā)過程。
如圖1所示,本方法包括如下步驟步驟10)使用SAX接口實(shí)現(xiàn)解析XML數(shù)據(jù)。
實(shí)踐中,可以使用libxml2庫中提供的SAX接口實(shí)現(xiàn)解析XML數(shù)據(jù)。SAX的全稱是Simple APIs for XML,也即XML簡單應(yīng)用程序接口。SAX提供了一種對XML文檔進(jìn)行順序訪問的模式。它的基本原理是由接口的使用者提供符合定義的處理器,XML分析時(shí)遇到特定的事件,就去調(diào)用處理器中特定事件的處理函數(shù)。SAX不在內(nèi)存中顯示的構(gòu)建文檔樹,它使應(yīng)用程序能用最有效率的方式存儲數(shù)據(jù)。
關(guān)于SAX接口具體的解析過程,可以參見有關(guān)技術(shù)文檔中的說明。這一點(diǎn)作為熟悉XML技術(shù)的一般技術(shù)人員所公知的內(nèi)容,在此不詳細(xì)說明了。
步驟11)在SAX事件處理函數(shù)中,調(diào)用系統(tǒng)內(nèi)建函數(shù),執(zhí)行DOM操作。
對于步驟11中的主要SAX事件處理函數(shù)過程舉例說明如下對于startElement事件(當(dāng)SAX程序讀取到一個(gè)元素開始TAG時(shí)調(diào)用),首先調(diào)用實(shí)現(xiàn)“插入子節(jié)點(diǎn)”功能的函數(shù)將元素節(jié)點(diǎn)信息插入到“XML節(jié)點(diǎn)表”中,而后對于每個(gè)屬性,分別調(diào)用“插入子節(jié)點(diǎn)”函數(shù)將屬性節(jié)點(diǎn)信息插入到“XML節(jié)點(diǎn)表”中和調(diào)用“設(shè)置屬性值”函數(shù)將屬性節(jié)點(diǎn)信息插入到“XML節(jié)點(diǎn)表”并將屬性值插入到“XML節(jié)點(diǎn)值表”。
對于charData事件(當(dāng)SAX程序讀取到一個(gè)文本片斷時(shí)調(diào)用),首先調(diào)用“創(chuàng)建子節(jié)點(diǎn)”函數(shù)將文本節(jié)點(diǎn)信息插入到“XML節(jié)點(diǎn)表”中,而后調(diào)用“追加文本內(nèi)容”函數(shù)將文本的值插入到“XML節(jié)點(diǎn)值表”中。
類似的,系統(tǒng)還需處理endElement(當(dāng)SAX程序讀取到一個(gè)元素結(jié)束TAG時(shí)調(diào)用)、commentData(當(dāng)SAX程序讀取到一個(gè)注釋時(shí)調(diào)用)等其它事件,這些事件的處理流程比較簡單,在此不再贅述。
接下來,將所有XML文檔的名稱等基本信息存儲在一個(gè)“XML文檔表”中,一個(gè)文檔對應(yīng)一行;所有XML節(jié)點(diǎn)的名稱、類型、父子關(guān)系等存儲在一個(gè)“XML節(jié)點(diǎn)表”中,一個(gè)節(jié)點(diǎn)對應(yīng)一行;所有XML文本類型節(jié)點(diǎn)或?qū)傩缘闹荡鎯υ谝粋€(gè)“XML節(jié)點(diǎn)值表”中,一個(gè)文本類型節(jié)點(diǎn)或一個(gè)屬性的值對應(yīng)一行。另外,對節(jié)點(diǎn)進(jìn)行Dewey編碼,通過Dewey編碼可以判斷節(jié)點(diǎn)間的父子、祖先—后裔、左右兄弟關(guān)系。這里使用Dewey編碼是因?yàn)镈ewey編碼記錄了元素的路徑信息,在XML元素眾多的編碼方式中是最適合的。
下面,如圖2所示,介紹對XML持久化數(shù)據(jù)通過DOM操作接口進(jìn)行訪問的方法,其包括如下步驟步驟20)將操作轉(zhuǎn)化為對應(yīng)的SQL語句。
對步驟20中的重要DOM操作的實(shí)現(xiàn)舉例說明如下“得到文檔根節(jié)點(diǎn)”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)類型是根節(jié)點(diǎn)且父節(jié)點(diǎn)ID是文檔的ID。
“得到指定名稱的后裔元素”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)類型是元素節(jié)點(diǎn)且節(jié)點(diǎn)為指定的名稱且為當(dāng)前節(jié)點(diǎn)的后裔結(jié)點(diǎn)(根據(jù)Dewey編碼判斷)。
“得到第一個(gè)子元素”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)類型是元素節(jié)點(diǎn)且父節(jié)點(diǎn)ID為當(dāng)前節(jié)點(diǎn)ID,只輸出結(jié)果中Dewey編碼最小的一個(gè)。
“得到右兄弟元素”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)類型是元素節(jié)點(diǎn)且父節(jié)點(diǎn)ID與當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)ID相同且Dewey編碼比當(dāng)前結(jié)果的Dewey編碼大,只輸出結(jié)果中Dewey編碼最小的一個(gè)。
“得到父節(jié)點(diǎn)”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)ID為當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)ID。
“插入子節(jié)點(diǎn)”函數(shù)轉(zhuǎn)化為對“XML節(jié)點(diǎn)表”的INSERT語句。
“刪除子節(jié)點(diǎn)”函數(shù)首先確定以待刪除節(jié)點(diǎn)為根的子樹的Dewey編碼規(guī)范,然后使用DELETE語句將以待刪除節(jié)點(diǎn)為根的子樹中所有節(jié)點(diǎn)信息從“XML節(jié)點(diǎn)表”中刪除,將對應(yīng)的節(jié)點(diǎn)值信息從“XML節(jié)點(diǎn)值表”中刪除。
“設(shè)置屬性值”函數(shù)首先使用對“XML節(jié)點(diǎn)表”的SELECT語句判斷指定名稱的屬性是否存在,若存在,則使用對“XML節(jié)點(diǎn)值表”的UPDATE語句更新屬性值,否則首先使用對“XML節(jié)點(diǎn)表”的INSERT語句將屬性節(jié)點(diǎn)信息插入到“XML節(jié)點(diǎn)表”中,而后使用對“XML節(jié)點(diǎn)值表”的INSERT語句將屬性值信息插入到“XML節(jié)點(diǎn)值表”中。
“得到指定名稱的屬性”函數(shù)轉(zhuǎn)化為一條對“XML節(jié)點(diǎn)表”的SELECT語句,條件為節(jié)點(diǎn)類型是元素節(jié)點(diǎn)且父節(jié)點(diǎn)ID是當(dāng)前節(jié)點(diǎn)ID且節(jié)點(diǎn)名為指定的名稱。
“刪除指定名稱的屬性”函數(shù)首先得到指定的屬性節(jié)點(diǎn)(使用“得到指定名稱的屬性”函數(shù)),然后刪除該屬性節(jié)點(diǎn)(使用“刪除子節(jié)點(diǎn)”)。
“追加文本內(nèi)容”函數(shù)轉(zhuǎn)化為對“XML節(jié)點(diǎn)值表”的INSERT語句。
“刪除文本內(nèi)容”函數(shù)轉(zhuǎn)化為對“XML節(jié)點(diǎn)值表”的DELETE語句。
“替換文本內(nèi)容”函數(shù)轉(zhuǎn)化為對“XML節(jié)點(diǎn)值表”的UPDATE語句。
以上操作只是本發(fā)明所實(shí)現(xiàn)的DOM操作的一部分,其它眾多的函數(shù),如“替換子節(jié)點(diǎn)”、“插入注釋”、“插入PI指令”等等也可類似實(shí)現(xiàn),故不再贅述。
步驟21)執(zhí)行轉(zhuǎn)化后的SQL語句。
SQL語句的執(zhí)行是數(shù)據(jù)庫領(lǐng)域的一般技術(shù)常識,在此不予贅述。
通過上面介紹的方法,所有的DOM接口都可以使用嵌入在SQL語句中的系統(tǒng)內(nèi)建函數(shù)提供。系統(tǒng)內(nèi)建函數(shù)通過將特定操作轉(zhuǎn)化為對關(guān)系數(shù)據(jù)庫進(jìn)行操作的SQL語句來實(shí)現(xiàn)。這些系統(tǒng)內(nèi)建函數(shù)提供的功能可以滿足DOM核心功能接口需求,包括創(chuàng)建和刪除各類節(jié)點(diǎn),包括文檔、元素、屬性等。
插入、刪除子節(jié)點(diǎn)。
在DOM樹中進(jìn)行各種導(dǎo)航操作,如得到父節(jié)點(diǎn)、指定名稱的子節(jié)點(diǎn)、指定名稱的后裔節(jié)點(diǎn)、指定名稱的屬性、左右兄弟節(jié)點(diǎn)等。
對節(jié)點(diǎn)或?qū)傩缘闹颠M(jìn)行插入、刪除、修改、替換等操作。
以上對本發(fā)明的具體實(shí)施方式
進(jìn)行了詳細(xì)的解說。對于本技術(shù)領(lǐng)域的一般技術(shù)人員來說,在不背離本發(fā)明所述方法的精神和權(quán)利要求范圍的情況下對它進(jìn)行的各種顯而易見的改變都在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法,其特征在于包括如下步驟(1)使用SAX接口實(shí)現(xiàn)解析XML數(shù)據(jù);(2)在SAX事件處理函數(shù)中,調(diào)用系統(tǒng)內(nèi)建函數(shù)執(zhí)行DOM操作;(3)將所有XML文檔的基本信息存儲在XML文檔表中,一個(gè)文檔對應(yīng)一行;(4)將所有XML節(jié)點(diǎn)的名稱、類型、父子關(guān)系存儲在XML節(jié)點(diǎn)表中,一個(gè)節(jié)點(diǎn)對應(yīng)一行;(5)將所有XML文本類型節(jié)點(diǎn)或?qū)傩缘闹荡鎯υ赬ML節(jié)點(diǎn)值表中,一個(gè)文本類型節(jié)點(diǎn)或一個(gè)屬性的值對應(yīng)一行;(6)對所述節(jié)點(diǎn)進(jìn)行Dewey編碼。
2.如權(quán)利要求1所述的基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法,其特征在于在通過DOM操作接口訪問XML數(shù)據(jù)時(shí),首先將操作轉(zhuǎn)化為對應(yīng)的SQL語句,然后執(zhí)行轉(zhuǎn)化后的SQL語句。
3.如權(quán)利要求1所述的基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法,其特征在于所述SAX事件處理函數(shù)包括startElement事件,首先調(diào)用實(shí)現(xiàn)“插入子節(jié)點(diǎn)”功能的函數(shù)將元素節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中,而后對于每個(gè)屬性,分別調(diào)用“插入子節(jié)點(diǎn)”函數(shù)將屬性節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中和調(diào)用“設(shè)置屬性值”函數(shù)將屬性節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表,并將屬性值插入到XML節(jié)點(diǎn)值表。
4.如權(quán)利要求1所述的基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲與訪問方法,其特征在于所述SAX事件處理函數(shù)包括charData事件,首先調(diào)用“創(chuàng)建子節(jié)點(diǎn)”函數(shù)將文本節(jié)點(diǎn)信息插入到XML節(jié)點(diǎn)表中,而后調(diào)用“追加文本內(nèi)容”函數(shù)將文本的值插入到XML節(jié)點(diǎn)值表中。
全文摘要
本發(fā)明公開了一種在關(guān)系數(shù)據(jù)庫的基礎(chǔ)上,將XML數(shù)據(jù)映射為關(guān)系數(shù)據(jù)進(jìn)行存儲,并通過DOM操作接口進(jìn)行訪問的方法。本方法通過系統(tǒng)內(nèi)建函數(shù)實(shí)現(xiàn)了對文檔節(jié)點(diǎn)級的操作,提供了DOM接口的持久化實(shí)現(xiàn),從而提供給用戶更靈活、細(xì)粒度的操作方式。與基于內(nèi)存的DOM實(shí)現(xiàn)方式相比,本發(fā)明所提出的方法在進(jìn)行DOM操作之前不需要對文檔內(nèi)容進(jìn)行完全解析,可以操作更大規(guī)模的XML數(shù)據(jù),并為多用戶并發(fā)操作提供了并發(fā)控制功能。
文檔編號G06F17/30GK1825306SQ200510116858
公開日2006年8月30日 申請日期2005年10月31日 優(yōu)先權(quán)日2005年10月31日
發(fā)明者汪源 申請人:北京神舟航天軟件技術(shù)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
武冈市| 冀州市| 黔西县| 老河口市| 广州市| 县级市| 阿合奇县| 施秉县| 兴和县| 成武县| 嘉义市| 漯河市| 汝城县| 静海县| 连山| 成安县| 漠河县| 洪湖市| 华蓥市| 台东县| 孝感市| 凤翔县| 齐齐哈尔市| 岗巴县| 阿拉善左旗| 宝清县| 九江县| 大安市| 平凉市| 广州市| 通州区| 钦州市| 界首市| 定南县| 五河县| 中方县| 屏南县| 安顺市| 和龙市| 甘泉县| 蒲城县|