專利名稱:用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)結(jié)構(gòu)導(dǎo)航領(lǐng)域。具體地說,本發(fā)明涉及使用路徑表達(dá)式進(jìn)行導(dǎo)航 以查詢數(shù)據(jù)結(jié)構(gòu)。
背景技術(shù):
可以通過使用路徑表達(dá)式查詢數(shù)據(jù)結(jié)構(gòu)。存在多種允許使用路徑語言(例如, XPath (XML路徑語言)的某種變型)來存儲(chǔ)和查詢XML (可擴(kuò)展標(biāo)記語言)數(shù)據(jù)的數(shù)據(jù)庫系 統(tǒng)。XPath是查詢樹數(shù)據(jù)結(jié)構(gòu)的W3C標(biāo)準(zhǔn)方法。XPath允許根據(jù)路徑表達(dá)式查詢XML數(shù)據(jù)。 本文檔涉及XPath表達(dá)式和查詢,但應(yīng)被解釋為包括其他路徑語言中的其他形式的路徑表 達(dá)式。路徑表達(dá)式是指定通過XML文檔分層結(jié)構(gòu)的路徑的任何表達(dá)式。XML文檔的由路徑 表達(dá)式標(biāo)識(shí)的部分是在XML文檔結(jié)構(gòu)內(nèi)位于匹配該路徑表達(dá)式的任何路徑的結(jié)尾處的部 分。XML文檔通常表示為文檔對(duì)象模型(DOM)結(jié)構(gòu)或樹。由于路徑查詢通過遍歷這些 結(jié)構(gòu)進(jìn)行求值,因此查詢優(yōu)化的要求是有效減少所遍歷節(jié)點(diǎn)的數(shù)量。XML模式(schema)定義精確的XML文檔結(jié)構(gòu)格式。此模式可能無法在運(yùn)行時(shí)使用??紤]無權(quán)訪問所查詢的文檔模式(僅可訪問已分析的DOM樹)的路徑運(yùn)行時(shí)引 擎。用戶可在其中輸入自由格式路徑表達(dá)式的創(chuàng)作工具(即,不通過路徑構(gòu)建器)無權(quán)訪 問此模式。使用后代(//)路徑軸以允許用戶在XML文檔內(nèi)按名稱查找任何元素而不必指定 元素的完整路徑將是有利的。但是,對(duì)于運(yùn)行時(shí)引擎,后代軸效率非常低,因?yàn)樗枰闅v 整個(gè)DOM樹以查找此元素的所有出現(xiàn)。位于戴維斯的加利福尼亞大學(xué)分校的計(jì)算機(jī)科學(xué)系的April Kwong和Michael Gertz 的"Schema-based Optimization of XPath Expression (基于模式的XPath表達(dá)式優(yōu) 化)”披露了使用從模式生成的路徑等價(jià)類優(yōu)化XPath表達(dá)式。所述優(yōu)化方法包括在XPath 表達(dá)式中擴(kuò)展通配符。
發(fā)明內(nèi)容
根據(jù)本發(fā)明的第一方面,提供了一種用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)的方法,包括接收用于查 詢數(shù)據(jù)結(jié)構(gòu)的輸入路徑表達(dá)式以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié)構(gòu)中的一個(gè)或多個(gè)元素,所述 輸入路徑表達(dá)式包括一個(gè)或多個(gè)路徑步驟;訪問所述數(shù)據(jù)結(jié)構(gòu)的模式并獲得與所述一個(gè)或 多個(gè)元素相關(guān)的信息;修改所述輸入路徑表達(dá)式以便在一個(gè)或多個(gè)所述路徑步驟中指定索 引以限制位于路徑步驟中的元素的出現(xiàn)次數(shù);以及使用修改后的路徑表達(dá)式在運(yùn)行時(shí)查詢 所述數(shù)據(jù)結(jié)構(gòu)。根據(jù)本發(fā)明的第二方面,提供了一種用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)的系統(tǒng),包括用于接收查 詢數(shù)據(jù)結(jié)構(gòu)的輸入路徑表達(dá)式以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié)構(gòu)中的一個(gè)或多個(gè)元素的裝置,所述輸入路徑表達(dá)式包括一個(gè)或多個(gè)路徑步驟;用于訪問所述數(shù)據(jù)結(jié)構(gòu)的模式并獲得 與所述一個(gè)或多個(gè)元素相關(guān)的信息的裝置;用于修改所述輸入路徑表達(dá)式以便在一個(gè)或多 個(gè)所述路徑步驟中指定索引以限制位于路徑步驟中的元素的出現(xiàn)次數(shù)的裝置;以及用于輸 出修改后的路徑表達(dá)式以用于在運(yùn)行時(shí)查詢所述數(shù)據(jù)結(jié)構(gòu)的裝置。
根據(jù)本發(fā)明的第三方面,提供了一種存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序 產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品包括用于執(zhí)行以下步驟的計(jì)算機(jī)可讀程序代碼裝置接收用于 查詢數(shù)據(jù)結(jié)構(gòu)的輸入路徑表達(dá)式以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié)構(gòu)中的一個(gè)或多個(gè)元素,所 述輸入路徑表達(dá)式包括一個(gè)或多個(gè)路徑步驟;訪問所述數(shù)據(jù)結(jié)構(gòu)的模式并獲得與所述一個(gè) 或多個(gè)元素相關(guān)的信息;修改所述輸入路徑表達(dá)式以便在一個(gè)或多個(gè)所述路徑步驟中指定 索引以限制位于路徑步驟中的元素的出現(xiàn)次數(shù);以及使用修改后的路徑表達(dá)式在運(yùn)行時(shí)查 詢所述數(shù)據(jù)結(jié)構(gòu)。優(yōu)選地提供了一種解決方案,該解決方案通過提供一種基于路徑的查詢方法以從 XML文檔檢索數(shù)據(jù)而無需對(duì)基表進(jìn)行完整掃描和構(gòu)造昂貴的存儲(chǔ)器數(shù)據(jù)結(jié)構(gòu),改進(jìn)了基于 路徑的查詢的處理時(shí)間。優(yōu)選地提供了一種解決方案,該解決方案獲得并使用與查詢中的 元素的重復(fù)相關(guān)的信息。所述方法和系統(tǒng)使能查詢具有基礎(chǔ)模型的數(shù)據(jù)結(jié)構(gòu),其中所述數(shù)據(jù)結(jié)構(gòu)內(nèi)的元素 可以重復(fù),并且其中可以通過了解是否存在重復(fù)以及重復(fù)程度來優(yōu)化數(shù)據(jù)結(jié)構(gòu)的導(dǎo)航。本發(fā)明優(yōu)選地采用原始路徑表達(dá)式,并使用模式將此表達(dá)式轉(zhuǎn)換為可由運(yùn)行時(shí)引 擎更有效地處理的格式。模式包含跟蹤任何元素直到返回文檔根所需的信息,并且因此可 以生成到此元素的完整路徑。這優(yōu)選地允許所述運(yùn)行時(shí)引擎直接導(dǎo)航到此元素而不是“搜 索”此元素。
現(xiàn)在將僅通過實(shí)例的方式參考附圖描述本發(fā)明的實(shí)施例,這些附圖是圖IA和IB是根據(jù)本發(fā)明的一個(gè)實(shí)施例的系統(tǒng)的示意圖;圖2是其中可以實(shí)現(xiàn)本發(fā)明的一個(gè)實(shí)施例的計(jì)算機(jī)系統(tǒng)的方塊圖;圖3是根據(jù)本發(fā)明的一個(gè)實(shí)施例的文檔結(jié)構(gòu)的示意圖;圖4是根據(jù)本發(fā)明的一個(gè)實(shí)施例的總體過程的流程圖;以及圖5是根據(jù)本發(fā)明的一個(gè)實(shí)施例的實(shí)例過程的流程圖。
具體實(shí)施例方式參考圖1A,示意圖示出了系統(tǒng)100,其中運(yùn)行時(shí)引擎102查詢數(shù)據(jù)結(jié)構(gòu)101以定位 數(shù)據(jù)結(jié)構(gòu)101中的一個(gè)或多個(gè)元素110。數(shù)據(jù)結(jié)構(gòu)101可以是例如表示為文檔對(duì)象模型(DOM)樹的XML文檔。在另一個(gè)實(shí) 例中,數(shù)據(jù)結(jié)構(gòu)101是被分析為類似樹數(shù)據(jù)結(jié)構(gòu)的非XML數(shù)據(jù)。在一個(gè)實(shí)施例中,數(shù)據(jù)結(jié)構(gòu) 101是由消息代理查詢的消息。數(shù)據(jù)結(jié)構(gòu)101具有關(guān)聯(lián)的模式103。路徑表達(dá)式104作為查詢111被輸入到運(yùn)行時(shí)引擎102,運(yùn)行時(shí)引擎102在數(shù)據(jù)結(jié) 構(gòu)101中搜索路徑表達(dá)式104的出現(xiàn)以定位一個(gè)或多個(gè)元素110。使用工具包(toolkit) 105構(gòu)建查詢111,然后將查詢111部署到運(yùn)行時(shí)引擎102。在所述系統(tǒng)100中,工具包105訪問模式103以修改路徑表達(dá)式104。使用來自所查詢的數(shù)據(jù)結(jié)構(gòu)101的模式103的信息,修改路徑表達(dá)式104以包括 所查詢的元素110的完整路徑和其他信息。這有助于跟蹤元素110而不是搜索元素110,并 且因此提高了運(yùn)行時(shí)引擎102的效率。此外,如果模式103指示所查詢的元素110的出現(xiàn) 次數(shù),則運(yùn)行時(shí)引擎102可以在發(fā)現(xiàn)此特定元素110的特定出現(xiàn)次數(shù)之后停止。參考圖1B,示出了在其中輸入路徑表達(dá)式104的工具包105的詳細(xì)圖。參考所述 模式以獲得模 式信息120。修改器121使用模式信息120修改路徑表達(dá)式104以提供查詢 輸出122。運(yùn)行時(shí)引擎使用查詢輸出122查詢數(shù)據(jù)結(jié)構(gòu)。例如,可以使用所述模式確定所查 詢的元素的出現(xiàn),然后修改器121使用此信息向查詢輸出122添加謂詞(predieate)。參考圖2,用于實(shí)現(xiàn)工具包105的示例性系統(tǒng)包括適于存儲(chǔ)和/或執(zhí)行程序代碼的 數(shù)據(jù)處理系統(tǒng)200,數(shù)據(jù)處理系統(tǒng)200包括至少一個(gè)直接或通過系統(tǒng)總線203間接連接到存 儲(chǔ)器元件的處理器201。所述存儲(chǔ)器元件可以包括在程序代碼的實(shí)際執(zhí)行期間采用的本地 存儲(chǔ)器、大容量存儲(chǔ)裝置以及提供至少某些程序代碼的臨時(shí)存儲(chǔ)以減少必須在執(zhí)行期間從 大容量存儲(chǔ)裝置檢索代碼的次數(shù)的高速緩沖存儲(chǔ)器。所述存儲(chǔ)器元件可以包括只讀存儲(chǔ)器(ROM) 204和隨機(jī)存取存儲(chǔ)器(RAM) 205形式 的系統(tǒng)存儲(chǔ)器202?;据斎?輸出系統(tǒng)(BIOS) 206可以存儲(chǔ)在ROM 204中。包括操作系 統(tǒng)軟件208在內(nèi)的系統(tǒng)軟件207可以存儲(chǔ)在RAM 205中。軟件應(yīng)用210也可以存儲(chǔ)在RAM 205 中。系統(tǒng)200還可以包括諸如硬磁盤驅(qū)動(dòng)器之類的主存儲(chǔ)裝置211以及諸如磁盤驅(qū)動(dòng) 器和光盤驅(qū)動(dòng)器之類的輔助存儲(chǔ)裝置212。所述驅(qū)動(dòng)器及其關(guān)聯(lián)的計(jì)算機(jī)可讀介質(zhì)為系統(tǒng) 200提供計(jì)算機(jī)可執(zhí)行指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊以及其他數(shù)據(jù)的非易失性存儲(chǔ)。軟件應(yīng)用 可以存儲(chǔ)在主和輔助存儲(chǔ)裝置211、212上以及系統(tǒng)存儲(chǔ)器202上。計(jì)算系統(tǒng)200可以通過網(wǎng)絡(luò)適配器216在使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)的邏輯連 接的聯(lián)網(wǎng)環(huán)境中運(yùn)行。輸入/輸出設(shè)備213可以直接或通過中間I/O控制器連接到所述系統(tǒng)。用戶可 以通過諸如鍵盤、指點(diǎn)設(shè)備之類的輸入設(shè)備或其他輸入設(shè)備(例如麥克風(fēng)、游戲桿、游戲手 柄、碟形衛(wèi)星天線、掃描儀等)將命令和信息輸入系統(tǒng)200。輸出設(shè)備可以包括揚(yáng)聲器、打印 機(jī)等。顯示設(shè)備214也通過諸如視頻適配器215之類的接口連接到系統(tǒng)總線203。路徑語言基于數(shù)據(jù)結(jié)構(gòu)(例如XML文檔)的樹表示,并提供導(dǎo)航整個(gè)樹的能力,從 而根據(jù)各種準(zhǔn)則選擇節(jié)點(diǎn)。路徑表達(dá)式被編寫為一系列步驟,以便從一個(gè)節(jié)點(diǎn)(當(dāng)前“上下 文節(jié)點(diǎn)”)到達(dá)另一個(gè)節(jié)點(diǎn)或一組節(jié)點(diǎn)。所述步驟由“/”(即,路徑)字符分隔。每個(gè)步驟 具有三個(gè)組成部分軸指定符(axis specifier)、節(jié)點(diǎn)測(cè)試和謂詞。最簡(jiǎn)單的路徑采用如下格式/A/B/C此路徑將選擇作為B元素的子代的C元素,而B元素是構(gòu)成所述數(shù)據(jù)結(jié)構(gòu)的最外 層元素的A元素的子代??梢酝ㄟ^指定默認(rèn)“子代”軸之外的軸、簡(jiǎn)單名稱之外的節(jié)點(diǎn)測(cè)試或謂詞來構(gòu)造更 復(fù)雜的表達(dá)式,其中可以在任何步驟之后的方括號(hào)中編寫謂詞,例如,表達(dá)式A//B * [1]
將選擇名稱為任何內(nèi)容(“*”)的第一元素(“[1]”),此第一元素是B元素的子 代(“/”),B元素本身是A元素的子代或其他更深的后代(“//”),而A元素是當(dāng)前上下 文節(jié)點(diǎn)的子代(此表達(dá)式未以“/”開頭)。如果文檔中存在若干適合的B元素,則此表達(dá)式 將返回其全部第一子代的集合。所述軸指定符指示數(shù)據(jù)結(jié)構(gòu)的樹表示內(nèi)的導(dǎo)航方向。具 有任何復(fù)雜性的表達(dá)式都可以在方括號(hào)中被指定為謂詞,在通過路徑表達(dá)式匹 配在先節(jié)點(diǎn)之前必須滿足這些謂詞。步驟中謂詞的數(shù)量沒有限制,并且謂詞不需要被限定 到路徑中的最后一個(gè)步驟。它們可以嵌套到任何深度。在謂詞中指定的路徑始于當(dāng)前步驟 (即前一節(jié)點(diǎn)測(cè)試的步驟)的上下文,并且不改變此上下文。必須滿足所有謂詞才能發(fā)生匹 配。謂詞順序很重要,并且每個(gè)謂詞將依次過濾位置步驟的選定節(jié)點(diǎn)集。XML模式是XML文檔類型的描述,除了由XML本身施加的基本語法約束以外,通常 以對(duì)此類型文檔的結(jié)構(gòu)和內(nèi)容的約束來表示。XML模式在相對(duì)較高的抽象級(jí)別提供文檔類 型的視圖。還可以針對(duì)非XML數(shù)據(jù)結(jié)構(gòu)使用模式。例如,使用XML Schema建立文檔結(jié)構(gòu)模 型,然后使用XSD (XML模式定義)注釋描述每個(gè)元素的物理格式。存在專門開發(fā)以表示XML模式的語言。文檔類型定義(DTD)語言(其是XML規(guī) 范固有的)是一種具有相對(duì)受限的能力,但除了模式表示之外還在XML中具有其他使用的 模式語言。兩種其他非常普遍、更具表達(dá)力的XML模式語言是XML Schema(W3C)和RELAX NG(REgular LAnguage for XML Next Generation,用于 XML 下一代的正則語言)。將 XML 文檔與模式關(guān)聯(lián)的機(jī)制根據(jù)模式語言而有所不同??梢酝ㄟ^XML文檔本身內(nèi)的標(biāo)記或通過 某種外部手段實(shí)現(xiàn)關(guān)聯(lián)。在所描述的系統(tǒng)中,路徑表達(dá)式可以通過如下三種可能的方式修改1.通配符“女”或后代軸“//”的簡(jiǎn)單擴(kuò)展,如果模式僅建議一種可能的解決方案;2.將通配符“女,,或后代軸“//”擴(kuò)展成包含多個(gè)以路徑合并運(yùn)算符“ I,,組合的路 徑的表達(dá)式,如果模式建議多種可能的解決方案;以及3.插入索引([1]),如果模式建議元素可以僅出現(xiàn)一次。類似地,插入 [position () <= η],如果模式建議元素可以出現(xiàn)η次,其中η > 1。為了進(jìn)行說明,使用以下XML文檔提供一個(gè)工作實(shí)例< ? xml version = " 1.0〃 encoding = " UTF-8" ? ><document><topic><list><item>. . . </item><item>. . . </item><item>. . . </item></list></topic><index><item>. . . </item><item>. . . </item></index>
〈/document〉可以通過以下XML Schema(XSD)為此文檔建模
〈? xml version=" 1.0" encoding=" UTF-8" ? ><xsd: schema xmlns:xsd =" http://www.w3.org/2001/XMLSchema" ><xsd:element name=" document" ><xsd: complexType><xsd: sequence)<xsd:element ref =" topic" /><xsd:element ref =〃 index" /></xsd: sequence)</xsd: complexType></xsd: element)<xsd:element name=" topic" ><xsd: complexType>〈xsd: sequence)〈xsd:element ref =" list" /></xsd: sequence)</xsd:complexType></xsd: element)<xsd:element name=" list" ><xsd: complexType>〈xsd: sequence)〈xsd:element minOccurs = " 0 " maxOccurs = “ unbounded “ ref ="item" /></xsd: sequence)</xsd:complexType></xsd: element)<xsd:element name=" item" ><xsd: complexType/></xsd: element)<xsd:element name=" index" ><xsd: complexType>〈xsd: sequence)<xsd:element minOccurs=" 0" maxOccurs = " unbounded" ref ="item" /></xsd: sequence)</xsd:complexType></xsd: element)</xsd: schema〉
此模式描述了 XML文檔的允許結(jié)構(gòu),其中包括每個(gè)元素的最小和最大出現(xiàn)次數(shù)。 此模式表示圖3中示出的文檔結(jié)構(gòu)(模式樹)300。圖3中示出的文檔結(jié)構(gòu)300包括來自根節(jié)點(diǎn)311 "document"的兩個(gè)分支310、 320。第一分支310包括根節(jié)點(diǎn)311的子節(jié)點(diǎn)312“topic”,子節(jié)點(diǎn)312包含可以具有子節(jié)點(diǎn) 314 “item”的子節(jié)點(diǎn)313 “l(fā)ist”。第二分支320包括根節(jié)點(diǎn)311的子節(jié)點(diǎn)322 "index", 子節(jié)點(diǎn)322可以具有子節(jié)點(diǎn)323 “item”。節(jié)點(diǎn)314、323 “item”可以具有零次或更多次出 現(xiàn)。其他節(jié)點(diǎn)311、312、313、322只能具有一次出現(xiàn)。參考圖4,流程圖400示出了用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)的總體過程。輸入(401)路徑表達(dá) 式以便定位數(shù)據(jù)結(jié)構(gòu)中的一個(gè)或多個(gè)元素。訪問(402)數(shù)據(jù)結(jié)構(gòu)的模式并獲得與路徑表達(dá) 式的元素相關(guān)的信息。從模式參考元素的最大出現(xiàn)次數(shù)(403),并向路徑表達(dá)式附加謂詞 (如果需要限制出現(xiàn)次數(shù))。獲得(404) —個(gè)或多個(gè)完整路徑表達(dá)式并且如果存在兩個(gè)或 更多個(gè)表達(dá)式,則將它們進(jìn)行組合。
根據(jù)所獲得的與元素相關(guān)的信息修改路徑表達(dá)式。將修改后的路徑表達(dá)式輸出 (405)到運(yùn)行時(shí)引擎以便定位數(shù)據(jù)結(jié)構(gòu)中的一個(gè)或多個(gè)元素。在工作實(shí)例中,給定XPath表達(dá)式“//item”,按照?qǐng)D5的流程圖中所示執(zhí)行以下步 驟以便擴(kuò)展后代軸“//”并添加“僅選擇第一個(gè)”謂詞“ [1] ” 1.刪除(501) “/”字符之一以創(chuàng)建初始的優(yōu)化表達(dá)式“/item”。2.以“深度優(yōu)先”方式遍歷(502)模式樹,搜索名為“item”的元素。3.判斷(503)是否找到元素,如果找到,則繼續(xù),否則過程結(jié)束(504)。4.判斷(505)它是否為找到的第一個(gè)元素。如果是,則繼續(xù),否則,向先前表達(dá)式 附加(506)合并運(yùn)算符。5.當(dāng)找到“item”元素時(shí),在模式中查找(507) “maxOccurs,,屬性。判斷(508)它 是否為“1”(如果此屬性不存在,則“1”是默認(rèn)值),如果是,則向元素名稱附加(509)謂詞 “[1]”。如果它大于“1”或?yàn)椤皍nbounded”,則不附加(510)謂詞。6.轉(zhuǎn)到模式樹中的當(dāng)前元素的父代(511)。7.判斷(512)父代是否為根節(jié)點(diǎn)。如果是,則循環(huán)到步驟502以搜索另一個(gè) “item”。8.如果父代不是根節(jié)點(diǎn),則從模式提取名稱(513)并將其插入先前步驟的前面 (以“/”分隔符分隔)。9.循環(huán)回到步驟507以便根據(jù)需要向元素名稱附加謂詞并轉(zhuǎn)到下一個(gè)父代。繼續(xù) 直到到達(dá)“root”元素。10.如果找到另一個(gè)“item”元素,則為樹的此分支創(chuàng)建另一個(gè)優(yōu)化的路徑表達(dá) 式。將此表達(dá)式附加(506)到先前表達(dá)式(以“|”合并運(yùn)算符分隔)。繼續(xù)遍歷直到模式 樹中不再出現(xiàn)“item”。下面示出了當(dāng)執(zhí)行上述步驟時(shí),優(yōu)化表達(dá)式的逐漸建立(原始表達(dá)式為“// item”,每個(gè)步驟中的更改以下劃線示出)· /item· /list/item· /listni/item
· /tonic/list[1]/item· /topiclil/list[l]/item· /document/topic[1]/list[1]/item· /document「11/topic「11/list「11/item· /document[1]/topic[1]/list[1]/itemI/item· /document[1]/topic[1]/list[1]/item|/index/item· /documentΠ1/topicTll/listΓ /itemI/indexTll/item· /document[1]/topic[1]/list[1]/item|/document/indexTll/item· /document[1]/topie[1]/list[1]/item|/document ΓIl/index[1]/item在更通常的情況中,總體原則是逐步通過XPath表達(dá)式,每次一個(gè)元素步驟,并使 用元素名稱替換任何通配符“ * ”,使用完全限定路徑替換任何后代軸“//”。如果多個(gè)元素 匹配通配符,則依次考慮每個(gè)元素。后續(xù)步驟可能顯示特定匹配無法導(dǎo)向有效路徑,在此情 況下放棄此匹配。如果具有多個(gè)匹配,則將組合每個(gè)表達(dá)式,以XPath合并運(yùn)算符“ I ”分隔??紤]表達(dá)式“ * /topic//item” 1.將“模式光標(biāo)”設(shè)置為模式樹的根,將“XPath光標(biāo)”設(shè)置為原始XPath表達(dá)式
的第一步驟。2.從模式光標(biāo)位置,以深度優(yōu)先遍歷模式樹。3.如果模式樹中的光標(biāo)元素匹配XPath步驟(通配符匹配任何元素),則a.向優(yōu)化后的XPath表達(dá)式附加元素名稱(在通配符的情況下來自模式樹)。b.在模式中查找“maxOccurs”屬性。如果它是“ 1 ”(如果此屬性不存在,則“ 1 ” 是默認(rèn)值),則向元素名稱附加謂詞“ [1] ”。如果它大于“1”或?yàn)椤癷mboimded”,則不附加謂詞。c.如果XPath光標(biāo)在原始XPath表達(dá)式中的最后一個(gè)步驟處,則停止遞歸,將在此 階段構(gòu)建的新表達(dá)式添加到一系列部分(list of parts)并繼續(xù)從階段2遍歷。d.將XPath光標(biāo)移動(dòng)到原始XPath表達(dá)式中的下一個(gè)步驟。如果下一個(gè)步驟以后 代軸“//”分隔,則i.使用先前描述的算法擴(kuò)展此步驟(在此,在擴(kuò)展算法中將“root”元素定義為 “//”前面的元素)。ii.如果擴(kuò)展導(dǎo)致多個(gè)以合并運(yùn)算符“|”分隔的路徑,則優(yōu)化后的表達(dá)式到目前 為止需要復(fù)制并附加到每個(gè)部分的開頭。必須針對(duì)此算法的其余部分單獨(dú)處理每個(gè)部分。 (例如,在擴(kuò)展之前“/documenV/item”將產(chǎn)生“/document [1]//item”。從此光標(biāo)位置擴(kuò) 展 “//item” 將產(chǎn)生 “/topic [1]/list [1]/item I/index [1]/item”。在此步驟之后,兩個(gè)部 分將是 /document [1]/topic [1]/list [1]/item 禾口 /document [1]/index[1]/item,每個(gè)部 分將被單獨(dú)處理。)e.針對(duì)模式光標(biāo)的每個(gè)子代,依次將模式光標(biāo)設(shè)置為子代。遞歸回到階段3。(此階段的每個(gè)子代將表示優(yōu)化后的表達(dá)式中的單獨(dú)部分,大多數(shù)部分可能是死端并被放棄。 使用合并運(yùn)算符“ I ”組合算法結(jié)尾處的所有其余部分。)否則a.放棄自算法在階段2以來構(gòu)建的路徑的此部分。將模式光標(biāo)和XPath光標(biāo)重置到它們先前在階段2時(shí)的位置。繼續(xù)從階段2遍歷。4.組合以合并運(yùn)算符“ I ”分隔的系列部分以產(chǎn)生最終表達(dá)式。下面示出了當(dāng)執(zhí)行上述步驟時(shí),優(yōu)化表達(dá)式的逐漸建立(原始表達(dá)式為/ topic/Vitem”,每個(gè)步驟中的更改以下劃線示出)· document· document ΓIl
· documentΓ /topic· document「11/topic「11〇 /item〇 /list/item〇 /listril/item· documentΠ1/topicΠ1/listΠ1/item當(dāng)輸入諸如“//item”之類的表達(dá)式時(shí),必須遍歷整個(gè)數(shù)據(jù)結(jié)構(gòu)以查找此表達(dá)式的 所有出現(xiàn)。但是,此表達(dá)式可以被轉(zhuǎn)換為這樣的形式通過指定參考模式所獲得的完整路徑 表達(dá)式“/document/topic/list/item”而允許運(yùn)行時(shí)引擎直接導(dǎo)航到‘item(項(xiàng)目),。如果模式指定item不重復(fù),則可以在每個(gè)路徑步驟上放置一個(gè)顯式索引以告知 運(yùn)行時(shí)引擎在找到第一個(gè)匹配(例如“/document[l]/topiC[l]/liSt[l]/item”)時(shí)可以停 止搜索。注意,“item”是重復(fù)元素,但是其祖先元素不是重復(fù)元素。如果命名元素“item”出現(xiàn)在數(shù)據(jù)結(jié)構(gòu)的不同部分中,則可以使用合并運(yùn)算符 “ I,,將它們進(jìn)行組合。例如,“/document [1]/topic [1]/list [1]/item I/document [1]/ index [1]/item”。對(duì)于給定模式,此最后一個(gè)表達(dá)式與原始“//item”等價(jià),但采用可由不 能訪問此模式的運(yùn)行時(shí)引擎更有效處理的形式。對(duì)于模式,可以指定元素出現(xiàn)給定次數(shù),例如兩次。XPath步驟“/element[2]”將 返回第二個(gè)元素而不是前兩個(gè)元素。為了獲得正確的結(jié)果,應(yīng)附加[positionO <=2]。 在常規(guī)系統(tǒng)中,用戶指定“aaa/bbb”以指示他們希望運(yùn)行時(shí)引擎導(dǎo)航樹并返回所有匹配的 元素。有時(shí),可能僅返回一個(gè)元素,但是盡管如此,Xpath分析器通常必須分析整個(gè)樹,并且 因此進(jìn)行大量不必要的處理。用戶可能僅需要特定數(shù)量的元素,例如第一個(gè)元素,并且可以 在查詢中添加謂詞以指示這一點(diǎn),例如“aaa/bbb[l] ”。先前,分析器仍將返回整個(gè)列表,此 后,會(huì)將集合縮小為向用戶返回所需的數(shù)量。在所描述的系統(tǒng)中,工具包訪問用于確定所查詢的元素的出現(xiàn)次數(shù)的數(shù)據(jù)結(jié)構(gòu)模 式。然后,使用此信息向每個(gè)查詢添加謂詞。因此,如果確定僅存在兩個(gè)“aaa/bbb”元素并 且用戶查詢所有此類元素,則可以修改查詢以指示分析器應(yīng)僅查找前兩個(gè)元素,然后停止 分析。所描述的方法和系統(tǒng)可以應(yīng)用于包括運(yùn)行時(shí)引擎(采用查詢消息的消息代理的 形式)的ESB(企業(yè)服務(wù)總線)和XML處理產(chǎn)品。所述方法還可以作為服務(wù)通過網(wǎng)絡(luò)提供給客戶端,以便改進(jìn)用作查詢的修改后的 路徑表達(dá)式。本發(fā)明可以采取完全硬件實(shí)施例、完全軟件實(shí)施例或包含硬件和軟件元素兩者的 實(shí)施例的形式。在一個(gè)優(yōu)選實(shí)施例中,本發(fā)明以軟件實(shí)現(xiàn),所述軟件包括但不限于固件、駐留軟件、微碼等。本發(fā)明可以采 取可從計(jì)算機(jī)可用或計(jì)算機(jī)可讀介質(zhì)訪問的計(jì)算機(jī)程序產(chǎn)品的形 式,所述計(jì)算機(jī)可用或計(jì)算機(jī)可讀介質(zhì)提供了可以被計(jì)算機(jī)或任何指令執(zhí)行系統(tǒng)使用或與 計(jì)算機(jī)或任何指令執(zhí)行系統(tǒng)結(jié)合的程序代碼。出于此描述的目的,計(jì)算機(jī)可用或計(jì)算機(jī)可 讀介質(zhì)可以是任何能夠包含、存儲(chǔ)、傳送、傳播或傳輸由指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用或 與所述指令執(zhí)行系統(tǒng)、裝置或設(shè)備結(jié)合的程序的裝置。所述介質(zhì)可以是電、磁、光、電磁、紅外線或半導(dǎo)體系統(tǒng)(或裝置或設(shè)備)或傳播 介質(zhì)。計(jì)算機(jī)可讀介質(zhì)的實(shí)例包括半導(dǎo)體或固態(tài)存儲(chǔ)器、磁帶、可移動(dòng)計(jì)算機(jī)盤、隨機(jī)存 取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、硬磁盤和光盤。光盤的當(dāng)前實(shí)例包括光盤只讀存儲(chǔ)器 (CD-ROM)、光盤讀 / 寫(CD-R/W)和 DVD??梢栽诓黄x本發(fā)明的范圍的情況下對(duì)上述內(nèi)容進(jìn)行改進(jìn)和修改。
權(quán)利要求
一種用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)(101)的方法,包括接收用于查詢數(shù)據(jù)結(jié)構(gòu)(101)的輸入路徑表達(dá)式(104)以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié)構(gòu)(101)中的一個(gè)或多個(gè)元素(110),所述輸入路徑表達(dá)式(104)包括一個(gè)或多個(gè)路徑步驟;訪問所述數(shù)據(jù)結(jié)構(gòu)(101)的模式(103)并獲得與所述一個(gè)或多個(gè)元素(110)相關(guān)的信息;修改所述輸入路徑表達(dá)式(104)以便在一個(gè)或多個(gè)所述路徑步驟中指定索引以限制位于路徑步驟中的元素的出現(xiàn)次數(shù);以及使用修改后的路徑表達(dá)式在運(yùn)行時(shí)查詢(111)所述數(shù)據(jù)結(jié)構(gòu)(101)。
2.如權(quán)利要求1中所述的方法,其中所述輸入路徑表達(dá)式(104)包括通配符或后代軸 中的一個(gè)或多個(gè)。
3.如權(quán)利要求1或2中所述的方法,其中修改所述輸入路徑表達(dá)式(104)的步驟指 定所述元素(110)的一個(gè)或多個(gè)完整路徑,其中通過合并運(yùn)算符組合兩個(gè)或更多個(gè)完整路徑。
4.如權(quán)利要求1至3中的任一權(quán)利要求中所述的方法,其中在一個(gè)或多個(gè)所述路徑步 驟中指定索引的步驟將所述索引的謂詞附加到路徑元素名稱。
5.如上述權(quán)利要求中的任一權(quán)利要求中所述的方法,其中獲得信息的步驟包括查找 屬性在所述模式(103)中的最大出現(xiàn)次數(shù),并且如果所述屬性不存在或所述最大出現(xiàn)次數(shù) 為1,則將謂詞“1”附加到路徑元素名稱。
6.如上述權(quán)利要求中的任一權(quán)利要求中所述的方法,其中所述模式(103)包含用于跟 蹤所述數(shù)據(jù)結(jié)構(gòu)(101)的元素(110)直到到達(dá)其根的信息。
7.如上述權(quán)利要求中的任一權(quán)利要求中所述的方法,其中所述輸入路徑表達(dá)式(104) 是XPath表達(dá)式,并且所述數(shù)據(jù)結(jié)構(gòu)(101)是具有關(guān)聯(lián)模式(103)的文檔對(duì)象模型結(jié)構(gòu)。
8.一種用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)(101)的系統(tǒng),包括用于接收查詢數(shù)據(jù)結(jié)構(gòu)(101)的輸入路徑表達(dá)式(104)以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié) 構(gòu)(101)中的一個(gè)或多個(gè)元素(110)的裝置,其中所述輸入路徑表達(dá)式(104)包括一個(gè)或 多個(gè)路徑步驟;用于訪問所述數(shù)據(jù)結(jié)構(gòu)(101)的模式(103)并獲得與所述一個(gè)或多個(gè)元素(110)相關(guān) 的信息的裝置;用于修改所述輸入路徑表達(dá)式(104)以便在一個(gè)或多個(gè)所述路徑步驟中指定索引以 限制位于路徑步驟中的元素的出現(xiàn)次數(shù)的裝置;以及用于輸出修改后的路徑表達(dá)式以用于在運(yùn)行時(shí)查詢(111)所述數(shù)據(jù)結(jié)構(gòu)(101)的裝置。
9.如權(quán)利要求8中所述的系統(tǒng),其中所述輸入路徑表達(dá)式(104)包括通配符或后代軸 中的一個(gè)或多個(gè)。
10.如權(quán)利要求8或9中所述的系統(tǒng),其中用于修改所述輸入路徑表達(dá)式(104)的裝 置指定元素(110)的一個(gè)或多個(gè)完整路徑,其中通過合并運(yùn)算符組合兩個(gè)或更多個(gè)完整路徑。
11.如權(quán)利要求8至10中的任一權(quán)利要求中所述的系統(tǒng),其中在一個(gè)或多個(gè)所述路徑2步驟中指定索引將所述索引的謂詞附加到路徑元素名稱。
12.如權(quán)利要求8至11中的任一權(quán)利要求中所述的系統(tǒng),包括用于查找屬性在所述模 式(103)中的最大出現(xiàn)次數(shù),并且如果所述屬性不存在或所述最大出現(xiàn)次數(shù)為1,則將謂詞 “1”附加到路徑元素名稱的裝置。
13.如權(quán)利要求8至12中的任一權(quán)利要求中所述的系統(tǒng),其中所述模式(103)包含用 于跟蹤所述數(shù)據(jù)結(jié)構(gòu)(101)的元素(110)直到到達(dá)其根的信息。
14.如權(quán)利要求8至13中的任一權(quán)利要求中所述的系統(tǒng),其中所述輸入路徑表達(dá)式 (104)是XPath表達(dá)式,并且所述數(shù)據(jù)結(jié)構(gòu)(101)是具有關(guān)聯(lián)模式(103)的文檔對(duì)象模型結(jié) 構(gòu)。
15.如權(quán)利要求8至14中的任一權(quán)利要求中所述的系統(tǒng),其中所述系統(tǒng)是用于構(gòu)建要 在運(yùn)行時(shí)部署的查詢的工具包(105)。
16.如權(quán)利要求8至15中的任一權(quán)利要求中所述的系統(tǒng),包括不能訪問所述模式 (103)的運(yùn)行時(shí)引擎(102),其中所述運(yùn)行時(shí)引擎(102)使用修改后的路徑表達(dá)式定位數(shù)據(jù) 結(jié)構(gòu)(101)中的一個(gè)或多個(gè)元素(110)。
17.如權(quán)利要求16中所述的系統(tǒng),其中所述運(yùn)行時(shí)引擎(102)是消息代理,并且所述數(shù) 據(jù)結(jié)構(gòu)(101)是消息。
18.一種存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品包括 用于執(zhí)行以下步驟的計(jì)算機(jī)可讀程序代碼裝置接收用于查詢數(shù)據(jù)結(jié)構(gòu)(101)的輸入路徑表達(dá)式(104)以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié) 構(gòu)(101)中的一個(gè)或多個(gè)元素(110),所述輸入路徑表達(dá)式(104)包括一個(gè)或多個(gè)路徑步 驟;訪問所述數(shù)據(jù)結(jié)構(gòu)(101)的模式(103)并獲得與所述一個(gè)或多個(gè)元素(110)相關(guān)的信息;修改所述輸入路徑表達(dá)式(104)以便在一個(gè)或多個(gè)所述路徑步驟中指定索引以限制 位于路徑步驟中的元素的出現(xiàn)次數(shù);以及使用修改后的路徑表達(dá)式在運(yùn)行時(shí)查詢(111)所述數(shù)據(jù)結(jié)構(gòu)(101)。
19.一種包括程序代碼裝置的計(jì)算機(jī)程序,當(dāng)所述程序在計(jì)算機(jī)上運(yùn)行時(shí),所述程序代 碼裝置適于執(zhí)行權(quán)利要求1至7中的任一權(quán)利要求中所述的方法。
全文摘要
提供了一種用于導(dǎo)航數(shù)據(jù)結(jié)構(gòu)的方法和系統(tǒng)。所述方法包括接收用于查詢數(shù)據(jù)結(jié)構(gòu)(101)的輸入路徑表達(dá)式(104)以便在運(yùn)行時(shí)定位所述數(shù)據(jù)結(jié)構(gòu)(101)中的一個(gè)或多個(gè)元素(110)。所述輸入路徑表達(dá)式(104)包括一個(gè)或多個(gè)路徑步驟。所述方法包括訪問所述數(shù)據(jù)結(jié)構(gòu)(101)的模式(103)并獲得與所述一個(gè)或多個(gè)元素(110)相關(guān)的信息。修改所述路徑表達(dá)式(104)以便在一個(gè)或多個(gè)所述路徑步驟中指定索引以限制位于路徑步驟中的元素的出現(xiàn)次數(shù)。在一個(gè)實(shí)施例中,修改所述路徑表達(dá)式(104)還擴(kuò)展任何通配符并指定所述元素(110)的一個(gè)或多個(gè)完整路徑,其中如果存在兩個(gè)或更多個(gè)完整路徑,則通過合并運(yùn)算符組合所述路徑,并且修改后的路徑表達(dá)式用于在運(yùn)行時(shí)查詢(111)所述數(shù)據(jù)結(jié)構(gòu)(101)。
文檔編號(hào)G06F17/30GK101965565SQ200980102204
公開日2011年2月2日 申請(qǐng)日期2009年1月7日 優(yōu)先權(quán)日2008年1月15日
發(fā)明者A·J·科爾曼 申請(qǐng)人:國際商業(yè)機(jī)器公司