專(zhuān)利名稱(chēng):帶有正向和反向軸的流式xpath處理的方法
技術(shù)領(lǐng)域:
本發(fā)明廣泛地涉及信息處理系統(tǒng)的領(lǐng)域,具體來(lái)說(shuō)涉及搜索數(shù)據(jù)結(jié)構(gòu)的領(lǐng)域。
背景技術(shù):
術(shù)語(yǔ)的定義XML-可擴(kuò)展的標(biāo)記語(yǔ)言(XML)描述一類(lèi)叫做XML文檔的數(shù)據(jù)對(duì)象,并部分地描述了處理它們的計(jì)算機(jī)程序的行為。XML文檔由叫做實(shí)體的存儲(chǔ)單位組成,實(shí)體包含已分析的或未分析的數(shù)據(jù)。每一個(gè)XML文檔都包含一個(gè)或多個(gè)元素,元素之間的邊界由開(kāi)始標(biāo)記和結(jié)束標(biāo)記分隔,或者對(duì)于空的元素,由空元素標(biāo)記分隔。來(lái)自www.XML.com網(wǎng)站。
XPath-XML PATH語(yǔ)言。XPath 1.0作為一種解決XML文檔的一部分的語(yǔ)言,是諸如可擴(kuò)展的樣式表語(yǔ)言轉(zhuǎn)換(XSLT)和XQuery之類(lèi)的進(jìn)行XML處理的語(yǔ)言的整體組成部分。AlanFreedman,Computer Desktop Encyclopedia,9thEdition,Osborne/McGraw-Hill(2001)(下文將簡(jiǎn)稱(chēng)為“Freedman”)。
XSLT-可擴(kuò)展的樣式表語(yǔ)言轉(zhuǎn)換。一種將XML文檔轉(zhuǎn)換為其他XML文檔的語(yǔ)言(來(lái)自http//www.w3.org/TR/xslt)。
Xalan-Xalan是XSLT的Apache版本(請(qǐng)參閱http//xml.apache.org)。
DOM-文檔對(duì)象模型。文檔對(duì)象模型是一種不依賴(lài)于平臺(tái)和語(yǔ)言的接口,它允許程序和腳本動(dòng)態(tài)地訪問(wèn)和更新XML文檔的內(nèi)容、結(jié)構(gòu)和樣式。文檔可以被進(jìn)一步地處理,該處理的結(jié)果可以重新放回呈現(xiàn)的頁(yè)中(來(lái)自http//www.w3c.org/DOM)。
SAX-XML的簡(jiǎn)單API。一種在XML分析器和XML應(yīng)用程序之間的基于事件的編程接口(API)?;趯?duì)象的接口是由DOM提供的。Freedman。
XML的流式處理-XML文檔的流式處理是給予一種對(duì)XML文檔進(jìn)行處理的類(lèi)型的名稱(chēng),在這種處理方式中,文檔不必存儲(chǔ)在內(nèi)存中,文檔中的每一個(gè)節(jié)點(diǎn)至多被訪問(wèn)一次。流式是一個(gè)一般概念。流式XPath處理是指在XML文檔中“流過(guò)”時(shí)對(duì)XPath表達(dá)式進(jìn)行計(jì)算的過(guò)程。
相關(guān)技術(shù)的描述基于事件的分析基于事件的分析器,例如,SAX分析器,對(duì)XML文檔進(jìn)行掃描,并在它識(shí)別到文檔的元素標(biāo)記以及其他組件時(shí)產(chǎn)生事件。每一個(gè)事件都傳達(dá)對(duì)應(yīng)元素的名稱(chēng)和級(jí)別。事件的產(chǎn)生相當(dāng)于對(duì)文檔樹(shù)的深度優(yōu)先、預(yù)先順序的遍歷,其中,對(duì)于每一個(gè)元素,生成開(kāi)始元素事件,然后,以深度優(yōu)先的順序處理其子樹(shù),最后,生成結(jié)束元素事件?;谑录姆治銎鞑粫?huì)構(gòu)建樹(shù),它們只是中繼開(kāi)始/結(jié)束標(biāo)記(事件)是什么。這些事件由基于事件的分析器的客戶端接收。客戶端具有以它選擇的任何方式處理這些事件的靈活性,包括存儲(chǔ)一些事件,以及丟棄其它的事件。
XPath如上所述,XPath是一種解決XML文檔的一部分的語(yǔ)言,是諸如XSLT和XQuery之類(lèi)的語(yǔ)言的整體組成部分。這些語(yǔ)言的版本的性能取決于基礎(chǔ)XPath引擎的效率。XPath表達(dá)式也有被用作訪問(wèn)XML文檔的組成部分的通用機(jī)制,例如,在文檔對(duì)象模型(DOM)3中提供了基于XPath的應(yīng)用程序編程接口(API),用于遍歷DOM樹(shù)。XPath表達(dá)式也已經(jīng)在出版-預(yù)訂系統(tǒng)中作為指定基于內(nèi)容的預(yù)訂的機(jī)制得到應(yīng)用。
最新的XPath引擎,例如,隨Xalan一起提供的一個(gè),要求整個(gè)文檔必須在內(nèi)存中才能對(duì)XPath表達(dá)式進(jìn)行計(jì)算。對(duì)于較大的文檔,此方法可能導(dǎo)致開(kāi)銷(xiāo)無(wú)法接受。此外,Xalan中的XPath引擎以自然的方式對(duì)XPath表達(dá)式進(jìn)行計(jì)算,并可能對(duì)輸入文檔執(zhí)行不必要的遍歷。例如,假定有選擇文檔中的x元素的所有y祖先的諸如/descendant∷x/ancestorty之類(lèi)的表達(dá)式。Xalan XPath引擎是這樣對(duì)此表達(dá)式進(jìn)行計(jì)算的,對(duì)整個(gè)文檔進(jìn)行一次遍歷以定位所有x元素,然后對(duì)于每一個(gè)x元素,訪問(wèn)其每一個(gè)祖先以定位相應(yīng)的y元素。結(jié)果,文檔中的一些元素被訪問(wèn)好幾次。假設(shè)一個(gè)人希望定位名為“John”的具有名為“Fred”的所有人(節(jié)點(diǎn))。Xalan引擎將遍歷整個(gè)文檔以訪問(wèn)每一個(gè)“John”節(jié)點(diǎn)。對(duì)于每一個(gè)這樣的“John”節(jié)點(diǎn),它將遍歷其每一個(gè)祖先節(jié)點(diǎn)以確定他們中是否有人名為“Fred”。然后它將返回所有這樣的“Fred”節(jié)點(diǎn)。顯而易見(jiàn),“John”節(jié)點(diǎn)的每一個(gè)祖先都至少被訪問(wèn)兩次,一次在遍歷以便找出 “John”節(jié)點(diǎn)期間,一次在從“John”節(jié)點(diǎn)遍歷以找出“Fred”節(jié)點(diǎn)期間。
流式XPath處理在許多環(huán)境中,處理XML文檔的自然方式是在文檔中流動(dòng),即,在對(duì)輸入文檔進(jìn)行分析時(shí)在輸入文檔上計(jì)算查詢,只存儲(chǔ)與查詢的結(jié)果有關(guān)的文檔的那些部分。
流式XPath的前提是,在許多情況下,可以在對(duì)XML文檔進(jìn)行的一次深度優(yōu)先、文檔順序的遍歷中計(jì)算XPath表達(dá)式。流式XPath的主要優(yōu)點(diǎn)是它通過(guò)在內(nèi)存中只存儲(chǔ)與XPath的計(jì)算有關(guān)的文檔的那一部分,而不是存儲(chǔ)整個(gè)文檔來(lái)優(yōu)化內(nèi)存利用效率;它加快了執(zhí)行時(shí)間,因?yàn)樗惴▌偤迷L問(wèn)文檔中的每一個(gè)節(jié)點(diǎn)一次,從而避免了不必要的遍歷。
已知的處理流式XPath的方法所存在的局限性是,它只能在只包含正向軸的表達(dá)式上進(jìn)行。如果表達(dá)式包含反向軸(如父母或祖先),則無(wú)法對(duì)這樣的表達(dá)式使用已知的流式XPath處理算法。
圖1-XML文檔的樹(shù)狀表示樹(shù)是一個(gè)由節(jié)點(diǎn)組成的數(shù)據(jù)結(jié)構(gòu)。其中一個(gè)節(jié)點(diǎn)特別地表示為根節(jié)點(diǎn)。樹(shù)中的除了根節(jié)點(diǎn)之外的所有節(jié)點(diǎn)在樹(shù)中都剛好具有一個(gè)父節(jié)點(diǎn)。XML文檔可以表示為一個(gè)樹(shù),其節(jié)點(diǎn)表示文檔元素、文本屬性、注釋和處理指令的結(jié)構(gòu)組件。樹(shù)中的父子邊緣表示子組件包含在其父元素中,其中元素的范圍由其開(kāi)始和結(jié)束標(biāo)記限定。對(duì)應(yīng)于XML文檔的樹(shù)的根在一個(gè)包含文檔元素的虛擬元素Root中。自此以后我們將就樹(shù)狀表示來(lái)討論XML文檔。一個(gè)人可以在樹(shù)的節(jié)點(diǎn)上定義任意的順序。一個(gè)這樣的順序可以基于對(duì)樹(shù)的從左到右深度第一的遍歷,對(duì)于XML文檔的樹(shù)狀表示,這種遍歷對(duì)應(yīng)于文檔順序。
給定樹(shù)上的一個(gè)順序,我們可以在樹(shù)上定義一個(gè)正向和反向關(guān)系的概念。關(guān)系R是一個(gè)正向關(guān)系,如果兩個(gè)節(jié)點(diǎn)x和y之間存在關(guān)系R,必須是在樹(shù)的順序上x(chóng)在y前面。同樣,關(guān)系是一個(gè)反向關(guān)系,如果每當(dāng)x與y有關(guān)時(shí),那么必須是在樹(shù)的順序上x(chóng)在y后面。例如,假設(shè)XML文檔的樹(shù)狀表示的文檔順序,子關(guān)系和子代關(guān)系兩者都是正向關(guān)系,而父關(guān)系和祖先關(guān)系兩者都是反向關(guān)系。
圖1說(shuō)明了XML文檔的樹(shù)狀表示。為簡(jiǎn)單起見(jiàn),我們將專(zhuān)門(mén)講述元素并忽略諸如屬性和文本節(jié)點(diǎn)之類(lèi)的項(xiàng)目。因此,樹(shù)100由文檔的虛擬根101和元素構(gòu)成。為避免XML文檔樹(shù)100和XPath(稍后描述)的樹(shù)狀表示之間產(chǎn)生混淆,我們使用元素來(lái)指XML樹(shù)100的節(jié)點(diǎn)。在XML樹(shù)100中,方框中的標(biāo)記表示對(duì)應(yīng)的XML文檔中的元素標(biāo)記,標(biāo)記旁邊的括號(hào)中的數(shù)字表示基于事件的分析器訪問(wèn)節(jié)點(diǎn)的順序。例如,節(jié)點(diǎn)102X(1)表示帶有標(biāo)記<X>的元素,是基于事件的分析器訪問(wèn)的第一個(gè)節(jié)點(diǎn)。對(duì)于此順序,顯然,每當(dāng)一個(gè)元素(例如,102)是另一個(gè)元素(例如,101)的子元素時(shí),那么,子元素就按此順序位于父元素的后面。
圖2-流式XPath流式XPath引擎是如圖2所示的結(jié)構(gòu)。XPath表達(dá)式211經(jīng)過(guò)分析并被表示為自動(dòng)機(jī)203。XPath引擎201使用分析器205產(chǎn)生的事件(例如,SAX事件),對(duì)于每一個(gè)事件,自動(dòng)機(jī)203可以進(jìn)行狀態(tài)轉(zhuǎn)移,如有必要,還存儲(chǔ)元素。在處理完文檔207之后,XPath引擎返回元素209的列表,元素209是對(duì)XPath表達(dá)式211進(jìn)行計(jì)算的結(jié)果。
若沒(méi)有流式處理,當(dāng)接收到XML文檔時(shí),對(duì)它進(jìn)行處理,并構(gòu)建樹(shù)狀表示。該整個(gè)樹(shù)狀表示必須保留在內(nèi)存中才能從該樹(shù)對(duì)表達(dá)式進(jìn)行XPath處理。而有了流式處理,則不必構(gòu)建整個(gè)樹(shù);而在生成事件時(shí)對(duì)它們進(jìn)行處理。這就是為什么流式處理對(duì)于無(wú)限文檔非常關(guān)鍵的原因。對(duì)于無(wú)限文檔,無(wú)法構(gòu)建一個(gè)樹(shù),因?yàn)閿?shù)據(jù)是動(dòng)態(tài)地生成的,因此,樹(shù)的大小不是有限的。無(wú)限文檔的一個(gè)例子是證券報(bào)價(jià)文檔,其中的數(shù)據(jù)(股票價(jià)格)是動(dòng)態(tài)地生成的。當(dāng)前對(duì)XML文檔進(jìn)行流式處理的方法的缺點(diǎn)是,只能處理正向軸。給定XPath在XML堆棧中扮演的中心角色,用于改進(jìn)計(jì)算包含反向軸的XPath表達(dá)式的性能的算法是必需的。
發(fā)明內(nèi)容
根據(jù)本發(fā)明,用于以流式方式計(jì)算同時(shí)包含反向(如父母和祖先)和正向(如子和子代)軸的XPath表達(dá)式的方法包括許多步驟,下面將對(duì)這些步驟進(jìn)行闡述。已知的XPath處理器只能處理正向軸。在對(duì)文檔進(jìn)行處理期間的任何時(shí)候,此方法都只保留對(duì)文檔進(jìn)行處理所需的最小元素集。
圖1顯示了根據(jù)現(xiàn)有技術(shù)的一個(gè)XML文檔的樹(shù)狀表示。
圖2是根據(jù)現(xiàn)有技術(shù)的流式XPath處理器的結(jié)構(gòu)的方框圖。
圖3A顯示了一個(gè)XPath表達(dá)式。
圖3B顯示了根據(jù)本發(fā)明的一個(gè)實(shí)施例的圖3A的XPath表達(dá)式的樹(shù)狀表示。
圖3C顯示了根據(jù)本發(fā)明的一個(gè)實(shí)施例的圖3B的XTree的非循環(huán)有向圖表示。
圖4顯示了一個(gè)XML文檔的樹(shù)狀表示。
圖5顯示了本發(fā)明的一個(gè)實(shí)施例的高級(jí)別流程圖。
圖6顯示了本發(fā)明的一個(gè)實(shí)施例的詳細(xì)的流程圖。
圖7A顯示了一個(gè)XPath表達(dá)式。
圖7B顯示了根據(jù)本發(fā)明的一個(gè)實(shí)施例的圖7A的XPath表達(dá)式的XTree表示。
圖8顯示了根據(jù)本發(fā)明的一個(gè)實(shí)施例的圖7B中的XTree的XDAG表示。
圖9是根據(jù)本發(fā)明的一個(gè)實(shí)施例的對(duì)圖1的XML文檔100上的圖7A的XPath表達(dá)式進(jìn)行處理結(jié)束時(shí)匹配結(jié)構(gòu)的方框圖表示。
圖10是被配置為根據(jù)本發(fā)明的一個(gè)實(shí)施例進(jìn)行操作的信息處理系統(tǒng)的簡(jiǎn)化方框圖。
具體實(shí)施例方式
圖3A、3B和3C-XPath表達(dá)式、樹(shù)狀表示和DAGXML文檔的表示假設(shè)我們有一個(gè)樹(shù),在該樹(shù)中,每一個(gè)節(jié)點(diǎn)都帶有標(biāo)記(其中,相同的標(biāo)記可以出現(xiàn)在多個(gè)節(jié)點(diǎn)上)。假設(shè)有一個(gè)這樣的問(wèn)題定位樹(shù)中的標(biāo)有C的所有節(jié)點(diǎn),并且這些節(jié)點(diǎn)同時(shí)具有標(biāo)有A的祖先和標(biāo)有B的祖先。這對(duì)應(yīng)于如圖3A所示的標(biāo)有301的XPath表達(dá)式/descendant∷Aldescendant∷C[ancestor∷B]。圖3B中提供了此表達(dá)式的樹(shù)狀表示,圖3C中提供了非循環(huán)有向圖(DAG)版本,帶有標(biāo)有302、304、306和308的節(jié)點(diǎn)。
圖4-XML文檔的樹(shù)狀表示例如,請(qǐng)看如圖4所示的樹(shù)。假設(shè)404和406兩個(gè)節(jié)點(diǎn),這兩者都標(biāo)有C。節(jié)點(diǎn)404具有標(biāo)有B的祖先403,但沒(méi)有標(biāo)有A的祖先。因而,節(jié)點(diǎn)404不滿足要求。而在另一方面,節(jié)點(diǎn)406同時(shí)具有標(biāo)有B的祖先403和標(biāo)有A的祖先405,因此,滿足該要求。
我們的要求可以以一組約束來(lái)表達(dá),其中每個(gè)約束呈現(xiàn)S1→S2的形式,其中S1和S2是標(biāo)記集。圖3B中的樹(shù)和圖3C中的DAG兩者都是這些約束的等效的圖形表示。它們用于將輸入XPath表達(dá)式轉(zhuǎn)換成一組約束。例如,上述XPath表達(dá)式可以用下面的約束集來(lái)表示1{Root}→(A,B}2{A,B}→{C}3{C}→{}圖5-高級(jí)流程圖請(qǐng)參看圖5,有一個(gè)流程圖,顯示了根據(jù)本發(fā)明的一個(gè)實(shí)施例的算法如何處理圖4的樹(shù),計(jì)算滿足上述約束的標(biāo)有C的節(jié)點(diǎn)406的集的一組約束。該流程圖含蓄地假設(shè)使用下面的從根開(kāi)始的步驟對(duì)樹(shù)進(jìn)行遍歷(由基于事件的分析器進(jìn)行)I.發(fā)出“開(kāi)始”節(jié)點(diǎn)事件;2.以從左到右的順序遞歸地訪問(wèn)子節(jié)點(diǎn);以及3.發(fā)出“結(jié)束”節(jié)點(diǎn)事件。
我們從一組活動(dòng)條件502開(kāi)始。在此例子中,當(dāng)我們開(kāi)始時(shí)唯一的活動(dòng)條件是{Root}。對(duì)于在504中處理的每一個(gè)節(jié)點(diǎn),我們將在步驟506中檢查該節(jié)點(diǎn)是否匹配某些活動(dòng)條件。如果匹配,那么算法將在步驟508中檢查對(duì)應(yīng)于任何約束的左側(cè)的條件集是否完全滿足。如果滿足,那么在步驟510中我們將檢查約束的右側(cè)的條件集是否為空的。如果不是空的,我們?cè)诓襟E512中將此條件集添加到活動(dòng)條件集。如果該條件集是空的,我們將在步驟514中檢查是否滿足所有約束。如果滿足,那么我們已經(jīng)找到一個(gè)解答。否則,我們繼續(xù)處理下一個(gè)節(jié)點(diǎn)。在圖6的流程圖中描述了比較詳細(xì)的過(guò)程的一步步的說(shuō)明。算法按如下方式繼續(xù)進(jìn)行
圖6-詳細(xì)的流程圖1.當(dāng)我們?cè)?10中看到標(biāo)有“Root”的節(jié)點(diǎn)401的開(kāi)始事件時(shí),我們將檢查該事件是開(kāi)始事件還是結(jié)束事件。由于這是一個(gè)開(kāi)始事件,接下來(lái)我們將在步驟612中檢查節(jié)點(diǎn)是否匹配任何活動(dòng)條件。在這種情況下,我們發(fā)現(xiàn)了一個(gè)匹配。接下來(lái),我們判斷是否需要添加任何新的條件。為此,我們?cè)诓襟E614中判斷已經(jīng)滿足的條件是否完全滿足任何約束的左側(cè)。在這種情況下,我們判斷約束{Root}→{A,B}的左側(cè)已得到完全滿足。對(duì)于所有這樣的約束,我們將右側(cè)的條件添加到活動(dòng)條件集。在這種情況下,在步驟618中,條件A和B被添加到活動(dòng)條件集。處理過(guò)程返回到步驟602以檢查是否更多的事件。由于有另一個(gè)事件要處理,如在判斷步驟602中所判斷的,在步驟606中讀取該事件。
2.接下來(lái)我們進(jìn)入步驟606以處理另一個(gè)樹(shù)事件,并看到標(biāo)有D的節(jié)點(diǎn)402的開(kāi)始事件。在判斷步驟612中,我們看到此事件不匹配任何活動(dòng)條件之后,因此在步驟613中被丟棄或者被過(guò)濾。
3.接下來(lái),我們看到標(biāo)有D的節(jié)點(diǎn)402的結(jié)束事件。由于當(dāng)我們看到節(jié)點(diǎn)402的開(kāi)始時(shí)沒(méi)有添加任何條件,因此在608中沒(méi)有條件需要從活動(dòng)集中除去,從而將我們帶回到步驟602以處理另一個(gè)事件。
4.接下來(lái),我們看到標(biāo)有B的節(jié)點(diǎn)403的開(kāi)始事件。在步驟612中判斷此節(jié)點(diǎn)匹配一個(gè)活動(dòng)條件。然而,沒(méi)有新條件可以由于此事件而添加,因?yàn)闆](méi)有滿足約束的左側(cè)的完整的條件集。
5.接下來(lái),我們看到標(biāo)有C的節(jié)點(diǎn)404的開(kāi)始事件。在步驟612中判斷此節(jié)點(diǎn)也不匹配任何活動(dòng)條件,因此在步驟613中被丟棄。
6.接下來(lái),我們看標(biāo)有C的節(jié)點(diǎn)404的也沒(méi)有產(chǎn)生變化的結(jié)束事件。
7.接下來(lái),我們?cè)诓襟E610中看到標(biāo)有A的節(jié)點(diǎn)405的開(kāi)始事件。如在判斷步驟612中所判斷的,此節(jié)點(diǎn)匹配一個(gè)活動(dòng)條件。此外,現(xiàn)在在步驟614中完全匹配約束{A,B}→{C}的左側(cè),從而導(dǎo)致在步驟618中條件C被添加活動(dòng)集。
8.接下來(lái),我們?cè)诓襟E610中看到標(biāo)有C的節(jié)點(diǎn)406的開(kāi)始事件。在步驟612中判斷此事件匹配一個(gè)活動(dòng)條件之后,則在步驟614中判斷此事件進(jìn)一步完全滿足約束{C}→{}的左側(cè)。在步驟616中檢查約束的右側(cè)是空的之后,我們?cè)诓襟E620中傳播匹配信息。此時(shí),我們將在步驟622中檢查是否滿足所有約束,在這種情況下,答案是肯定的。因而,我們?cè)诓襟E624中輸出節(jié)點(diǎn)406作為一個(gè)解答節(jié)點(diǎn)。
9.接下來(lái),我們看到節(jié)點(diǎn)406的沒(méi)有影響的結(jié)束事件。
10.接下來(lái),我們看到節(jié)點(diǎn)405的結(jié)束事件,該事件導(dǎo)致C在步驟608中從活動(dòng)條件集中除去。
11.接下來(lái),我們看到節(jié)點(diǎn)403的沒(méi)有影響的結(jié)束事件。
12.最后,我們看到節(jié)點(diǎn)401(根節(jié)點(diǎn))的結(jié)束事件,該事件導(dǎo)致A和B在步驟608中從活動(dòng)集除去,在步驟602中判斷沒(méi)有更多事件要處理之后,算法在604結(jié)束。
圖7A和7B-分別是XPath表達(dá)式和其XTree表示此算法在XPath表達(dá)式的叫做XTree和XDAG的兩個(gè)表示上操作。請(qǐng)參看圖7B,您將看到表示圖7A的XPath表達(dá)式的XTree 700。對(duì)應(yīng)于W 706的圓圈的邊比較粗,表示這樣的事實(shí)它是輸出節(jié)點(diǎn)。
我們用有標(biāo)記的頂點(diǎn)(V)和邊(E)來(lái)將XPath表達(dá)式表示為有根的樹(shù),叫做XTree(T),以使T=(Vt,Et),其中根節(jié)點(diǎn)701被標(biāo)記為Root。我們將使用術(shù)語(yǔ)“有限制的XPath”或Rxp,來(lái)指圖7A中的輸入XPath表達(dá)式。我們使用術(shù)語(yǔ)x節(jié)點(diǎn)來(lái)指XTree的頂點(diǎn)。圖7B中的x節(jié)點(diǎn)顯示為編號(hào)為701、702、704、706、708和710的圓圈。圖7A中的XPath表達(dá)式包括許多x∷y形式的步驟。例如,出現(xiàn)在XPath表達(dá)式中的一個(gè)步驟是descendanu:w。對(duì)于任何步驟x∷y,我們稱(chēng)x為步驟的軸,稱(chēng)y為NodeTest。例如,在步驟descendant∷w中,軸是“descendant”,NodeTest是“w”。如果該文檔中的一個(gè)元素的標(biāo)記與NodeTest相同,則該元素匹配N(xiāo)odeTest。對(duì)于表達(dá)式中的每一個(gè)NodeTest,在標(biāo)有NodeTest的XTree中都有一個(gè)x節(jié)點(diǎn)。每一個(gè)x節(jié)點(diǎn)(Root 701除外)有一個(gè)獨(dú)特的進(jìn)入邊,該邊標(biāo)有在NodeTest之前指定的Axis。其中一個(gè)x節(jié)點(diǎn)被指定為輸出x節(jié)點(diǎn)。在這種情況下,它是節(jié)點(diǎn)706。有返回分別與x節(jié)點(diǎn)和邊關(guān)聯(lián)的標(biāo)記的函數(shù)labelVτ→String,and axisEτ→{ancestor,parent,child,descendant}。附錄A中提供了從Rxp構(gòu)建XTree的規(guī)則。
圖8-圖7A的XPath表達(dá)式的XDAG表示。
XDAG是此方法中的關(guān)鍵結(jié)構(gòu),因?yàn)樗鼘⒅T如父之類(lèi)的反向約束轉(zhuǎn)換為正向約束,因此,使得對(duì)于包含反向軸的表達(dá)式進(jìn)行流式處理成為可能。XDAG是從XPath表達(dá)式創(chuàng)建的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的圖形表示。它表示XPath表達(dá)式以及其所有約束。
將反向約束轉(zhuǎn)換為正向約束是通過(guò)修改約束而不修改查詢的含義來(lái)完成的。為進(jìn)行說(shuō)明,前面我們使用了定位帶有名為“Fred”的祖先節(jié)點(diǎn)的所有“John”節(jié)點(diǎn)的示例。利用XDAG表示,我們將修改約束以定位所有“Fred”節(jié)點(diǎn),然后定位這些“Fred”節(jié)點(diǎn)的所有名為“John”的后代節(jié)點(diǎn),而不是“定位帶有祖先′Fred′的′John′節(jié)點(diǎn)”的原始約束。圖8顯示了顯示為XTree 700的XPath表達(dá)式的XDAG表示。XDAG 800是通過(guò)將樹(shù)中的祖先和父約束重新表述為為后代和子約束來(lái)從XTree 700獲取的??梢酝ㄟ^(guò)查看圖7B和圖8來(lái)看到將反向(祖先)約束更改為正向(后代)約束的圖形示例。在圖8中,您看到從x節(jié)點(diǎn)(頂點(diǎn),或v)W 806(表示為v1)到Z 808(表示為v2)的線條(邊,或e)。該邊(e=v1,v2)被標(biāo)記為“后代”,而在圖7中,從W 706到Z708的邊(e=v1,v2)被標(biāo)記為“祖先”。
XDAG 800可以進(jìn)一步被描述為Rxp的有向非循環(huán)圖表示。更準(zhǔn)確地,它是有向的標(biāo)記圖(G),由邊和頂點(diǎn)圍住,以便G=(Vg,Eg),帶有與XTree 700(T)相同的頂點(diǎn)集,邊按下列方式定義1.T 700中的標(biāo)記為“子”或“后代”的邊也是G 800的邊。如果您查看圖7B,它顯示了標(biāo)記為“子”或“后代”的四個(gè)邊。圖8也顯示了這些邊。
2.對(duì)于T 700中的標(biāo)記為“父”的每一個(gè)邊,在G 800中有一個(gè)連接相同節(jié)點(diǎn)但帶有顛倒的方向和更改為“子”的標(biāo)記的邊。同樣,T 700中的“祖先”邊被顛倒,并在G 800中被重新標(biāo)記為“后代”邊。圖7B顯示了從W 706到Z 708被標(biāo)記為“祖先”的邊,而圖8顯示了從Z 808到W 806被標(biāo)記為“后代”的邊。
3.對(duì)于任何沒(méi)有進(jìn)入邊的非根x節(jié)點(diǎn)v∈G,一個(gè)“后代”邊被從Root 801添加到v。由于T 700中的從W 706到Z708的邊被重新標(biāo)記為“后代”,Z 708現(xiàn)在沒(méi)有進(jìn)入邊,因此,在圖8中,一個(gè)邊從Root 801添加到Z 808,現(xiàn)在使Z 808成為Root 801的后代。
值得注意的是,XDAG 800是一個(gè)有向非循環(huán)圖。對(duì)于使用反向軸的XPath表達(dá)式,上述方法將始終生成有向非循環(huán)圖,而不是樹(shù)。
我們使用基于匹配的概念在XTree上定義的XPath表達(dá)式的交替語(yǔ)義。此語(yǔ)義相當(dāng)于XPath 1.0規(guī)范中提供的語(yǔ)義。匹配結(jié)構(gòu)的構(gòu)建,匹配的緊密表示是該算法的主要目標(biāo)。我們?cè)诒竟?jié)描述了這些概念。
圖9-匹配結(jié)構(gòu)此方法通過(guò)對(duì)輸入表達(dá)式211的XTree和XDAG視圖進(jìn)行操作來(lái)在基于事件的分析器生成事件時(shí)處理事件。我們?cè)谶@里將輸入XPath表達(dá)式211稱(chēng)為“有限制的XPath”或Rxp。在對(duì)文檔處理結(jié)束時(shí),Rxp表達(dá)式的結(jié)果以M編碼。為提高效率,此方法過(guò)濾掉不對(duì)任何匹配起作用的事件。只處理相關(guān)的事件以生成匹配-結(jié)構(gòu)。我們將在本節(jié)描述這些步驟。附錄B中提供了圖7A的Rxp和圖1的文檔100的算法的過(guò)程。
假設(shè)v1和v2是由邊e連接的XTree T中的兩個(gè)x節(jié)點(diǎn),假設(shè)d1和d2是文檔D中的兩個(gè)元素。如果d1和d2滿足關(guān)系axis(e),我們說(shuō)(v1,d1)與(v2,d2)一致(相對(duì)于XTree T和文檔D)。例如,如果v1和v2由標(biāo)記為“祖先”的邊連接,那么d2必須是D中的d1的祖先。匹配mVT→VD是從XTree T的x節(jié)點(diǎn)到文檔D的元素的部分映射,以便下列條件成立1.對(duì)于所有x節(jié)點(diǎn)v∈domain(m),label(v)=tag(m(v)),即,所有映射的頂點(diǎn)都滿足NodeTest。
2.對(duì)于所有由T中的一個(gè)邊連接的x節(jié)點(diǎn)v1和v2,以便v1,v2∈domain(m),(v1m(v1)與(v2,,n(v2))一致。
一個(gè)匹配位于x節(jié)點(diǎn)v,當(dāng)且僅當(dāng)其域包含在根在v的子樹(shù)中。如果其域包含根在v的子樹(shù)的所有頂點(diǎn),則在v的匹配是總匹配。不難證明,當(dāng)且僅當(dāng)在r的XTree T的根處有一個(gè)總匹配,其中T的輸出x節(jié)點(diǎn)映射到n,文檔元素n位于Rvp r的結(jié)果中。此方法用這樣的方式準(zhǔn)確地計(jì)算由Rxp定義的結(jié)果。它找到了從VT到VD的所有匹配,并發(fā)送對(duì)應(yīng)于輸出x節(jié)點(diǎn)的文檔元素。
該算法構(gòu)建了一個(gè)叫做匹配-結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)是相對(duì)于輸入文檔207的Rxp的根處的所有總匹配。一個(gè)匹配-結(jié)構(gòu)Mv,e與x節(jié)點(diǎn)v關(guān)聯(lián),并表示v處的匹配集,其中v映射到文檔元素e。匹配-結(jié)構(gòu)Mv,e另外還包含XTree中的v的每個(gè)子的子匹配。v的子w的子匹配是w處的匹配結(jié)構(gòu)集(可能是空的)。對(duì)于w處的Mv,e的子匹配中的任何匹配-結(jié)構(gòu)Mv,e,我們要求(v,e)與(w,e′)一致。如果v是XTree T中的w的父,并且(v,e)與(w,e′)一致,則就可以說(shuō)匹配-結(jié)構(gòu)Mv,e是匹配-結(jié)構(gòu)Mw,e的父匹配。如果Mw,e是Mv,e的父匹配,那么我們還說(shuō),Mw,e是Mv,e的子-匹配。圖9顯示了在圖1中的文檔100上的圖7A的XPath處理結(jié)束時(shí)的匹配結(jié)構(gòu),以及根801處的四個(gè)總匹配。圖9中的方框表示匹配結(jié)構(gòu)。對(duì)于匹配-結(jié)構(gòu)Mv,e,方框的頂部顯示了(v,id(e))。方框的下半?yún)^(qū)中的每個(gè)插槽都對(duì)應(yīng)于一個(gè)子匹配,該子匹配表示為指向子匹配的指針的列表。進(jìn)行W投影所獲得的結(jié)果,即{W6,4,W7,5}Total Matchinas at Root[Root→0,Z→3,Y→2,U→8,V→4,W→6][Root→0,Z→3,Y→2,U→8,V→4,W→7][Root→0,Z→3,Y→2,U→8,V→5,W→6][Root→0,Z→3,Y→2,U→8,V→5,W→7]Solution{W6,4,.W7,5}過(guò)濾事件在執(zhí)行過(guò)程中的任一點(diǎn),算法都處理輸入文檔207的前綴。無(wú)限數(shù)量的XML文檔共享同一個(gè)前綴,因此,無(wú)法預(yù)測(cè)將由分析器生成的未來(lái)的事件序列。如果有一些文檔完成,其中e參與匹配,則元素e是相關(guān)的。所有相關(guān)的元素都必須得到處理。隨著對(duì)元素進(jìn)行處理,可能會(huì)看見(jiàn)新的相關(guān)元素,或者,早先被認(rèn)為是相關(guān)的元素可能不再相關(guān)。使用Rxp的XDAG表示來(lái)判斷元素是否相關(guān)。
與任何x節(jié)點(diǎn)都不匹配的元素是不相關(guān)的,因?yàn)樗荒軈⑴c任何匹配。這些元素將被丟棄。假設(shè)open元素是我們看作開(kāi)始元素事件,而不是結(jié)束元素事件的那些元素。由于生成事件的方式是深度優(yōu)先方式,在匹配x節(jié)點(diǎn)v的開(kāi)始元素事件,open元素是文檔中的e的祖先。如果對(duì)于XDAG中的v的v′的一些父,沒(méi)有open相關(guān)元素e′,以便(v,e)和(v′,e′)是一致的,那么,e無(wú)法相關(guān)。沒(méi)有分析器可以生成的其中該約束將成真的事件序列,因此,e不對(duì)任何匹配起作用。對(duì)于圖8中的XDAG,沒(méi)有匹配W的元素將是相關(guān)的,除非有匹配Y和Z的open相關(guān)元素。
在每一步驟,我們維護(hù)了一個(gè)定位集L,該集可使我們?cè)u(píng)估與下一個(gè)開(kāi)始元素事件關(guān)聯(lián)的元素是否相關(guān)。L的成員是(v∈Vp,,level)對(duì),其中l(wèi)evel可能是整數(shù)或*。當(dāng)且僅當(dāng)有(v,level)∈L,label(v)=tag(e),并且(level=level(e)or level=*)時(shí),與開(kāi)始元素事件關(guān)聯(lián)的元素e才是關(guān)聯(lián)的。整數(shù)級(jí)別用于強(qiáng)制約束,如果(v,e)和(,v′e′)是一致的并且如果axis(v,v′)=child,那么level(v′)=1+level(v)。
我們從現(xiàn)在開(kāi)始假設(shè),對(duì)應(yīng)于不相關(guān)的元素的所有事件都已經(jīng)被丟棄。當(dāng)此算法處理匹配x節(jié)點(diǎn)v的元素e的開(kāi)始元素事件時(shí),它創(chuàng)建一個(gè)匹配-結(jié)構(gòu)Mv,e來(lái)表示該匹配。請(qǐng)注意,e可能匹配XTree 700中的一個(gè)以上的x節(jié)點(diǎn);并為每個(gè)這樣的匹配創(chuàng)建一個(gè)匹配-結(jié)構(gòu)。這些匹配-結(jié)構(gòu)的子匹配最初是空的。算法將這些匹配-結(jié)構(gòu)縫合在一起,以便當(dāng)看見(jiàn)文檔的結(jié)尾時(shí),MRoot,Root對(duì)文檔中的根處的所有總匹配進(jìn)行編碼。
此過(guò)程中的關(guān)鍵步驟是傳播。在匹配x節(jié)點(diǎn)v的元素e的結(jié)束元素事件,我們?cè)噲D判斷Mv,e是否表示v處的總匹配。如果有總匹配,我們將Mv,e插入到其父-匹配的相應(yīng)的子匹配。此傳播可能是樂(lè)觀的,因?yàn)殡S著處理更多的事件,一個(gè)人可能必須撤消傳播。然而,讓我們首先假設(shè)一個(gè)當(dāng)XTree 700不包含標(biāo)記為“祖先”或“父”時(shí)沒(méi)有必要清除傳播的比較簡(jiǎn)單的情況。這對(duì)應(yīng)于只使用子和后代軸的Rxps,即,沒(méi)有任何反向軸。
當(dāng)XTree 700只包含child和descendant約束時(shí),v處的任何總匹配m,其中m(v)=e將v的子樹(shù)中的所有x節(jié)點(diǎn)映射到位于e的文檔子樹(shù)中的元素。由于總匹配包含在e的子樹(shù)內(nèi),等到看見(jiàn)e的結(jié)束元素事件時(shí),我們可以確定地判斷Mv,e是否表示v處的總匹配。這自然導(dǎo)致生成匹配的一個(gè)歸納法。對(duì)于結(jié)束元素事件e,其中Mv,e是匹配-結(jié)構(gòu)1.如果v是XTree 700中的葉,我們通過(guò)定義(v沒(méi)有子樹(shù))表示v處的總匹配。我們將Mv,e傳播到相應(yīng)的父匹配。
2.如果v不是葉,則當(dāng)且僅當(dāng)所有子匹配是非空時(shí),Mv,e表示v處的總匹配。否則,沒(méi)有總匹配存在。如果我們找到XTree中的v的每個(gè)子的相應(yīng)的總匹配,則等到處理e的結(jié)束元素事件時(shí)它們將被傳播到Mv,e。如上,如果Mv,e表示總匹配,則我們將它傳播到所有相應(yīng)的父-匹配。
如果在處理文檔207結(jié)束時(shí)(當(dāng)我們接收到根的結(jié)束元素時(shí)),算法發(fā)現(xiàn)Mroot,root的所有子匹配都是非空,則我們?cè)诟幘哂锌偲ヅ洹?br>
XTree 700中的祖先和父邊的存在使此處理復(fù)雜化,因?yàn)橐粋€(gè)人不能確定地判斷到元素e結(jié)束之時(shí)是否存在Mv,e的總匹配。例如在圖7B中,一個(gè)人可能在看到匹配W的元素的結(jié)束事件之前找不到根在Z的子樹(shù)的總匹配。傳播過(guò)程保持一樣,只是具有標(biāo)記為祖先或父的進(jìn)入或外出邊不同。修改的步驟如下所示1.如果有標(biāo)記為祖先或父的外出邊(v,v′),并且v′的子匹配是空的,我們不能斷言,在v處沒(méi)有總匹配。我們樂(lè)觀地將每個(gè)子-匹配Mv′,e′傳播到Mv,e的相應(yīng)的子匹配。然后如以前一樣進(jìn)行。如果滿足所有子匹配,則Mv,e傳播到其父-匹配。
2.如果有標(biāo)記為祖先或父的進(jìn)入邊(v′,v),那么,Mv,e可能被樂(lè)觀地傳播到其父-匹配。如果我們可以確定地判斷,Mv,e不能表示v處的總匹配,我們撤消Mv,e的傳播。從父-匹配Mv′,e′的子匹配刪除Mv,e可能導(dǎo)致子匹配變空-Mv′,e′不再是v′處的總匹配。然后我們遞歸地從其父-匹配撤消Mv′,e′的傳播。
在處理文檔207結(jié)束時(shí),如果MRoot,Root的子匹配都是非空的,我們?cè)诟幹辽儆幸粋€(gè)總匹配。當(dāng)我們?cè)L問(wèn)Mv,e時(shí),其中v是Rxp的輸出x節(jié)點(diǎn),通過(guò)遍歷圖9所示的匹配結(jié)構(gòu)900,并發(fā)送元素e來(lái)發(fā)送輸出。例如,在圖9中,當(dāng)我們首先訪問(wèn)Mw,6時(shí),我們輸出W6,4,當(dāng)我們首先訪問(wèn)Mw,7時(shí),輸出Mw,7。
我們就存儲(chǔ)所有匹配,隨后,遍歷匹配結(jié)構(gòu)以發(fā)出元素來(lái)描述了此算法。然而,我們不必為XTree中的許多x節(jié)點(diǎn)生成匹配結(jié)構(gòu)。例如,如果XTree包含不包含輸出節(jié)點(diǎn)的子樹(shù),那么,就不必為該子樹(shù)中的節(jié)點(diǎn)存儲(chǔ)匹配結(jié)構(gòu)。存儲(chǔ)關(guān)于在該子樹(shù)中是否存在總匹配的布爾值就足夠了。此外,常常也不必等到文檔的結(jié)尾才發(fā)送輸出。元素可以更渴望地發(fā)出。
XPath表達(dá)式的應(yīng)用于數(shù)據(jù)庫(kù)的一個(gè)擴(kuò)展是,在一個(gè)XPath中允許有一個(gè)以上輸出節(jié)點(diǎn)。如果我們使用“$”來(lái)標(biāo)記輸出節(jié)點(diǎn),擴(kuò)展的XPath表達(dá)式,//$a/$b返回一個(gè)輸入文檔中的所有(a,b)對(duì),以便a是b的父。我們的匹配結(jié)構(gòu)容易產(chǎn)生這些字節(jié)組-只有更改位于輸出遍歷中。
或者可以通過(guò)將XPath表達(dá)式轉(zhuǎn)換為“析取范式”的等效表達(dá)式來(lái)對(duì)表達(dá)式進(jìn)行處理。算法可以在最高級(jí)別的每個(gè)操作數(shù)上運(yùn)行,或者獨(dú)立地運(yùn)行。雖然此處理可能是XPath表達(dá)式的大小的指數(shù),但是我們不認(rèn)為這是問(wèn)題,因?yàn)閄Path表達(dá)式一般來(lái)說(shuō)是比較小的。
圖10-信息處理系統(tǒng)圖10是被配置為根據(jù)本發(fā)明的一個(gè)實(shí)施例進(jìn)行操作的信息處理系統(tǒng)1000的簡(jiǎn)化方框圖。系統(tǒng)1000包括輸入/輸出(I/O)接口1060,用于接收包括搜索條件的查詢。條件包括一組指定節(jié)點(diǎn)之間的正向和反向關(guān)系的約束。I/O接口1060進(jìn)一步用于接收至少一部分文檔,如XML文檔207(例如,通過(guò)包括XML閱讀器)。系統(tǒng)1000進(jìn)一步包括用于通過(guò)將指定反向關(guān)系的約束重新表述為指定正向關(guān)系的約束來(lái)修改搜索條件的邏輯;用于創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)的邏輯;和用于定位滿足搜索條件的一個(gè)或多個(gè)節(jié)點(diǎn)的邏輯。此邏輯可以作為存儲(chǔ)在大容量存儲(chǔ)設(shè)備1030或諸如磁盤(pán)1040或CD ROM1050之類(lèi)的介質(zhì)中的程序指令來(lái)實(shí)現(xiàn),以便由系統(tǒng)處理器1010從從存儲(chǔ)器1020進(jìn)行處理。系統(tǒng)1000只是根據(jù)本發(fā)明的執(zhí)行方法和算法的一個(gè)可能實(shí)施方式。那些精通數(shù)據(jù)處理技術(shù)的人將理解,在不脫離本發(fā)明的精神的情況下,其他實(shí)施方式也是可以的。
結(jié)束語(yǔ)和范圍此方法是以流式XPath處理正向和反向軸的新穎的算法。此處理流式XPath表達(dá)式的方法的優(yōu)點(diǎn)是它只須存儲(chǔ)文檔的相關(guān)部分,因此,它節(jié)省了存儲(chǔ)器空間;它還節(jié)省了定位表達(dá)式的時(shí)間,因?yàn)槲臋n的部分只遍歷一次;以及,它還節(jié)省金錢(qián),因?yàn)橛捎谌缜八龅暮锰幪幚硭俣雀臁?br>
因此,雖然描述了目前被視為優(yōu)選實(shí)施例的情況,那些精通本技術(shù)的人將理解,在不脫離本發(fā)明的精神的情況下,可以進(jìn)行其他修改。
附錄A生成XTree的規(guī)則我們用帶標(biāo)記的頂點(diǎn)和邊T=(VT,ET)來(lái)將Rxp表達(dá)式表示為有根的樹(shù),叫做XTree,其中根被標(biāo)記為Root。對(duì)于表達(dá)式中的每一個(gè)NodeTest,在標(biāo)有NodeTest的XTree中都有一個(gè)x節(jié)點(diǎn)。每一個(gè)x節(jié)點(diǎn)(Root除外)有一個(gè)獨(dú)特的進(jìn)入邊,該邊標(biāo)有在NodeTest之前指定的Axis。其中一個(gè)x節(jié)點(diǎn)被指定為輸出x節(jié)點(diǎn)。有返回分別與x節(jié)點(diǎn)和邊關(guān)聯(lián)的標(biāo)記的函數(shù)labelVT→String,and axisET→{ancestor,parent,child,descendant}。還為RelLocationPath定義了類(lèi)似于XTree的結(jié)構(gòu)。我們將此結(jié)構(gòu)叫做x林,因?yàn)樗蓛蓚€(gè)有根樹(shù)構(gòu)成,一個(gè)樹(shù)的根位于Root,另一個(gè)樹(shù)的根位于標(biāo)記為context的特殊x節(jié)點(diǎn),它類(lèi)似于Root,沒(méi)有進(jìn)入邊。對(duì)應(yīng)于PredicateExpr的結(jié)構(gòu)可以是XTree或x林,但沒(méi)有一個(gè)x節(jié)點(diǎn)被指定為輸出x節(jié)點(diǎn)。
可以歸納地(基于Rxp的結(jié)構(gòu))使用下列規(guī)則來(lái)從Rxp生成XTree。
Step∷=Axis∷NodeTest Step的x林包含三個(gè)標(biāo)記為Root、context和NodeTest(指定為輸出節(jié)點(diǎn))的x節(jié)點(diǎn),從context到NodeTest的邊被標(biāo)記為Axis。
Step∷=Step1′[′PredicateExp′]′讓T1來(lái)評(píng)估從Step1產(chǎn)生的x林,T2引用從PredicateExpr產(chǎn)生的x林或XTree。Step的x林是通過(guò)將T1的輸出x節(jié)點(diǎn)與T2(如果有的話)的context x節(jié)點(diǎn)合并以及將T1和T2的Root x節(jié)點(diǎn)合并獲得的。T1的輸出x節(jié)點(diǎn)被指定為結(jié)果x林的輸出x節(jié)點(diǎn)。
RelLocationPath∷=Step′[′RelLocationPath′]′讓T1和T2分別引用從Step和RelLocationPath獲得的x林。RelLocationPath的x林是通過(guò)將T1的輸出x節(jié)點(diǎn)與T2的context x節(jié)點(diǎn)合并,并將T1和T2的Root x節(jié)點(diǎn)合并,并將T2的輸出x節(jié)點(diǎn)指定為結(jié)果x林的輸出x節(jié)點(diǎn)來(lái)獲得的。
PredicateExp∷=RelLocationPath and PredicateExpr,讓T1引用從RelLocationPath獲得的x林,T2引用從PredicateExpr1獲得的XTree或x林。PredicateExpr的x林是通過(guò)將T1的context與T2(如果有的話)的context合并以及將T1和T2的Root合并獲得的。沒(méi)有一個(gè)x節(jié)點(diǎn)被指定為輸出頂點(diǎn)。
PredicateExpr∷=AbsLocationPath and PredicateExpr1,;類(lèi)似于前面的情況。
AbsLocationPath∷=′[′RelLocationPath′]′XTree是通過(guò)將從RelLocationPath獲得的x林的Root和context x節(jié)點(diǎn)獲得的。
附錄B
權(quán)利要求
1.一種用于處理文檔的方法,其特征在于,文檔包括樹(shù)結(jié)構(gòu),樹(shù)結(jié)構(gòu)又包括許多分支,分支又包括許多節(jié)點(diǎn),該方法包括下列步驟接收包括搜索條件的查詢,其中,該條件包括一組約束,這些約束指定節(jié)點(diǎn)之間的關(guān)系,其中,任何兩個(gè)節(jié)點(diǎn)之間的關(guān)系可以是正向關(guān)系,也可以是反向關(guān)系,以便在約束集中指定的關(guān)系可以是正向關(guān)系、反向關(guān)系或者兩者都是;接收至少一部分文檔;修改搜索條件,以便指定反向關(guān)系的約束可以重新表述為指定正向關(guān)系的約束,或者指定正向關(guān)系的約束可以重新表述為指定反向關(guān)系的約束;使用修改的條件處理文檔;以及定位滿足搜索條件的一個(gè)或多個(gè)節(jié)點(diǎn)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,文檔是一個(gè)XML文檔。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,修改搜索條件的步驟包括生成新條件。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,處理步驟包括創(chuàng)建查詢的圖形表示。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,處理步驟包括創(chuàng)建至少一部分文檔的樹(shù)狀表示。
6.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括生成只包括那些與搜索條件有關(guān)的節(jié)點(diǎn)的匹配結(jié)構(gòu)。
7.根據(jù)權(quán)利要求6所述的方法,進(jìn)一步包括生成匹配結(jié)構(gòu),以便結(jié)構(gòu)從根節(jié)點(diǎn)開(kāi)始。
8.根據(jù)權(quán)利要求5所述的方法,進(jìn)一步包括過(guò)濾文檔以排除與搜索條件不匹配的任何節(jié)點(diǎn)。
9.根據(jù)權(quán)利要求1所述的方法,其特征在于,所處理的至少一部分文檔包括的內(nèi)容小于整個(gè)文檔。
10.根據(jù)權(quán)利要求2所述的方法,其特征在于,查詢包括至少一個(gè)XPath表達(dá)式。
11.根據(jù)權(quán)利要求1所述的方法,其特征在于,文檔是一個(gè)無(wú)限的文檔。
12.根據(jù)權(quán)利要求1所述的方法,其特征在于,定位滿足搜索條件的節(jié)點(diǎn)的步驟進(jìn)一步包括將該節(jié)點(diǎn)作為輸出發(fā)送。
13.根據(jù)權(quán)利要求1所述的方法,其特征在于,約束指定節(jié)點(diǎn)之間的關(guān)系,關(guān)系包括父子關(guān)系。
14.根據(jù)權(quán)利要求1所述的方法,其特征在于,約束指定節(jié)點(diǎn)之間的關(guān)系,關(guān)系包括祖先和后代關(guān)系。
15.一種用于處理文檔的系統(tǒng),其特征在于,文檔包括樹(shù)結(jié)構(gòu),樹(shù)結(jié)構(gòu)又包括許多分支,分支又包括許多節(jié)點(diǎn),該系統(tǒng)包括一個(gè)用于接收包括搜索條件的查詢的輸入端,其中,該條件包括一組約束,這些約束指定節(jié)點(diǎn)之間的關(guān)系,其中,任何兩個(gè)節(jié)點(diǎn)之間的關(guān)系可以是正向關(guān)系,也可以是反向關(guān)系,以便在約束集中指定的關(guān)系可以是正向關(guān)系、反向關(guān)系或者兩者都是;一個(gè)用于接收至少一部分文檔的輸入端;用于修改搜索條件的邏輯,以便指定反向關(guān)系的約束可以重新表述為指定正向關(guān)系的約束,或者指定正向關(guān)系的約束可以重新表述為指定反向關(guān)系的約束;用于使用修改的條件處理文檔的處理器;以及用于定位滿足搜索條件的一個(gè)或多個(gè)節(jié)點(diǎn)的邏輯。
16.根據(jù)權(quán)利要求15所述的系統(tǒng),其特征在于,文檔是一個(gè)XML文檔。
17.根據(jù)權(quán)利要求15所述的系統(tǒng),其特征在于,用于修改搜索條件的邏輯進(jìn)一步包括生成新條件。
18.根據(jù)權(quán)利要求15所述的系統(tǒng),其特征在于,用于處理文檔的處理器進(jìn)一步包括用于創(chuàng)建查詢的圖形表示的邏輯。
19.根據(jù)權(quán)利要求15所述的系統(tǒng),其特征在于,用于處理的邏輯包括創(chuàng)建至少一部分文檔的樹(shù)狀表示。
20.一種包括用于處理文檔的程序指令的計(jì)算機(jī)可使用的介質(zhì),其特征在于,文檔包括樹(shù)結(jié)構(gòu),樹(shù)結(jié)構(gòu)又包括許多分支,分支又包括許多節(jié)點(diǎn),介質(zhì)包括用于執(zhí)行下列步驟的指令接收包括搜索條件的查詢,其中,該條件包括一組約束,這些約束指定節(jié)點(diǎn)之間的關(guān)系,其中,任何兩個(gè)節(jié)點(diǎn)之間的關(guān)系可以是正向關(guān)系,也可以是反向關(guān)系,以便在約束集中指定的關(guān)系可以是正向關(guān)系、反向關(guān)系或者兩者都是;接收至少一部分文檔;修改搜索條件,以便指定反向關(guān)系的約束可以重新表述為指定正向關(guān)系的約束,或者指定正向關(guān)系的約束可以重新表述為指定反向關(guān)系的約束;使用修改的條件處理文檔;以及定位滿足搜索條件的一個(gè)或多個(gè)節(jié)點(diǎn)。
全文摘要
一種用于處理諸如XML文檔的文檔的系統(tǒng)和方法,其特征在于,該方法包括下列步驟接收包括搜索條件的查詢;接收至少一部分文檔;修改搜索條件,以便指定反向關(guān)系的約束可以重新表述為指定正向關(guān)系的約束;使用修改的條件處理文檔;以及定位滿足搜索條件的一個(gè)或多個(gè)節(jié)點(diǎn);以及作為輸出發(fā)送所選節(jié)點(diǎn)。
文檔編號(hào)G06F7/00GK1497474SQ0315984
公開(kāi)日2004年5月19日 申請(qǐng)日期2003年9月26日 優(yōu)先權(quán)日2002年10月3日
發(fā)明者查爾斯·巴頓, 查爾斯 巴頓, 查爾斯, 飛利浦·查爾斯, 格瑤, 蒂帕克·格瑤, 瑞格哈瓦查瑞, 穆康德·瑞格哈瓦查瑞 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司