用于文檔的xml數據存儲的可編程性的制作方法

            文檔序號:6568870閱讀:254來源:國知局
            專利名稱:用于文檔的xml數據存儲的可編程性的制作方法
            用于文檔的XML數據存儲的可編程性背景技術計算機用戶己經逐漸習慣于用戶友好的軟件應用程序,它們幫助用戶寫、計 算、組織、準備演示、發送與接收電子郵件、制作音樂等等。例如,字處理應用程 序允許用戶準備各種有用的文檔。電子表格應用程序允許用戶輸入、操縱和組織數 據。幻燈片演示應用程序允許用戶創建包含文本、圖片、數據或其它有用對象的幻 燈片演示。然而,由這類應用程序創建的文檔(例如,字處理文檔、電子表格、幻燈片 演示文檔)在存儲/傳輸文檔上下文所需要的任意元數據內容方面功能有限。例如, 建立在字處理文檔之上的解決方案可能要求存儲描述文檔各種狀態的工作流數據,' 例如,先前的工作流核準狀態(日期、時間、名稱)、當前核準狀態、完成前的未 來工作流狀態、文檔作者的名稱和辦公地址、文檔變化,等等。存儲該信息的選項 主要限于對文檔變量或具有限制的現有定制對象鏈接和嵌入(OLE)文檔性質的使 用。例如,不能存儲分層數據;字符長度有限,等等。有關這類方法的性質存儲在 單個存儲中,例如OLE性質存儲器,這意味著這些性質具有沖突的可能性。而且, 這樣存儲的性質沒有數據驗證。這類應用程序及有關文檔的用戶難以將任意數據與 文檔存儲在一起,而這卻是許多用戶的共同需求。發明內容提供本概述以便以簡化形式介紹精選的概念,這些概念將在以下的詳細描述 中被進一步描述。本概述并不旨在標識要求保護的主題的關鍵特征或本質特征,也 不旨在用于幫助確定要求保護的主題的范圍。將一或多個數據存儲與文檔內主呈現存儲(primary presentation storage)分開 地保存,從而存儲、關聯并允許使用與計算機生成文檔相關聯的任意數據。用于結 構化與文檔相關聯的信息的數據,諸如文檔元數據,被保存在一數據存儲中,其中 保存著不同數據片之間的關系。該數據存儲向數據存儲中的各種數據片暴露應用編 程接口 (API),從而允許不同應用程序訪問和操作一或多個數據片。這些數據片可按照標記語言如可擴展標記語言(XML)來結構化。XML模式 可與每一數據片相關聯,并且數據存儲器可基于與給定數據片相關聯的XML模式 來驗證應用于該數據的XML結構。當文檔正在編輯的同時,提供對XML形式數 據的程序性訪問。多個客戶應用程序可訪問和編輯同一文檔數據片,并且解決對一 給定數據片的任何有沖突的改變。標準XML模式(XSD)也可用于定義任何與文 檔元數據相關聯的定制XML數據片的內容,以保證應用于文檔數據的XML數據 是有效的。


            圖1例示計算機的示例性計算體系結構;以及圖2是例示一或多個客戶應用與一或多個數據存儲之間的關系以及數據存儲 的內容的框圖;圖3例示示出內部和外部數據消費者與XML數據存儲之間交互的系統圖;圖4例示用于處理與數據存儲相關聯的各事件的過程;以及圖5例示根據本發明的諸方面用于處理包括副效應(side-effect)的事件的過具體實施方式
            現在參考其中相似的數字代表相似的元素的附圖,描述本發明的各種方面。 具體地,圖1和相應的討論旨在提供對在其中可以實現本發明實施例的合適計算環 境的簡要描述。一般而言,程序模塊包括例程、程序、組件、數據結構和其它類型的結構, 它們執行特定的任務或者實現特定的抽象數據類型。也可使用其它計算機系統配 置,包括手持式設備、多處理器系統、基于微處理器或可編程消費電子產品、小型 機、大型機等等。也可使用分布式計算環境,其中任務由通過通信網絡鏈接的遠程 處理設備執行。在分布式計算環境中,程序模塊可位于本地和遠程兩者的存儲器存 儲設備中。參見圖1,用于實現本發明的一個示例性系統包括計算設備,諸如計算設備 100。在一個非常基本的配置中,計算設備100通常包括至少一個處理單元102和 系統存儲器104。取決于計算設備的確切配置和類型,系統存儲器104可以是易失 性的(諸如RAM)、非易失性的(諸如ROM、閃存等)或是兩者的某種組合。系統存儲器104通常包括操作系統105、 一個或多個應用程序104,并且可以包括 程序數據107。在一個實施例中,應用程序106可以包括字處理程序120。這一基 本配置在圖1中由虛線108中的那些組件示出。計算設備100也可具有其它特征或功能性。例如,計算設備100也可含有附 加的數據存儲設備(可移動和/或不可移動),諸如磁盤、光盤或磁帶。這樣的額 外存儲在圖1中由可移動存儲109和不可移動存儲110示出。計算機存儲介質可包 括易失性和非易失性、可移動和不可移動介質,它們以用于存儲諸如計算機可讀指 令、數據結構、程序模塊或其它數據這樣的信息的任意方法或技術來實現。系統存 儲器104、可移動存儲109和不可移動存儲110都是計算機存儲介質的示例。計算 機存儲介質包括,但不限于,RAM、 ROM、 EEPROM、閃存或其它存儲器技術、 CD-ROM、數字多功能盤(DVD)或其它光存儲、磁帶盒、磁帶、磁盤存儲或其 它磁性存儲設備、或能用于存儲所需信息且可以由計算設備100訪問的任何其它介 質。任何這樣的計算機存儲介質都可以是設備100的一部分。計算設備100也可以 具有諸如鍵盤、鼠標、筆、語音輸入設備、觸摸輸入設備等輸入設備112。也可以 包括諸如顯示器、揚聲器、打印機等的輸出設備114。這些設備在本領域是公知的, 因此不必在此詳細討論。計算設備100也可以包含允許該系統與其它計算設備118諸如經網絡通信的 通信連接116。通信連接116是通信介質的一個示例。通信介質通常可具體化為諸 如載波或其它傳輸機制等已調制數據信號中的計算機可讀指令、數據結構、程序模 塊或其它數據,并且包括任何信息傳遞介質。術語已調制的數據信號是指以在該信 號中編碼信息的方式來設置或改變其一個或多個特性的信號。作為示例,而非限制, 通信介質包括有線介質,諸如有線網絡或直接線連接,以及無線介質,諸如聲學、 RF、紅外線和其它無線介質。如此處所用的術語計算機可讀介質既包括存儲介質 又包括通信介質。可在計算設備100的系統存儲器104中存儲多個程序模塊和數據文件,包括 適于控制聯網個人計算機操作的操作系統105,諸如來自華盛頓雷德蒙德的微軟公 司的Windows操作系統。系統存儲器104也可存儲一或多個程序模塊,諸如字處 理應用120以及下述的其它應用。字處理應用120用于提供創建、編輯和處理電子 文檔的功能性。根據本發明的一個實施例,字處理應用120包括來自微軟公司的WORD程序。 然而應該了解,可利用來自其它制造者的字處理應用程序。字處理應用的例示僅為了示例,而非不限制可產生并操作文檔的其它類型的應用。例如,可以等效地應用能處理各種形式內容(例如,文本、圖像、圖片等)的其它應用程序106,諸如電 子表格應用程序,數據庫應用程序,幻燈片演示應用程序,畫圖或計算機輔助應用 程序等等。產生并操作各種不同類型文檔的示例應用程序106包括來自微軟公司的OFFICE 。實施例可實現為計算機過程、計算系統、或者制造品,如計算機程序產品或 計算機可讀介質。計算機程序產品可以是計算機系統可讀且對指令的計算機程序進行編碼以執行計算機過程的計算機存儲介質。計算機程序產品也可以是計算系統可 讀的且對指令計算機程序進行編碼以執行計算機過程的載波傳播信號。在通篇說明書和權利要求書中,下列術語采用與此處相關聯的含義,除非該 術語的上下文另有指示。術語"數據"指文檔表面層或者呈現層信息,諸如字詞、語句、段落等等, 以及由字處理文檔攜帶、引用或使用的補充信息,例如元數據。該信息通常較大且 有可能沒有暴露于文檔的呈現層。術語"呈現"指文檔的可見部分,諸如打印文檔時會出現的文本和布局等。術語"標簽"指插入文檔中描述XML文檔內元素的字符。每個元素一般包括兩個標簽開始標簽和結束標簽。也有可能具有空元素(沒有內容),在此情形中允許一個標簽。術語"標記語言"或"ML"指用于文檔內特殊代碼的語言,用于規定文檔的 諸部分如何由應用程序來解釋。在字處理文件中,標記語言規定文本被如何格式化 或布局。術語"元素"指XML文檔的基本單元。元素可包含屬性、其它元素、文本和 用于XML文檔的其它內容區域。術語"構件"指文檔中被綁定且有可能加有標簽的區域,它用作用戶輸入的 特定類型內容的容器。術語"數據綁定,數據映射和數據域"指構件上的性質,它確定指向存儲在 文檔中的XMLDOM的XPath,其中應當存儲該構件的內容。在標簽之間的XML內容被認為是該元素的"子"(或后代)。因此,嵌入在 元素的內容中的其它元素稱為"子元素"或"子節點"或者元素。直接嵌入在元素 內容中的文本被認為是該元素的"子文本節點"。元素內的子元素與文本一起構成 元素的"內容"。術語"屬性"指設置為特定值且與元素相關聯的附加性質。元素可具有任意 數量的與其相關聯的屬性設置,包括一個也沒有。屬性用于將附加信息與將不再包 含其它元素或者作為文本節點來對待的元素相關聯。"XPath"是運算符,它使用模式表達式(pattern expression)來標識XML文檔 中的節點。XPath模式是用斜杠分開的子元素名稱列表,它描述到通過XML文檔 的路徑。模式"選擇"匹配該路徑的元素。術語"XML數據存儲或數據存儲"指諸如字處理文檔,電子表格文檔,幻燈 片演示文檔等的文檔內的容器,它在文件打開時提供對存儲在該文檔中的數據(例 如XML格式)的存儲和修改的訪問。下面參考圖2提供XML數據存儲的進一步定義。。圖2是例示一或多個客戶應用程序與一或多個數據存儲之間的關系以及數據 存儲中的內容的框圖。 一般而言,在將一或多個數據存儲與文檔內主呈現存儲分開 保存,以存儲、關聯并允許使用與計算機生成文檔相關聯的任意數據。用于結構化 與文檔相關聯的信息的數據,諸如文檔元數據,被保存在其中保存不同數據片之間 的關系的一個數據存儲中。數據存儲向數據存儲中的各種數據片暴露應用程序編程 接口 (API),以允許不同應用訪問和操作一或多個數據片。如在此使用的,術語 "數據消費者"、"應用"和"過程"能互換地使用,除非上下文另有明確指示。數據片可按照標記語言如可擴展標記語言(XML)來結構化。XML模式可與 每一數據片相關聯,并且數據存儲可基于與給定數據片相關聯的XML模式來驗證 應用于數據的XML結構。數據存儲可包含根據可擴展標記語言(XML)結構化的 任何數量的任何數據項,例如元數據。因此,文檔解決方案提供者可將任意元數據 作為XML與給定文檔存儲在一起,并且讓該信息在發生事件時由有權訪問數據的 給定解決方案來處理,諸如當數據從數據存儲中移除或被加載到數據存儲時和/或 當用戶打開/編輯/保存文檔時。當文檔正在被編輯時,還可提供對XML形式的數據的程序性訪問。根據一個 實施例,提供一種解決方案開發者熟悉的標準機制,通過該機制在打開文檔時能以 在程序上訪問和修改數據。該程序上的訪問模擬標準的XML接口。通過應用編程 接口為一或多個編輯客戶應用(例如,文檔編輯或創建應用和/或第三方應用插件 解決方案等等)提供對數據的程序性訪問。因此,多個客戶應用可訪問并編輯相同 的文檔數據片,并且解決任何對給定數據片的有沖突的改變。可對任何給定改變作 出"副效應"(例如,響應于將公司名稱設置為"Microsoft(微軟)",將股票代碼改為"MSFT")。此外,對數據的改變和任何相關聯的副效應可由數據存儲來"捆 綁",使得撤消一或多個改變將后退所有相關改變。這幫助減少對解決方案本身開 發的負擔,以確保當用戶例如通過壓下撤消命令從文檔表面啟動原始改變撤消時所 有的改變都得以后退。標準XML模式(XSD)也可用于定義與文檔元數據相關聯的任何定制XML 數據片的內容,以確保應用于該文檔數據的XML數據是有效的。這些模式可附連 到存儲在文檔中的XML數據的任何實例中,并且數據存儲將不允許會導致該數據 的XML結構變成無效(即,XML標簽與其內容相反)的任何對XML數據的改變。 這幫助確保解決方案開發者能將特定的XML元數據片附連到文檔,并且確保該 XML數據將根據相關聯的模式繼續在結構上保持"正確",無論哪個數據消費者 (例如,插件)修改該數據。現參考圖2,文檔數據220包括XML結構數據以及表示文檔的表面或呈現層 視圖的相關聯文檔數據。例如,文檔數據220可包括XML結構(例如,標題標簽, 正文標簽,結論標簽)以及字處理文檔、電子表格文檔、幻燈片演示文檔等的相關 聯的表面視圖數據(例如,字詞,語句,段落)。數據存儲208是文檔數據儲存庫,用于存儲一或多個與關聯于給定文檔的一 或多個類型的數據相關聯的結構化數據片。盡管僅示出一個數據存儲器,但可使用 不止一個數據存儲。元數據l 225 (結構化的數據項)可包括XML結構和用于關 聯于文檔的第一元數據片的相關聯數據。例如,元數據1 225可包括XML結構數 據(例如日期標簽,名稱標簽等),它們列出文檔作者,文檔創建日期,文檔最后 改變/保存日期等等。元數據2230 (結構化數據項)可包括XML結構數據(標簽) 以及表示關聯于文檔的第二元數據片的相關聯元數據。如應了解的,元數據1和元 數據2是為了示例,而非限制可保存在數據存儲208中關聯于給定文檔的大量不同 類型數據。例如,如在此所述的,任意數據可按有權訪問文檔數據的解決方案開發 者或用戶的需要,由一或多個軟件應用來結構化并添加到文檔。模式文件240、 245可選地可被附連到存儲在數據存儲208中的每一數據片, 用于指示與應用于每一數據片225、 230的可擴展標記語言(XML)相關聯的句法 和驗證規則。XML模式文件提供一種在XML環境中描述和驗證數據的方法。模 式文件陳述使用什么XML標記數據(包括元素和屬性)來描述XML文檔中的內 容,并且模式文件定義XML標記句法,包括每一元素所允許的位置,在元素內允 許什么類型的內容以及在哪些元素可出現在其它元素中。模式文件的使用確保文檔(或者在此情形中為單個的數據片)以一致且能預知的方式來結構化。模式文件240、 245可由用戶創建并且一般由相關聯的標記語言諸如XML來支持。該文檔的模式化通過在數據存儲層處拒絕違反給定模式文件的任何改變來允. 許數據存儲提供"保證"文檔的結構有效性的能力。按照一實施例,數據存儲208 使用模式驗證模塊260針對相關聯的模式文件驗證添加的XML結構或者對給定數 據片的改變。例如,如果文檔創建者或編輯者對給定數據片例如元數據1作出XML 結構上的改變,其中編輯者添加或移除給定的XML標簽,則數據存儲208將使用 模式驗證模塊針對相關聯的模式文件來檢查XML結構上的改變以確保改變的合法 性。如果改變不是有效的,則向編輯者產生一個錯誤。如所理解的,對應用于給定 數據片的XML結構的這種控制考慮了結構上的一致性和可預知性,這對于允許客 戶和第三方應用程序與相關聯數據交互尤為重要。數據存儲208提供可由客戶應用205 (例如,字處理應用,電子表格應用,幻 燈片演示應用等)以及第三方應用210、 215通過相應應用205、 210、 210的對象 模型(OM)訪問的一或多個應用編程接口 (API) 270。這些API允許客戶應用和 第三方應用將任何現有XML文件加載到給定文檔的數據存儲208,因而確保該數 據現在是文檔的一部分并且將在其生存期中在該文檔內傳播(例如,通過打開/編 輯/保存/重命名等)或者直到該數據從數據存儲中刪除為止。按照一個實施例,數 據存儲中的數據以其XML格式可用,甚至在給定數據片225、 230的源應用被關 閉或者不可用的情況下。即,給定數據片225、 230可由其它應用(并非源應用) 通過API 270來訪問。如下所述,API還允許客戶和第三方應用對應用于數據項225、 230的XML標記數據進行改變。一旦XML數據225、 230被加載到數據存儲中以便與文檔220相關聯,則可 使用數據存儲接口將其作為標準XML來操縱,其中數據存儲接口被設計為提供與 現有XML編輯接口相似的方法,以便利用開發者的XML編程標準的現有知識。 這允許用戶對添加到用于文檔的數據存儲的XML數據進行標準XML操作,諸如 添加元素和屬性,移除元素和屬性,改變現有元素/屬性的值,以及讀取相關聯XML 樹的任何現有部分的值。使用這些XML標準操作,解決方案可將結構化的復雜元 數據與文檔主題存儲在一起而沒有先前的對數據的長度/大小或數據的結構的限 制,這使得對該XML數據存儲的使用能夠用于比以前的解決方案更顯著地結構化 的解決方案。例如,可編寫第三方用215,它通過讀取添加到每一文檔的數據存儲 器208的元數據1 225,而從多個文檔定位和提取文檔作者名稱和文檔創建日期。示例的第三方可以是一個為作出由給定組織創建的所有文檔的文檔作者名稱和文 檔創建日期列表而編程的應用。按照本發明的實施例,第三方應用可使用應用于元數據1的XML結構來有效地定位和提取所需數據。例如,可編寫第三方應用來語 法分析元數據1文件的XML結構以定位XML標簽,諸如〈docauthor〉和 <doccreationdate>,用于獲得和使用關聯于這些標簽的數據。如應了解的,上述內 容僅是一或多個應用可通過數據存儲208與關聯于文檔的結構化數據交互的許多 方法中的一個示例。此外,數據存儲器208提供任意數量的API接口 270給任何單獨的XML數據 片220、 225、 230 (也稱為存儲項),以使多個應用205、 210、 215能夠與同一數 據片一寧工作。例如,若干解決方案,諸如客戶應用(例如字處理應用)和第三方 應用解決方案(例如上述應用),可與同一組文檔性質(例如包含在元數據2 230 文件中的性質) 一起工作。使用數據存儲208,這些應用的每一個通過其自己的數 據存儲API接口 270接收對所需XML數據230的獨立訪問,這些API接口 270 允許每一個應用通過其自己OM與數據通信而不必處理讓多個數據消費者訪問同 一數據片的復雜性。為了允許這多個數據消費應用205、 210、 215訪問同一數據,數據存儲208 在XML數據的任意部分被另一應用改變時通知這些應用的每一個,使得給定應用 可響應于該改變(既包括在內部對于其自己過程的又包括在外部由對同一數據的其 它改變所引起的)。當一個應用請求對給定數據項的改變時,該請求被自動發送到 所有其它應用,以允許其它應用決定如何或是否響應所請求的改變。按照一個實施例,這是通過允許每一個應用注冊對其具有接口的XML數據的任意部分的"監聽" 來實現的,使得給定的應用解決方案/程序僅接收屬于其自己邏輯的那些消息。例 如, 一種類型的應用210可能希望注冊監聽對給定XML數據的所有改變以便向第 三方解決方案提供詳細的商務邏輯能力,而另一類型的應用215可能希望僅監聽對 同一數據內的一兩個特定的XML元素的改變,因為其邏輯不關心對XML數據的 任何其它部分的改變。按照該實施例,多個應用205、 210、 215可訪問和編輯同一文檔數據片,并 且解決對給定數據片的任何沖突改變。例如,當一個應用所作的一個改變引起由另 一應用所作的"副效應"改變時,可對任何給定的改變作出副效應。例如,第一應 用210的任務是從關聯于給定文檔的一或多個數據項225、 230提取公司名稱以將 這些名稱翻譯成相應的股票代碼,如果可用,則用來編譯有關給定文檔的公司股票代碼的列表。如果第二應用215引起給定數據片中的給定公司名稱添加或改變,例 如將公司名稱從"公司ABC"改變為"公司XYZ",則第一應用可監聽該改變, 從而自動更新其股票代碼列表以包括代替"公司ABC"的"公司XYZ"的股票代 碼。此外,這類改變及任何相關聯的副效應可由數據存儲208進行捆綁,使得撤消 一或多個改變時后退所有相關改變。圖3例示示出的內部和外部數據消費者與XML數據存儲之間交互的系統圖。 如所示的,系統300包括數據存儲302,它包括呈現層304、 XML存儲l-N (306) (每一個包括錯誤存儲和撤消存儲)、全局改變存儲308、可選全局撤消存儲310、 耦合到內部數據消費者l-N 314的內部代理程序312以及耦合到外部數據消費者 1-N318的外部代理程序316。使用XML數據存儲器306,文檔具有包含任意數量的任意數據項的能力(只 要每個數據項遵循標準的XML句法)。任意元數據可作為XML存儲在文檔內并 且該信息在文檔由用戶打開/編輯/保存時可自動往返。如上所述,當文檔正在被編輯時通過可使用的API提供對該數據的程序性訪 問,提供一種解決方案開發者所熟悉的標準機制,通過該機制在文檔打開時可程序 性地訪問和修改該信息。按照一個實施例,該程序性訪問被設計為模擬標準的XML 接口。使用API,當諸如字處理應用的應用正在運行時,可以添加/移除數據;可 將數據填充到存儲項(數據存儲的一部分)內;使用標準的XML結構操縱數據; 可將模式與數據存儲中的任意XML數據相關聯; 一旦與數據存儲項相關聯,模式 可被添加/移除/修改;以及可將XML改變作為事件發送給任何監聽的客戶。如所 示的,API包括外部代理程序316和內部代理程序3U,前者為外部數據消費者318 而后者為任何內部數據消費者314提供與數據存儲302交互的接口 。對數據存儲302的操縱可實時發生。如上所述,數據存儲306可包含一或多種類型的數據。例如,公司可能具有一個數據存儲,這是他們正在用于存儲他們想 要存儲在卓一數據存儲器內的所有不同類型的數據的數據存儲,同時另一公司可能想要在不同數據存儲內器存儲不同類型的數據。數據消費者318可注冊涉及有關數據存儲306的動作的事件。例如,數據消 費者可注冊以接收在對一或多個數據存儲作出任何類型的改變時的事件。另一數據 消費者可針對發生于數據存儲內某一元素或某組元素的改變進行注冊。公共事件包 括,加載數據存儲,添加到數據存儲和從數據存儲刪除。當事件發生時,已經注冊 過的各數據消費者可對改變作出反應,同時保持數據存儲器的狀態一致。很多時候,數據消費者在作出改變時不執行任何動作。在其它時候,數據消費者會響應于事件 而執行某(些)動作。例如,數據消費者可響應于改變而作出某些其它改變,諸如 響應于題目改變而更新文檔內的首部。數據消費者還可執行不影響文檔的某些其它 操作。例如,如果插入股票報價機代碼,則數據消費者可檢索關聯于該股票代碼的 數據,即使所有檢索到的數據并不顯示在文檔的呈現層內。數據消費者也可以拒絕 該改變。例如,如果數據消費者l收到不接受的改變,則該數據消費者可向代理程 序返回一個標志,表示不接受該改變。只要改變不被接受,則使得該改變連同任何副效應恢復原狀(roll back),使得該改變從未發生過。每一 XML存儲306可使 用其撤消存儲來撤消其己作出的改變。作為替代,可使用全局撤消存儲310來撤消 在各數據存儲上作出的改變。假設存在對發生于文檔性質的事件感興趣的三個數據 消費者,因此這些數據消費者的每一個已經注冊以接收有關這些性質改變的事件。 當作出改變時,數據存儲確定已經注冊的每一數據消費者并且按預定的順序將改變 通知它們每一個。每一數據消費者進而可響應于該改變而執行某個動作。如果該改 變以及由已注冊數據消費者作出的、作為該改變的結果的任何改變不被任一數據消 費者接受,則涉及該初始改變的所有改變被撤消。外部代理程序應用編程接口層316提供由外部數據消費者318對數據存儲302 的訪問并且允許第三方客戶與數據存儲器302交互,就象與關聯于應用的內部數據 消費者與數據存儲器交互一樣。為標識目的,為數據存儲302內的每一XML數據 存儲306提供唯一的ID。這幫助定位XML數據存儲306。在任何時候,數據消費者可添加用于驗證數據存儲內數據的模式。因此,現 在有任何其它第三方代碼出現且嘗試改變數據,數據存儲器首先要做的是確定該改變對于所提供的模式是否有意義。 一旦模式被附連,代理程序就變為驗證中的對象。 數據存儲一次還可接收一個以上元素。提供數據(XML)作為一個特定的流可幫助在一些情況下滿足模式。例如假定,所附連的模式表示如果股票數據存在則必須至少具有兩個公司。如果一個一個地添加股票數據則這將會是無效的。使用單遍過程來驗證數據。代替進行兩遍會導致對數據存儲作出改變的過程,在數據被提交給數據存儲之前執行驗證。這有助于防止數據消費者將錯誤引入數據存儲。圖4和5例示處理涉及數據存儲的事件的過程。當閱讀對在此提供的例程的 討論時,應當了解,各種實施例的邏輯操作是作為(l)運行于計算機系統上的一系 列計算機實現的動作或程序模塊,以及/或者(2)計算機系統內互連的機器邏輯電路14或電路模塊來實現的。該實現是取決于實現本發明的計算機系統的性能要求來選擇 的。因此,所例示的并且構成在此所述的實施例的邏輯操作被不同地表示為操作、 結構性設備、動作或模塊。這些操作、結構性設備、動作和模塊可用軟件、固件、 專用數字邏輯以及它們的任何組合來實現。圖4例示處理關聯于數據存儲器的事件的過程。 一般而言,當數據存儲從數 據消費者收到改變請求時,該改變被發送到所有已注冊數據消費者,以允許它們拒絕該改變或者請求副效應(其它XML改變)作為該改變的結果。在開始操作之后,過程流至操作410,其中數據消費者注冊其感興趣接收的任 何事件。這些事件可與添加數據到數據存儲、從數據存儲移除數據、對數據存儲中 的數據進行改變等等有關。事件可被附連到對存儲在一或多個數據存儲器內的元素 進行的全局改變或者特定改變。例如, 一個數據消費者可能想要知道任何改變作出 的時間,而另一客戶可能僅對數據存儲內一特定值的改變感興趣。移動至判定操作420,作出事件是否已發生的判定。事件與對數據存儲的改變 有關。例如,如上所述,事件可包括添加、移除或對數據存儲作出某種其它改變。 例如,改變可以是添加一個節點到數據存儲。當事件尚未發生時,過程返回到判定 操作420。當事件已發生時,過程流至操作430。在操作430,改變被中繼給已注冊該改變的每一數據消費者。按照一個實施例, 以預定順序通知每一數據消費者。例如,該順序可基于數據存儲進行注冊的順序。轉移至操作440,-從已接收事件通知的每一數據消費者獲得響應。每一客戶可 接受或拒絕該改變。這些響應該改變是否將被提交給數據存儲。移動至判定操作450,作出是否有任何數據消費者拒絕對數據存儲的這一改變 的判定。當該改變已由任何數據消費者拒絕時,過程移動至框460,其中響應于該 改變作出的任何改變被恢復原狀,好象改變甚至沒有發生過一樣。當所有被通知的客戶接受該改變時,過程流至操作470,其中可任選地驗證這 一改變,并且隨后過程流至操作480,其中該改變被提交給合適的數據存儲。啟動該改變的原始數據消費者隨后接收該改變已被接受的通知(操作490)。 過程隨后移動至結束框,并且返回以處理其它動作。圖5例示處理包括副效應的事件的過程。 一般而言,當數據存儲從數據消費 者接收改變請求時,該改變被發送到所有已注冊客戶,以允許它們拒絕該改變,或 者請求副效應(其它XML改變)作為該改變的結果。例如,客戶可被通知對數據 存儲內的一個項的改變,并且作為該改變的結果,數據消費者對數據存儲作出另一改變。當請求作為副效應的改變時,則過程與圖4所示的過程略有不同。在開始操作之后,過程流至操作510,其中作為當前正被接受或拒絕的改變的 結果,客戶啟動對數據存儲的副效應改變。轉移至操作520,該副效應改變被排隊但未被執行。換言之,該副效應改變沒 有立即在數據存儲內執行。基于該事實,用于這些事件的替換方案包括.強制節點操作(例如,添加,取代)以 返回void而非節點和文檔,它是一個請 求而非動作使節點操作的結果一致 無性能擊中 對于如果你要操縱節點則你在其 AfterAdd(添加后)事件中這么做的事實, 清除經歷反映調用者正在'請求'改變而非作出 改變的事實使節點操作的結果一致 無性能擊中對每一調用者執行必要的改變,隨后在 調用者返回時撤消它們向調用者返回活動節點當在事件中作出改變時返回斷開連接 (讀尚未提交的節點)無論如何從改變返回節點保存OM客戶的獨立DOM向調用者返回活動節點移動至判定操作530,作出是否有任何數據消費者拒絕對數據存儲器的原始改 變的判定。當該改變己經被任何數據消費者拒絕時,過程移動至框540,其中響應于該改 變所作的任何改變和被排隊的任何副效^Z改變被恢復原狀,好象改變甚至沒有發生 過一樣。當客戶己接受原始改變時,過程流至操作550,其中可任選地驗證該改變,并 且過程流至操作560,其中原始改變被提交給合適的數據存儲。過程隨后移動至操作570,其中在數據存儲內一次一個地執行副效應改變。每 一副效應改變隨后可被任何已注冊客戶接受或拒絕。當任何副效應改變被拒絕時, 所作的所有改變被恢復原狀,好象改變甚至沒有被作出過一樣。過程隨后移動至結束框,并且返回以處理其它動作。下面是示例代碼段,它們說明通過數據存儲OM暴露的部分公共功能性第一示例說明將流添加到數據存儲Dim o Stream As CustomXMLPartSet oStream = Document.XMLStreams.Add oStream.Load("c:\specSolution.xmr) 第二示例說明定位數據存儲。 Dim o Stream As CustomXMLPart Set oStream ——Document.XMLStreams("http:〃www.microsoft.com/office/12/specs")第三示例說明添加子樹到數據存儲。oStream.SelectionNamespaces = oStream.SelectionNamespaces & "xmlns:s='http:〃www.microsoft.com/office/12/specs"'oStream.SelectSingleNode(7s:spec/s:specBody/s:issues").AppendSubtree("<s:issu e><s:issueBy/><s:issueDate/><s:issueDesc/x/s:issue>")按照一個實施例,下面是與API相關聯的示例性函數。CustomXMLNode上的事件事件可CustomXMLNode(定制XML節點)上發生,也可僅在文檔層上發生。AfterInsert(NewNode as CustomXMLNode, InUndoRedo as Boolean) 參數NewNode :對應于剛被添加至該CustomXMLNode的節點的 CustomXMLNode對象。注意該節點可具有子節點(如果子樹剛被添加至文檔)。 InUndoRedo: Boolean(布爾型),如果節點是作為用戶進行的撤消/重做動作一部分 被添加的,則返回TRUE(真),否則返回FALSE(假)。每當XML節點將被添加到當前文檔時,該事件激發。如果添加操作涉及將一個XML文檔的子樹被添加至CustomXMLNode,為最頂端的節點改變激發該事件 一次。為每一改變通過消息發送到數據存儲,該事件激發一次,因此由該事件表示 的改變的副效應也觸發該事件。AfterDelete(01dNode as CustomXMLNode, OldParentNode as CustomXMLNode, OldNextSibling As CustomXMLNode, InUndoRedo as Boolean)參數OldNode:對應于剛從CustomXMLPart移除的節點的CustomXMLNode 對象。注意#1:該節點可以具有子節點(如果正在從文檔移除子樹)。注意#2:該節點將是'斷開連接'的節點,因為可從該節點進行向下查詢,但不能向上——它看上去單獨存在(即,它是一個具有相同OwnerStream的文檔元素w/)。 OldParentNode:對應于OldNode的以前父節點的CustomXMLNode對象。 OldNextSibling:對應于OldNode的以前下一兄弟的CustomXMLNode對象。 InUndoRedo: Boolean,如果該節點作為用戶的撤消/重做動作一部分而被添加則返 回TRUE,否則返回FALSE。每當從數據存儲中的當前項刪除XML節點時,該事件激發。如果刪除操作涉 及CustomXMLPart中XML文檔的子樹,則為最頂端的節點的改變就激發該事件 一次。為每一改變通過消息發送到數據存儲,該事件激發一次,因此由該事件表示 的改變的副效應也觸發該事件。AfterReplace(OldNode as CustomXMLNode, NewNode as CustomXMLNode, InUndoRedo as Boolean)參數OldNode:相應于剛從CustomXMLPart移除的節點的CustomXMLNode 對象。注意#1:該節點可能具有子節點(如果正從文檔中移除子樹)。注意#2:.該節點將是一個(斷開連接'的節點,因為可從該節點進行向下查詢,但不能向上——它看上去是單獨存在的(即,它是一個具有相同OwnerStream的文檔元素w/)。 NewNode:對應于剛添加到CustomXMLPart的節點的CustomXMLNode對象。注 意該節點可具有子節點(如果子樹剛被添加到文檔)。InUndoRedo: Boolean,如果該節點作為用戶的撤消/重做動作一部分而被添加則返回TRUE,否則返回 FALSE 。每當XML節點在數據存儲中被代替時,該事件激發。如果替換操作涉及CustomXMLPart中XML文檔的子樹,則為最頂端的節點發生改變激發該事件一次。為每一改變通過消息發送到數據存儲,則該事件激發一次,因此由該事件表示的改變的副效應也觸發該事件。CustomXMLPartsO:指向在包含OLE文檔性質和WSS性質流的文件中所有可用的數據存儲項的集合。CustomXMLPrefixMappings:表示當前部分的所有前綴映射的對象。AddNamespace(Prefix As String, NamespaceURI As String) As Void參數Prefix: String(串),表示添加到前綴映射列表的前綴。NamespaceURI:String,表示指派給新添加前綴的命名空間。允許開發者添加定制命名空間/前綴映射以在查詢該項時使用。如果前綴已經存在于管理器中,則除了在該前綴由數據存儲在內部添加/使用的情況下,這會蓋寫該前綴的意義,隨后將返回一個錯誤"該前綴已經在使用并且不能被修改"。 Count As Long:返回集合中前綴映射的數量。 Item(Index as Long) As CustomXMLPrefixMapping 參數Index: Long(長整型),表示集合中所需模式的索引。 從集合返回所請求的CustomXMLPrefixMapping。該對象的默認成員。 LookupNamespace(Prefix As String) As String參數Prefix: String,表示前綴映射列表中的前綴。允許開發者取得對應于指定前綴的命名空間。如果沒有向所請求的前綴指派命名空間,則返回""。 LookupPrefix(NamespaceURI As String) As String 參數NamespaceURI: String,表示前綴映射列表中的命名空間。 允許開發者取得對應于指定命名空間的前綴。如果沒有將前綴指派給所請求的命名空間,則返回""。如果在命名空間管理器中存在多個指定的前綴,則返回符合所提供的命名空間的第一個前綴。CustomXMLPrefixMapping:表示前綴映射的對象。Prefix As String:返回該前綴映射的前綴。NamespaceURI As String:返回該前綴映射的命名空間。CustomXMLSchema:表示作為模式集合一部分的模式的對象。Delete As Void:從模式集合刪除該模式。如果這是對已經被驗證或者被附連到流的集合(分類的活動集合)中的模式進行的,則失敗,且錯誤消息為"該模式不能被刪除,因為模式集合當前正在使用"。19Location As String:返回一個串,它表示該模式在用戶機器上的位置。 NamespaceURI As String:返回該模式的目標命名空間,如果XSD未指定則 返回""。Reload As Void:從盤重新加載該模式,這翻譯為修飾盤上該模式的拷貝更 新其位置(如果SL已改變)并且確保它仍是有效的模式。如果這是對己被驗證或 被系于流的集合(分類的活動集合)中的模式進行的,則失敗,且錯誤消息為"該 模式不能被重新加載,因為模式集合當前正在使用"。CustomXMLSchemaCollection():表示(可被/將被附連于流的)模式集合的對象。Add([NamespaceURI As String], [Alias As String], [FileName As String], [InstallForAllUsers As Boolean = False]) As CustomXMLSchema參數NamespaceURI: String,表示要添加到集合的模式的命名空間。如果該 模式存在于模式庫中,則從那里檢索它。Alias: String,表示要添加到集合的模式 的別名。如果該別名存在于SL中,使用該自變量來找到它。FileName: String, 表示可以找到該模式在盤上的位置。如果該參數被指定,不僅將模式添加到集合, 而且還將它添加到SL。 InstallForAllUsers: Boolean,表示在將模式添加到模式庫 的情況下,SL鍵應當被寫到HKLM (對于所有用戶)還是HKCU (僅對于當前用 戶)。默認為False (寫到HKCU)。該方法允許開發者添加一或多個模式到模式集合,而該模式集合要被添加到 數據存儲中的流并被添加到模式庫。可以和下列參數組一起調用它(在沖突的情形 中,嘗試按以下順序使用這些參數) [NamespaceURI],[Alias],FileName,[InstallForAllUsers](如果對于該命名空間不存在 模式,則將一個模式添加到模式庫)。僅NamespaceURI (從模式庫中查找XSD)。 僅Alias (從模式庫中査找XSD)。AddCollection(SchemaCollection As CustomXMLSchemas()) As Void參數SchemaCollection :表示要導入到當前集合中的模式集合的 CustomXMLSchemas()對象。添加己經存在的集合到當前集合。如果命名空間在導入期間發生沖突(例如, 如果a.xsd已經鏈接到"fooNamespace"但引入的集合具有b.xsd用于同一命名空 間),則引入的集合獲勝。Count As Long:返回集合中模式的數量。Item(Index as Variant) As CustomXMLSchema參數Index: Variant(變體型),指示集合中所需的項。它可以是以下任一-String,表示所需模式的目標命名空間;或者Long,表示集合中所需模式的索引。 從集合返回所請求的CustomXMLSchema。該對象的默認成員。 NamespaceURI(Index as Long) As String 參數Index: Long,表示集合中模式的索引。 返回模式集合中指定成員的目標命名空間。Validate As Boolean:返回Boolean,表示集合中的模式是否被驗證。這也是 為集合中每一模式遍歷Includes并且將它們添加到請求它們的模式的情況。CustomXMLParts():表示一組CustomXMLPart對象的集合。Add([XML As String], [SchemaCollection as CustomXMLSchemaCollection()]) As CustomXMLPart參數XML:可選的String,表示添加到新創建的CustomXMLPart的XML。 SchemaCollection:可選的CustomDataSchemaCollection()對象,表示用于驗證該流 的模式組。.允許用戶添加新的CustomXMLPart到文件。如果XML參數中的XML不是 合式(well-formed)的,則失敗,并拋出錯誤"要添加內容到該流,它必須是有效、 合式的XML"。如果用戶提供SchemaCollection:驗證它(如果它尚未被驗證過)。 拋出被接收回OM客戶的任何MSXML語法分析錯誤并且未能添加流。檢査XML 參數是否能被加載到DOM中。如果否,則失敗并且拋出錯誤"要添加內容到流, 它必須是有效、合式的XML"。附連模式集合到DOM并且嘗試驗證實例文檔。 如果它沒有證實,則失敗并且拋出在OM客戶接收回的XML語法分析錯誤并且不 將流添加到集合。如果用戶不提供SchemaCollection:檢查XML參數是否可被加載到DOM中。 如果否,則失敗并且拋出錯誤"要添加內容到流,它必須是有效、合式的XML"。 査看在XML文件中所引用的命名空間列表。從SL中找出這些模式并且推理出用 于它們的模式集合。嘗試驗證所得到的模式集合。如果它沒有證實,仍將流加到該 集合,但它不與任何模式集合相關聯并且因此沒有被驗證。將該模式集合附連到 DOM并且嘗試驗證實例文檔。如果它沒有證實,則失敗并且拋出接收回OM客戶 的XML語法分析錯誤,并且不將流添加該集合。如果它沒有證實,仍將流添加到 該集合,但它不與任何模式集合相關聯并且因此沒有被驗證。提供空SchemaCollection將是一個用來表示"從不驗證該流"的顯式動作。 Count As Long:返回集合中定制數據流的數量。 Item(Index As Variant) As CustomXMLPart參數Index: Variant,可以是下列兩種類型之一Long,表示集合中所需 CustomXMLPart的索弓l;或者String,表示集合中所需CustomXMLPart的根命名 空間。如果不止一個CustomXMLPart符合這個根命名空間,則將按索引順序返回 第一個符合的CustomXMLPart。這是CustomXMLParts對象的默認成員,并且它返回對應于所請求對象的 CustomXMLPart對象。SelectByID(ID As String) As CustomXMLPart 參數ID: String,包含應從集合返回的數據存儲項的ID。 允許開發者使用其ID從數據存儲抓取特定項。如果具有此ID的存儲項不存 在,則返回Nothing(無)。SelectByNamespace(NamespaceURI As String) As CustomXMLParts() 參數NamespaceURI: String,表示來自數據存儲的集合中的所需項的根命名 空間。返回其根命名空間匹配所請求條目的所有數據存儲項。如果具有此根命名空間的流不存在,則返回空CustomXMLParts()集合。 StreamAfterAdd(NewStream As CustomXMLPart 參數NewStream:包含剛被添加的流的CustomXMLPart對象。 每當新的流被添加到數據存儲時,該事件激發。如果添加多個流,則為每一新流該事件激發一次。如果(使用合適的.Add(添加)方法)將流與XML內容一起添加,則該事件應當直到該項被該內容填充才激發。 StreamBeforeDelete(OldStream As CustomXMLPart)參數OldStream:包含將要從數據存儲刪除的流的CustomXMLPart對象。 每當從數據存儲移除流,該事件激發。如果移除多個流,則為每一被刪除的 流該事件激發一次。還將該流標記為'將要被刪除',使得對它的只讀操作是合法 的(例如,查詢節點、檢查值等),但寫操作失敗,且錯誤信息為"該操作不能在 將要被刪除的流上完成"。CustomXMLPart: Object(對象),表示數據存儲中單個XML流。 AddNode([Name As String], [NamespaceURI As String], Parent As[NextSibling As CustomXMLNode],[NodeType As msoCustomXMLNodeType], [Node Value As String]) As Void參數Name: String,表示要被添加到XML DOM的節點的基本名稱。 Namespace:可選的String,表示要被添加到XML DOM的節點的命名空間。添加 msoCustomXMLNodeElement或msoCustomXMLNodeAttribute類型的節點時需要, 否則忽略。Parent: CustomXMLPart,表示該節點應當被添加至其下的節點。如果 添加屬性,表示應當向其添加屬性的元素。NextSibling:可選的CustomXMLNode, 表示應當變成新節點的下一兄弟節點的節點。如果未指定,則該節點被添加到父節 點的子節點末尾。忽略有關添加msoCustomXMLNodeAttribute類型。如果 NextSibling不是某個父節點的子節點,返回錯誤"該節點不能被添加,因為下 一兄弟節點不是父節點的子節點"。NodeType:可選的msoCustomXMLNodeType, 指定要創建的節點類型。如果未指定,則假設為msoCustomXMLNodeElement。 NodeValue:可選的String,用于設置允許文本的節點的節點值。如果該節點不允 許文本,則忽略該參數。用于添加XML節點到數據存儲項的普適方法。需要Parent并且NodeType默 認為msoCustomXMLNodeElement。如果得到的添加在結構上是無效的,則失敗, 且錯誤消息為"該操作不能完成,因為它導致在結構上無效的數據流"。如果命名 空間不在模式引用集合中,則失敗并且提供錯誤消息"要添加該元素,首先必須 附連其模式至數據流"。DocumentElement As CustomXMLNode取流的根元素。如果流為空,則返回Nothing。Delete As Void:從數據存儲中刪除當前CustomXMLPart。如果用戶試圖刪除 核心性質部分,則失敗,且錯誤消息為"該定制XML部分為辦公室正確運行所 需的因而不能刪除"。ID As String:返回一個串,包含指派給當前CustomXMLPart的GUID。Load(FilePath As String) As Boolean參數FilePath: String對象,對應于在用戶機器(或網絡等)上的、應從其 中加載用于該CustomXMLPart的XML的文件。允許模板作者從先前存在于其機器上的文件填充CustomXMLPart。如果加載 成功,則返回TRUE,如果否則FALSE (包括啟動結構強制并且XML在結構上非 法的情形或者XML不是有效和/或合式的情形)。 一旦加載DOM,則失敗,且錯誤消息為"該DOM不能加載兩次"。LoadXML(XML As String) As Boolean參數XML: String對象,對應于應當與該CustomXMLPart —起加載的XML。允許模板作者從XML串來填充CustomXMLPart。如果加載成功則返回TRUE, 否則返回FALSE (包括啟用結構性強制并且XML在結構上非法的情形或者XML 不是有效和/或合式的情形)。 一旦加載DOM,則失敗,錯誤消息為"該DOM不 能加載兩次"。 -NamespaceURI As String:返回一個串,包含當前CustomXMLPart的根節點的 完整命名空間URI。如果流為空(創建但未添加節點),則返回""。SchemaCollection As CustornXMLSchemaCollection(): 取 / 設置 CustomXMLSchemaCollection()集合,表示附連到該流的模式組。如果用戶提供 SchemaCollection,則驗證它(如果它尚未驗證過)。拋出接收回客戶的任何語法 分析錯誤并且未能添加流;以及將模式集合附連到DOM并且嘗試驗證實例文檔。 如果它沒有證實,則失敗并且拋出在客戶處接收回的語法分析錯誤,并且不改變流 上的模式集合。NamespaceManager As CustomXMLPrefixMappings()取得針對當前CustomXMLPart使用的命名空間前綴映射組。當打開文檔時, 自動用嵌入在數據存儲項中的前綴映射的內容來填充它,但可以由模板作者編輯/ 添加/刪除它。然而,按照一個實施例,對該參數的改變不與文檔一起保存。SelectNodes(XPath As String) As CustomXMLNodes()參數XPath: String,包含針對DOM求值的XPath表達式。該XPath的前綴 映射是從相關聯的命名空間管理器檢索的。如果XPath沒有解析,則傳遞通過任何 發生錯誤的地方。該方法允許開發者從DOM內取回一組節點。SelectSingleNode(XPath As String) As CustomXMLNode參數XPath: String,包含針對DOM求值的XPath表達式。該XPath的前綴 映射是從相關聯的命名空間管理器檢索的。如果XPath沒有解析,則傳遞通過任何 發生錯誤的地方。該方法允許開發者從DOM內取回單個節點。XML As String:返回當前CustomXMLPart的XML表示。NodeAfterInsert(NewNode as CustomXMLNode, InUndoRedo as Boolean)參數NewNode: CustomXMLNode對象,對應于剛被添加到CustomXMLPart 的節點。注意該節點可能有子節點(如果子樹剛被添加到文檔)。InUndoRedo: Boolean,如果節點是作為用戶的撤消/重做動作的一部分被添加的,則返回TRUE, 否則FALSE 。每當XML節點將要被添加到當前文檔,該事件激發。如果添加操作涉及要添 加到CustomXMLPart中的XML文檔子樹,則為最頂端節點的改變,就激發該事 件一次。為通過消息發送到數據存儲的每一改變,該事件激發一次,因此由該事件 表示的改變的副效應也觸發該事件。NodeAfterDelete(01dNode as CustomXMLNode, OldParentNode as CustomXMLNode, OldNextSibling As CustomXMLNode, InUndoRedo as Boolean).參數OldNode: CustomXMLNode對象,對應于剛從CustomXMLPart移除的節點。注意#1:該節點可能有子節點(如果子樹正從文檔移除)。注意#2:該節點將是一個'斷開連接'的節點,因為可從該節點進行向下查詢,但不能向上——它看上去是單獨存在的(即,它是一個具有相同OwnerStream的文檔元素w/)。 OldParentNode: CustomXMLNode對象,對應于OldNode以前的父節點。 OldNextSibling: CustomXMLNode對象,對應于OldNode以前的下一兄弟節點。 InUndoRedo: Boolean,如果該節點作為用戶的撤消/重做動作一部分而被添加則返 回TRUE,否則返回FALSE。每當從數據存儲的當前項中刪除XML節點時,該事件激發。如果刪除操作涉 及CustomXMLPart中的XML文檔子樹,則為最頂端的節點發生改變就激發該事 件一次。為通過消息發送到數據存儲的每一改變,該事件激發一次,因此由該事件 表示的改變的副效應也觸發該事件。NodeAfterReplace(01dNode as CustomXMLNode, NewNode as CustomXMLNode, InUndoRedo as Boolean)參數OldNode: CustomXMLNode對象,相應于剛從CustomXMLPart移除的 節點。注意#1:該節點可能具有子節點(如果正從文檔移除子樹)。注意#2:該節 點將是一個'斷開連接'的節點,因為可從該節點進行向下查詢,但不能向上—— 它顯示器是單獨存在的(即,它是一個具有相同OwnerStream的文檔元素w/)。 NewNode: CustomXMLNode對象,對應于剛添加到CustomXMLPart的節點。注 意該節點可具有子節點(如果子樹剛被添加到文檔)。InUndoRedo: Boolean, 如果該節點作為用戶的撤消/重做動作一部分而被添加則返回TRUE,否則返回25每當XML節點在數據存儲中被代替時,該事件激發。如果替換操作涉及 CustomXMLPart中的XML文檔子樹,則為最頂端的節點發生改變就激發該事件一 次。為通過消息發送到數據存儲的每一改變,該事件激發一次,因此由該事件表示 的改變的副效應也觸發該事件。CustomXMLNodes():表示當前文檔中一組CustomXMLNode對象的集合。Count As Long:返回集合中CustomXMLNode的數量。Item(Index as Long) As CustomXMLNode參數Index: Long,表示集合中所需CustomXMLNode的索引。 這是CustomXMLNodes對象的默認成員,并且它返回對應于集合中所請求項 的CustomXMLNode對象。 CustomXMLNodeAppendChildNode([Name As String], [NamespaceURI As String], [NodeType As msoCustomXMLNodeType],[Node Value As String]) As Void參數Name:可選的String,表示要被添加到XML DOM的節點的基本名稱。 Namespace:可選的String,表示要被添加到XML DOM的元素的命名空間。在添 加msoCustomXMLNodeElement或msoCustomXMLNode Attribute類型的節點時需 要,否則忽略。NodeType:可選的msoCustomXMLNodeType,它指定要創建的節 點類型。如果沒有指定,假設為msoCustomXMLNodeElement 。 Node Value:可選 的String,用于設置允許文本的節點的節點值。如果該節點不允許文本,則忽略該 參數。如果該上下文節點是msoCustomXMLNodeElement類型,則允許開發者添加 單個節點作為樹中上下文元素下的最后一個子節點。如果否,則該方法失敗,且錯 誤為"不能向注釋、處理指令或屬性附加子節點"。還阻止其中要添加的節點是已經存在的屬性的任何情形"在當前元素上已存在同名屬性"。AppendChildSubtree(XML As String) As Void參數XML: String,表示要添加到XML DOM的子樹。該XML必須是合式 的XML文檔(包括命名空間聲明、單一根節點等等)。如果否,則失敗,且錯誤 為"要添加XML子樹到你的文檔,它必須包含有效、合式的XML"。如果該上下文節點是msoCustomXMLNodeElement類型,則允許開發者添加 現有的合式XML子樹作為DOM中上下文元素下的最后一個子節點。如果否,則該方法失敗,且錯誤為"不能向注釋、處理指令或屬性附加子節點"。Attributes As CustomXMLNodes():返回CustomXMLNode集合,表示當前元 素上的屬性。BaseName As String:這是CustomXMLNode的默認成員。它返回沒有命名空 間前綴的節點基本名稱,如果在DOM中存在一個的話。ChildNodes As CustomXMLNodes:返回CustomXMLNodes集合,包含作為當 前節點的子節點的所有元素。DeleteAsVoid:從XML DOM刪除當前節點(包括其所有子節點,如果有的 話)。如果所得刪除在結構上非法,則失敗,且錯誤消息為"該操作不能完成, 因為它導致在結構上非法的DOM"。FirstChild As CustomXMLNode:返回CustomXMLNode對象,對應于當前節 點的第一個子元素。如果該節點沒有子元素(或者它本身不是 msoCustomXMLNodeElement類型),則返回Nothing。HasChildNodes As Boolean:如果當前節點具有子元素節點則返回TRUE,否 則FALSE。當CustomXMLNode不是msoCustomXMLNodeElement節點類型時, 這將返回FALSE。InsertNodeBefore([Name As String], [NamespaceURI As String], [NodeType As msoCustomXMLNodeType], [NodeValue As String], [NextSibling as CustomXMLNode]) As Void參數Name: String,表示要被添加到XML DOM的節點的基本名稱。 Namespace:可選的String,表示要被添加到XML DOM的元素的命名空間。在添 加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute類型的節點時需 要,否則忽略。NodeType:可選的msoCustomXMLNodeType,指定要創建的節點 類型。如果未指定,則假設為msoCustomXMLNodeElement。 NodeValue:可選的 String,用于設置允許文本的節點的節點值。如果該節點不允許文本,則忽略該參 數。NextSibling:可選的CustomXMLNode對象,指定一節點,在其之前應當將新 的XML元素添加到樹。在指定位置處將新的子節點插入到樹中。如果當添加 msoCustomXMLNodeElement 、 msoCustomXMLNodeComment 或msoCustomXMLNodeProcessinglnstruction類型的節點時未呈現BeforeNode,貝lj將 節點添加到列表的末尾。如果添加為msoCustomXMLNodeAttribute類型,則忽略它。如果NextSibling不是上下文節點的子節點,則該方法失敗"該XML節點 不能被添加,因為下一個兄弟元素必須是上下文元素的子元素"。如果所得到的添 加在結構上非法(并且模式實施被啟用),則失敗,且錯誤消息為"該操作不能 完成,因為它導致在結構上非法的DOM"。還阻止其中將被添加的節點為已存在 的屬性的任何情形"在當前元素上已存在同名的屬性"。InsertSubtreeBefore(XML As String, [NextSibling as CustomXMLNode]) AsVoid參數XML: String,表示添加到XML DOM的子樹。該XML必須是合式的 XML文檔(包括命名空間聲明、單一根節點,等等)。如果否,則失敗,且錯誤 為"要添加XML子樹到你的文檔,它必須包含有效的合式的XML"。NextSibling: 可選的CustomXMLNode對象,指定一節點,在其之前應當將新的XML元素添加 到樹。布指定位置處將指定XML子樹插入到子節點組中。如果NextSibling不是上 下文節點的子節點,則該方法失敗"該XML節點不能被添加,因為下一個兄弟 節點必須是上下文元素的子元素"。如果所得到的添加在結構上非法,則失敗,且 錯誤消息為"該操作不能完成,因為它導致在結構上非法的DOM"。LastChild As CustomXMLNode:返回CustomXMLNode對象,對應于當前節 點的最后一個子元素。如果節點沒有子元素(或者如果它本身不是 msoCustomXMLNodeElement類型),則返回Nothing。NamespaceURI As String [read-only(只讀)]返回String ,對應于當前節點的命名空間。如果節點是 mso.CustomXMLNodeComment、 msoCustomXMLNodeProcessinglnstruction類型,則返回""。NextSibling As CustomXMLNode:返回當前節點的下一個兄弟節點(元素、 注釋或者處理指令)。如果節點是其所在層上的最后一個兄弟節點,則返回Nothing。NodeType As msoCustomXMLNodeType: 返回msoCustomXMLNodeType常 量,表示當前節點的類型。Node Value As String:取得/設置僅包含文本的節點(即文本節點、注釋、處 理指令、屬性)內部的文本。對于元素,失敗"不能設置元素節點的NodeValue 參數"。OwnerDoc腿ent As Variant : 返回 Document(文檔)/Workbook(工作簿)/Presentation(演示)對象,表示關聯于該節點的Word文檔。OwnerStream As CustomXMLPart:返回CustomXMLPart對象,表示關聯于該 節點的數據存儲項。PreviousSibling As CustomXMLNode:返回當前節點的前一兄弟節點(元素、 注釋或處理指令)。如果節點是其所在層上的第一個兄弟節點,則返回Nothing。ParentNode As CustomXMLNode:返回當前節點的父元素節點。如果節點在根 層上,則返回Nothing。RemoveChild(Child As CustomXMLNode) As Void參數Child: CustomXMLNode對象,表示要刪除的上下文節點的子節點。如果該節點不是上下文節點的子節點,則失敗,且錯誤消息為"該節點不能移除,因為它不是當前元素的子節點"。從流中移除指定的子節點。如果所得到的DOM在結構上非法,則失敗,且錯 誤消息為"該操作不能完成,因為它導致在結構上非法的DOM"。ReplaceChildNode(Name As String, [Namespace As String], [NodeType As msoCustomXMLNodeType], [Node Value As String], OldNode As CustomXMLNode) As Void參數OldNode: CustomXMLNode,表示要被取代的子節點。Name: String, 表示要被添加到XMLDOM的元素的基本名稱。Namespace:可選的String,表示 要被添加到XML DOM的元素的命名空間。在添加msoCustomXMLNodeElement 或msoCustomXMLNodeAttribute類型的節點時需要,否則忽略。NodeType:可選 的msoCustomXMLNodeType,指定要創建的節點類型。如果未指定,則假設為 msoCustomXMLNodeElement。 NodeValue:可選的String,用于設置允許文本的節 點的節點值。如果該節點不允許文本,則忽略該參數。從流移除指定的子節點(及其子樹),并且在同一位置中用指定的節點取代 它。如果OldNode不是上下文節點的子節點,則失敗,且錯誤消息為"OldNode 必須是當前節點的子節點"。如果所得到的取代在結構上是非法的,則失敗,且錯 誤消息為"該操作不能完成,因為它導致在結構上非法的DOM"。還阻止其中 將添加的節點為已存在屬性的任何情形"在當前元素上已存在同名屬性"。ReplaceChildSubtree(XML As String, OldNode As CustomXMLNode) As Void參數OldNode: CustomXMLNode,表示要取代的子節點。XML: String,表 示要添加到XML DOM的子樹。這XML必須是合式的XML文檔(包括命名空間聲明、單一根節點,等等)。如果否,則失敗,且錯誤為"要添加XML子樹到你的文檔,它必須是有效的合式的XML"。從流中移除指定的節點(及其子樹),并且在同一位置用指定的XML子樹取 代它。如果OldNode不是上下文節點的子節點,則失敗,且錯誤消息為"01dNode 必須是當前節點的子節點"。如果所得到的取代在結構上是非法的,則失敗,且錯 誤消息為"該操作不能完成,因為它導致在結構上非法的DOM"。SelectNodes(XPath As String) As CustomXMLNodesO參數XPath: String,包含針對DOM求值的XPath表達式。該XPath的前綴 映射是從NamespaceManager性質檢索的。如果XPath沒有解析,則傳遞任何存在 錯誤的地方(按目前的具有嵌入的XML的Document對象上的該方法)。該方法允許開發者從數據存儲項內取回一組節點。SelectSingleNode(XPath As String) As CustomXMLNode()參數XPath: String,包含針對DOM求值的XPath表達式。該XPath的前綴 映射是從NamespaceManager性質檢索的。如果XPath沒有解析,則傳遞任何存在 錯誤的地方(按目前的具有嵌入的XML的Document對象上的該方法)。該方法允許開發者從數據存儲項內取回單個節點。Text As String:取得/設置當前節點的文本。與MSXML不同,在節點上設置 這個用指定的串取代該節點的內容——例如,在其中foo的內容類似如下的非葉元 素《00>上將它設置為"test":<foo>Bar<baz>hello</baz> </foo>將不會失敗,但將導致在內部對于數據存儲和在外部對于數據存儲的客戶的不同消息。如果所得到的取代在結構上是非法的,則失敗,旦錯誤消息為"該操作不能完成,因為它導致在結構上非法的DOM"。XML As String:返回當前節點及其子節點(如果有的話)的原始XML表示。 XPath As String:返回具有當前節點的規范化的XPath的串。如果節點不再在DOM中(它被刪除),則失敗"該節點已從關聯于定制XML部分中刪除"。 Nsw Enums:msoCustomXMLNodeType ,表示可用的 XML 節點類型。msoCustomXMLNodeAttribute,表示XML屬'性節點。msoCustomXMLNodeCData 表示CD ATA節點。msoCustomXMLNodeComment表示XML注釋節點。 msoCustornXMLNodeDocument 表 示 XML 文 檔 (/) 節 點 。 msoCustomXMLNodeElement 表 示 XML 元 素 節 點 。 msoCustomXMLNodeProcessinglnstruction 表示 XML 處理指令節點。 msoCustomXMLNodeText表示文本節點。ReplaceChild(Child As CustomXMLNode, Name As String, [Namespace As String], [NodeType As String], [NodeValue As String]) As CustomXMLNode參數:Child: CustomXMLNode對象,表示要被刪除的上下文節點的子節點。如果該節點不是上下文節點的子節點,則失敗,且錯誤消息為"該節點不能被移 除,因為它不是當前元素的子節點"。Name: String,表示要被添加到XML DOM 的節點的基本名稱。Namespace:可選的String,表示要被添加到XML DOM的節 點的命名空間。 在添力B msoCustomXMLNodeElement 或 msoCustomXMLNodeAttribute類型的節點時需要,否則忽略。NodeType:可選的 msoCustomXMLNodeType,指定要創建的節點類型。如果未指定,則假設為 msoCustomXMLNodeElement。 NodeValue:可選的String,用于設置允許文本的節 點的節點值。如果該節點不允許文本,則忽略該參數。從流中移除指定的子節點(及其子樹),并且在同一位置用指定節點取代它。 如果所得到的刪除在結構上是非法的(并且模式實施被啟用),則失敗,且錯誤消 息為"該操作不能完成,因為它導致在結構上非法的DOM"。 XMLNamespace:該對象表示模式庫中的單個唯一的命名空間。 AttachToCustomXMLPart(CustomXMLPart As Variant) As Void 參數CustomXMLPart: Variant,它可以是所需流的CustomXMLPart對象, 或者是CustomXMLParts集合中的該流的索引。將該XML命名空間的模式附連到給定的CustomXMLPart。 XMLShemaReference:該對象表示在當前文檔中引用的單個唯一的命名空間。 Delete() As Void:從CustomXMLPart中移除命名空間以及該命名空間中的元 素。然而,在該情形中數據存儲可拒絕該操作,因為啟用結構性模式強制,于是移 除這些元素將導致在結構上非法的DOM。在該情形中,失敗并且拋出錯誤"該 操作不能在啟用模式強制的同時執行,因為所得到的流在結構上是非法的"。Add(Name As String, Namespace As String, [Parent As CustomXMLNode],[NextSibling As CustomXMLDataNode], [NodeType AsmsoXMLNodeType],[NodeValue As String]) As CustomXMLNode參數Name: String,表示要被添加到XML DOM的節點的基本名稱。 Namespace:可選的String,表示要被添加到XML DOM的節點的命名空間。在添 力口 msoCustomXMLNodeElement或msoCustomXMLNodeAttribute類型的節點時需 要,否則忽略。Parent:可選的CustomXMLPart,表示該節點應當被添加其下的節 點。如果取消(call off of)由.Attributes性質返回的CustomXMLNodes集合,則假設 為這些屬性的父節點。如果在任何其它情形中被調用,則指定該參數或者返回錯誤 "必須指定父節點來添加該節點到你的文檔"。NextSibling:可選的 CustomXMLNode,表示應當成為新節點的下一兄弟的節點。如果未指定,則將節 點添加到父節點的子節點的末尾。忽略msoCustomXMLNodeAttribute類型的添加。 如果NextSibling不是父節點的子節點,則返回錯誤"該節點不能被添加,因為 下 一 兄弟節點不是父節點的子節點"。NodeType :可選的 msoCustomXMLNodeType,指定要創建的節點類型。如果未指定,則假設為 msoCustomXMLNodeAttribute , 除非取消.Attributes 性質,則假設為 msoCustomXMLNodeElement。 NodeValue:可選的String,用于設置允許文本的節 點的節點值。如果節點不允許文本,則忽略該參數。用于添加XML節點到數據存儲項的普適方法。如果取消由.Attributes性質返 回的CustomXMLNodes對象,則Parent具有默認的父節點并且NodeType具有默 認的msoCustomXMLNodeAttribute。在所有其它情形中,需要Parent并且NodeType 默認為msoCustomXMLNodeElement。如果所得到的添加在結構上是非法的(并且 模式強制被啟用),則失敗,且錯誤消息為"該操作不能在啟用模式強制時完成, 因為它導致在結構上非法的數據流"。如果命名空間不在模式引用集合中,則失敗,并且錯誤消息為"要添加該元素,必須首先將其模式附連到數據流"。CustomDataXMLSchemaReferencesO : Collection( 集合), 表示在 CustomXMLPart中標識的所有的唯一命名空間。注意默認地,用在XML文件中 聲明的每一命名空間的條目來填充它。Add([NamespaceURI As String], [Alias As String], [FileName As String], [InstallForAllUsers As Boolean = False]) As XMLSchemaReference參數NamespaceURI: String,包含由要添加到模式集合的模式定義的命名空 間。Alias: String,包含當將該模式添加到模式庫時要寫的別名。FileName: String,包含指向應添加到模式庫的模式的路徑。InstallForAUUsers: Boolean,確定模式庫 鍵應當被添加到HKCU (默認)還是HKLM。該方法添加模式引用。為完成這個,如果在文件中還沒有定義命名空間,則 向CustomXMLPart的根元素添加合適的命名空間聲明。在打開時,使用所有被聲 明的命名空間來填充該集合。EnforceStructure As Boolean:取得和設置對應于數據存儲是否應當按照其模式 對相關聯的CustomXMLPart強制結構有效性的布爾值。如果用戶嘗試在 CustomXMLPart的內容不是有效時將此屬性設置為TRUE,則返回錯誤"當該 數據流的內容在結構上是非法時,不能啟用模式強制"。Count As Long:返回在該CustomXMLPart中當前引用的命名空間的數量。Item(Index As Variant) As XMLSchemaReference參數Index: Variant,可以是以下兩種類型之一Long,表示集合中所需 CustomDataXMLSchemaReference的索弓| ; 以及String , 表示集合中所需 CustomDataXMLSchemaReference的命名空間。這是CustomDataXMLSchemaReferences對象的默認成員,并且它返回對應于 所請求對象的XMLSchemaReference對象。Validate() As Void:該方法針對CustomDataXMLSchemaReferences集合中的 所有模式來驗證整個流。在各個節點上報告錯誤(見.ValidationStatus性質)/CustomXMLNodeNodeAfterInsert(NewCustomXMLNode as CustomXMLNode, InUndoRedo as Boolean).參數NewCustomXMLNode: CustomXMLNode對象,對應于剛添加到 CustomXMLPart的節點。注意該節點可能具有子節點(如果子樹剛被添加到文 檔)。InUndoRedo: Boolean,如果節點作為用戶的撤消/重做動作一部分被添加則 返回TRUE,否貝IJFALSE。每當XML節點將被添加到當前文檔,該事件激發。如果添加操作涉及到將 XML文檔子樹添加到CustomXMLPart,則為最頂端節點的改變,就激發該事件一 次。為通過消息發送到數據存儲的每一改變,該事件激發一次,因此由該事件表示 的改變的副效應也觸發該事件。NodeBeforeDelete(OldCustomXMLNode as CustomXMLNode, InUndoRedo asBoolean)參數OldCustomXMLNode : CustomXMLNode對象,對應于將要從 CustomXMLPart移除的節點。注意該節點可能具有子節點(如果從文檔移除子 樹)。InUndoRedo: Boolean,如果節點作為用戶的撤消/重做動作一部分被添加則 返回TRUE,否則FALSE 。每當XML節點從數據存儲中當前項被刪除,該事件激發。如果刪除操作涉及 到將XML文檔子樹添加到CustomXMLPart,則為最頂端節點的改變,就激發該事 件一次。為通過消息發送到數據存儲的每一改變,該事件激發一次,因此由該事件 表示的改變的副效應也觸發該事件。如果事件處理程序嘗試修改在該節點下的任何 內容,則失敗,且錯誤消息為"不允許該改變,因為該節點將被刪除"。以上說明、示例和數據提供了對本發明成分的制造和使用的全面描述。因為 可以在不背離本發明的精神和范圍的情況下做出本發明的許多實施例,所以本發明 位于所附權利要求的范圍內。
            權利要求
            1.一種具有用于管理與計算機生成文檔相關聯的數據的計算機可執行指令的計算機可讀介質,包括在數據存儲中存儲與文檔相關聯的結構化數據項,所述數據存儲獨立于所述文檔保存;以及向數據消費者暴露應用編程接口(API),用于允許所述數據消費者程序性地訪問所述結構化數據項;其中所述API提供在打開所述文檔時以及當關閉所述文檔時訪問所述結構化數據項的能力。
            2. 如權利要求1所述的計算機可讀介質,其特征在于,還包括按照可擴展標 記語言(XML)結構化所述結構化數據項。
            3. 如權利要求2所述的計算機可讀介質,其特征在于,所述API允許所述數 據消費者程序性地訪問所述結構化數據項包括允許一個以上數據消費者同時訪問 同一結構化數據項。
            4. 如權利要求3所述的計算機可讀介質,其特征在于,還包括使用所述API 判定何時對所述結構化數據項之一作出改變;以及當作出改變時將所述改變通知已 注冊的數據消費者;以及判定所述改變是被所述已注冊數據消費者接受還是拒絕。
            5. 如權利要求4所述的計算機可讀介質,其特征在于,還包括當所述已注冊 數據消費者之一拒絕所述改變時將所述改變恢復原狀,而當每一所述己注冊數據消 費者接受所述改變時向所述數據存儲提交所述改變。
            6. 如權利要求5所述的計算機可讀介質,其特征在于,還包括使用所述API 將所述結構化數據項與XML模式文件相關聯,所述XML模式文件用于在向所述 數據存儲提交所述改變之前驗證所述結構化數據項。
            7. 如權利要求2所述的計算機可讀介質,其特征在于,所述API提供一函數 來注冊以接收有關下列各項至少之一的改變通知的通知對所述數據存儲的改變以 及對一或多個所述結構化數據項的改變;其中所述改變可包括對所述數據存儲和所 述結構化數據項的至少之一的刪除、添加和修改。
            8. 如權利要求7所述的計算機可讀介質,其特征在于,所述API提供接口用 于添加節點至所述數據存儲;從所述數據存儲刪除節點;以及取代所述數據存儲 內的節點。
            9. 如權利要求7所述的計算機可讀介質,其特征在于,所述API提供接口用 于使用現有文件填充所述數據存儲;以及使用XML串填充所述數據存儲。
            10. 如權利要求7所述的計算機可讀介質,其特征在于,所述API提供接口 用于添加命名空間;查找命名空間;添加模式;刪除模式;以及重新加載模式。
            11. 如權利要求7所述的計算機可讀介質,其特征在于,所述API提供接口 用于添加流;移除流;添加子樹;移除子樹;獲得當前節點的下一兄弟節點;以 及獲得當前節點的上一兄弟節點獲得節點類型。
            12. 如權利要求7所述的計算機可讀介質,其特征在于,所述API提供接口用于獲得節點值;以及強制一種結構。
            13. —種用于管理與計算機生成文檔相關聯的數據的計算機實現方法,包括: 使用數據存儲存儲與文檔相關聯的結構化數據項;其中,所述結構化數據項是按照可擴展標記語言(XML)結構化的;以及向數據消費者暴露應用編程接口 (API),所述API允許程序性地訪問所述文 檔以及包含在所述數據存儲內的所述結構化數據項;以及當正在編輯所述文檔時和 當關閉所述文檔時,使用所述API訪問所述數據存儲內的所述結構化數據項;以 及其中,所述數據消費者在已注冊的情況下接收關于對所述數據存儲做出的改變的通知。
            14. 如權利要求13所述的計算機實現方法,其特征在于,使用所述API還包括使用所述API發起對所述數據存儲之一的改變; 向所述已注冊數據消費者提供有關所述改變的通知;在來自所述已注冊數據消費者之一的響應是拒絕的情況下做出判定,并且當 所述響應是拒絕時,將所述改變以及任何副效應改變恢復原狀;在所有已注冊數據消費者接受所述改變的情況下做出判定;并且當所述已注 冊數據消費者接受所述改變時;可選地使用XML模式文件來驗證所述改變,所述 XML模式文件是由所述數據消費者之一通過所述API提供的;以及向一或多個所 述數據存儲提交所述改變。
            15. 如權利要求14所述的計算機實現方法,其特征在于,使用所述API還包 括提供編程接口用于獲得節點的值;添加節點;刪除節點;移動節點;添加模式; 刪除模式;重新加載模式;添加命名空間;以及移除命名空間。
            16. —種用于管理與計算機生成文檔相關聯的數據的系統,包括外部數據消費者;被配置為存儲文檔的文檔數據存儲;以及被配置為存儲與一或多個所述文檔相關聯的結構化數據項的數據存儲;其中 所述數據存儲器包括XML數據存儲;被配置為與所述外部數據消費者和內部數 據消費者交互的API代理程序;被配置為存儲與對結構化數據項所作的改變相關 聯的改變的改變存儲;以及被配置為將作為對所述結構化數據項所作的改變的結果 而做出的任何改變恢復原狀的撤消存儲;其中,所述API代理程序暴露編程接口 (API),所述API允許程序性地訪問所述文檔以及包含在所述數據存儲內的所述 結構化數據項;以及當打開所述文檔時以及當關閉所述文檔時都能使用所述API 訪問所述數據存儲內的所述結構化數據項。
            17. 如權利要求16所述的系統,其特征在于,所述數據存儲還被配置為 接收對應用于所述結構化數據項的可擴展標記標記(XML)標記數據的改變; 讀取與對所述XML標記數據的改變所指向的所述結構化數據項相關聯的XML模式文件;按照所述讀取的XML模式文件判定對所述XML標記數據的改變是否有效;以及如果按照所述讀取的XML模式文件,對所述XML標記數據的改變不是有效 的,則禁止對所述XML標記數據的改變;以及當按照所述讀取的XML模式文件, 對所述XML標記數據的改變是有效的,則向一或多個XML存儲提交所述改變。
            18. 如權利要求16所述的系統,其特征在于,所述XML數據存儲的每一個 包括撤消存儲和改變存儲。
            19. 如權利要求16所述的系統,其特征在于,所述API提供接口用于添加 節點到所述數據存儲;從所述數據存儲刪除節點;取代所述數據存儲內的節點;以 及從所述數據存儲獲得值。
            20. 如權利要求19所述的系統,其特征在于,所述API提供接口用于添加 模式;刪除模式;以及重新加載模式。
            全文摘要
            一種用于與文檔內的數據存儲交互的可編程性模式允許實時交互。在該數據存儲中保存用于結構化與文檔相關聯的數據,諸如文檔元數據,其中不同數據片之間的關系在不同于文檔的表示層視圖的位置處保存。數據存儲暴露與數據存儲中各種數據片的接口,以允許不同應用訪問和操作一或多個數據片。可以根據諸如可擴展標示語言(XML)的標記語言來構造各數據片,并且XML模式可與每一數據片相關聯,以允許數據存儲基于與給定數據片相關聯的XML模式來驗證應用于該數據的結構。
            文檔編號G06F17/21GK101263477SQ200680033069
            公開日2008年9月10日 申請日期2006年9月8日 優先權日2005年9月9日
            發明者A·泰爾哈特, B·M·瓊斯, M·塞維奇, R·A·利特爾, T·A·戴維斯 申請人:微軟公司
            網友詢問留言 已有0條留言
            • 還沒有人留言評論。精彩留言會獲得點贊!
            1
            婷婷六月激情在线综合激情,亚洲国产大片,久久中文字幕综合婷婷,精品久久久久久中文字幕,亚洲一区二区三区高清不卡,99国产精品热久久久久久夜夜嗨 ,欧美日韩亚洲综合在线一区二区,99国产精品电影,伊人精品线视天天综合,精品伊人久久久大香线蕉欧美
            亚洲精品1区 国产成人一级 91精品国产欧美一区二区 亚洲精品乱码久久久久久下载 国产精品久久久久久久伊一 九色国产 国产精品九九视频 伊人久久成人爱综合网 欧美日韩亚洲区久久综合 欧美日本一道免费一区三区 夜夜爽一区二区三区精品 欧美日韩高清一区二区三区 国产成人av在线 国产精品对白交换绿帽视频 国产视频亚洲 国产在线欧美精品 国产精品综合网 国产日韩精品欧美一区色 国产日韩精品欧美一区喷 欧美日韩在线观看区一二 国产区精品 欧美视频日韩视频 中文字幕天天躁日日躁狠狠躁97 视频一二三区 欧美高清在线精品一区二区不卡 国产精品揄拍一区二区久久 99久久综合狠狠综合久久aⅴ 亚洲乱码视频在线观看 日韩在线第二页 亚洲精品无码专区在线播放 成人亚洲网站www在线观看 欧美三级一区二区 99久久精品免费看国产高清 91麻豆国产在线观看 最新日韩欧美不卡一二三区 成人在线观看不卡 日韩国产在线 在线亚洲精品 亚洲午夜久久久久中文字幕 国产精品成人久久久久久久 精品国产一区二区在线观看 欧美精品国产一区二区三区 中文在线播放 亚洲第一页在线视频 国产午夜精品福利久久 九色国产 精品国产九九 国产永久视频 久久精品人人做人人综合试看 国产一区二区三区免费观看 亚洲精品国产电影 9999热视频 国产精品资源在线 麻豆久久婷婷国产综合五月 国产精品免费一级在线观看 亚洲国产一区二区三区青草影视 中文在线播放 国产成人综合在线 国产在线观看色 国产亚洲三级 国产片一区二区三区 久久99精品久久久久久牛牛影视 亚洲欧美日韩国产 四虎永久免费网站 国产一毛片 国产精品视频在 九九热在线精品 99精品福利视频 色婷婷色99国产综合精品 97成人精品视频在线播放 精品久久久久久中文字幕 亚洲欧美一区二区三区孕妇 亚洲欧美成人网 日韩高清在线二区 国产尤物在线观看 在线不卡一区二区 91网站在线看 韩国精品福利一区二区 欧美日韩国产成人精品 99热精品久久 国产精品免费视频一区 高清视频一区 精品九九久久 欧美日韩在线观看免费 91欧美激情一区二区三区成人 99福利视频 亚洲国产精品91 久热国产在线 精品久久久久久中文字幕女 国产精品久久久久久久久99热 成人自拍视频网 国产精品视频久久久久久 久久影院国产 国产玖玖在线观看 99精品在线免费 亚洲欧美一区二区三区导航 久久久久久久综合 国产欧美日韩精品高清二区综合区 国产精品视频自拍 亚洲一级片免费 久久久久久九九 国产欧美自拍视频 视频一区二区在线观看 欧美日韩一区二区三区久久 中文在线亚洲 伊人热人久久中文字幕 日韩欧美亚洲国产一区二区三区 欧美亚洲国产成人高清在线 欧美日韩国产码高清综合人成 国产性大片免费播放网站 亚洲午夜综合网 91精品久久一区二区三区 国产无套在线播放 国产精品视频网站 国产成人亚洲精品老王 91在线网站 国产视频97 欧美黑人欧美精品刺激 国产一区二区三区免费在线视频 久久久国产精品免费看 99re6久精品国产首页 久久精品91 国产成人一级 国产成人精品曰本亚洲 日本福利在线观看 伊人成综合网 久久综合一本 国产综合久久久久久 久久精品成人免费看 久久福利 91精品国产91久久久久久麻豆 亚洲精品成人在线 亚洲伊人久久精品 欧美日本二区 国产永久视频 国产一区二 一区二区福利 国产一毛片 亚洲精品1区 毛片一区二区三区 伊人久久大香线蕉综合影 国产欧美在线观看一区 亚洲国产欧洲综合997久久 国产一区二区免费视频 国产91精品对白露脸全集观看 久久亚洲国产伦理 欧美成人伊人久久综合网 亚洲性久久久影院 久久99国产精一区二区三区! 91精品国产欧美一区二区 欧美日韩亚洲区久久综合 日韩精品一二三区 久久久夜色精品国产噜噜 国产在线精品福利91香蕉 久久久久久久亚洲精品 97se色综合一区二区二区 91国语精品自产拍在线观看性色 91久久国产综合精品女同我 日韩中文字幕a 国产成人亚洲日本精品 久久国产精品-国产精品 久久国产经典视频 久久国产精品伦理 亚洲第一页在线视频 国产精品久久久久三级 日韩毛片网 久久免费高清视频 麻豆国产在线观看一区二区 91麻豆国产福利在线观看 国产成人精品男人的天堂538 一区二区三区中文字幕 免费在线视频一区 欧美日韩国产成人精品 国产综合网站 国产资源免费观看 亚洲精品亚洲人成在线播放 精品久久久久久中文字幕专区 亚洲人成人毛片无遮挡 国产一起色一起爱 国产香蕉精品视频在 九九热免费观看 日韩亚洲欧美一区 九九热精品在线观看 精品久久久久久中文字幕专区 亚洲欧美自拍偷拍 国产精品每日更新 久久久久国产一级毛片高清板 久久天天躁狠狠躁夜夜中文字幕 久久精品片 日韩在线毛片 国产成人精品本亚洲 国产成人精品一区二区三区 九九热在线观看 国产r级在线观看 国产欧美日韩精品高清二区综合区 韩国电影一区二区 国产精品毛片va一区二区三区 五月婷婷伊人网 久久一区二区三区免费 一本色道久久综合狠狠躁篇 亚洲综合色站 国产尤物在线观看 亚洲一区亚洲二区 免费在线视频一区 欧洲精品视频在线观看 日韩中文字幕a 中文字幕日本在线mv视频精品 91精品在线免费视频 精品国产免费人成在线观看 精品a级片 中文字幕日本在线mv视频精品 日韩在线精品视频 婷婷丁香色 91精品国产高清久久久久 国产成人精品日本亚洲直接 五月综合视频 欧美日韩在线亚洲国产人 精液呈暗黄色 亚洲乱码一区 久久精品中文字幕不卡一二区 亚洲天堂精品在线 激情婷婷综合 国产免费久久精品久久久 国产精品亚洲二区在线 久久免费播放视频 五月婷婷丁香综合 在线亚洲欧美日韩 久久免费精品高清麻豆 精品久久久久久中文字幕 亚洲一区网站 国产精品福利社 日韩中文字幕免费 亚洲综合丝袜 91精品在线播放 国产精品18 亚洲日日夜夜 伊人久久大香线蕉综合影 亚洲精品中文字幕乱码影院 亚洲一区二区黄色 亚洲第一页在线视频 一区二区在线观看视频 国产成人福利精品视频 亚洲高清二区 国内成人免费视频 精品亚洲性xxx久久久 国产精品合集一区二区三区 97av免费视频 国产一起色一起爱 国产区久久 国产资源免费观看 99精品视频免费 国产成人一级 国产精品九九免费视频 欧美91精品久久久久网免费 99热国产免费 久久精品色 98精品国产综合久久 久久精品播放 中文字幕视频免费 国产欧美日韩一区二区三区在线 精品久久蜜桃 国产小视频精品 一本色道久久综合狠狠躁篇 91在线免费观看 亚洲精品区 伊人成综合网 伊人热人久久中文字幕 伊人黄色片 99国产精品热久久久久久夜夜嗨 久久免费精品视频 亚洲一区二区三区高清不卡 久久久久国产一级毛片高清板 国产片一区二区三区 久久狠狠干 99久久婷婷国产综合精品电影 国产99区 国产精品成人久久久久 久久狠狠干 青青国产在线观看 亚洲高清国产拍精品影院 国产精品一区二区av 九九热在线免费视频 伊人久久国产 国产精品久久久久久久久久一区 在线观看免费视频一区 国产精品自在在线午夜区app 国产精品综合色区在线观看 国产毛片久久久久久国产毛片 97国产免费全部免费观看 国产精品每日更新 国产尤物视频在线 九九视频这里只有精品99 一本一道久久a久久精品综合 久久综合给会久久狠狠狠 国产成人精品男人的天堂538 欧美一区二区高清 毛片一区二区三区 国产欧美日韩在线观看一区二区三区 在线国产二区 欧美不卡网 91在线精品中文字幕 在线国产福利 国内精品91久久久久 91亚洲福利 日韩欧美国产中文字幕 91久久精品国产性色也91久久 亚洲性久久久影院 欧美精品1区 国产热re99久久6国产精品 九九热免费观看 国产精品欧美日韩 久久久久国产一级毛片高清板 久久国产经典视频 日韩欧美亚洲国产一区二区三区 欧美亚洲综合另类在线观看 国产精品自在在线午夜区app 97中文字幕在线观看 视频一二三区 精品国产一区在线观看 国产欧美日韩在线一区二区不卡 欧美一区二三区 伊人成人在线观看 国内精品91久久久久 97在线亚洲 国产在线不卡一区 久久久全免费全集一级全黄片 国产精品v欧美精品∨日韩 亚洲毛片网站 在线不卡一区二区 99re热在线视频 久久激情网 国产毛片一区二区三区精品 久久亚洲综合色 中文字幕视频免费 国产视频亚洲 婷婷伊人久久 国产一区二区免费播放 久久99国产精品成人欧美 99国产在线视频 国产成人免费视频精品一区二区 国产不卡一区二区三区免费视 国产码欧美日韩高清综合一区 久久精品国产主播一区二区 国产一区电影 久久精品国产夜色 国产精品国产三级国产 日韩一区二区三区在线 久久97久久97精品免视看 久久国产免费一区二区三区 伊人久久大香线蕉综合电影网 99re6久精品国产首页 久久激情网 亚洲成人高清在线 国产精品网址 国产成人精品男人的天堂538 香蕉国产综合久久猫咪 国产专区中文字幕 91麻豆精品国产高清在线 久久国产经典视频 国产精品成人va在线观看 国产精品爱啪在线线免费观看 日本精品久久久久久久久免费 亚洲综合一区二区三区 久久五月网 精品国产网红福利在线观看 久久综合亚洲伊人色 亚洲国产精品久久久久久网站 在线日韩国产 99国产精品热久久久久久夜夜嗨 国产综合精品在线 国产区福利 精品亚洲综合久久中文字幕 国产制服丝袜在线 毛片在线播放网站 在线观看免费视频一区 国产精品久久久精品三级 亚洲国产电影在线观看 最新日韩欧美不卡一二三区 狠狠综合久久综合鬼色 日本精品1在线区 国产日韩一区二区三区在线播放 欧美日韩精品在线播放 亚洲欧美日韩国产一区二区三区精品 久久综合久久网 婷婷六月激情在线综合激情 亚洲乱码一区 国产专区91 97av视频在线观看 精品久久久久久中文字幕 久久五月视频 国产成人福利精品视频 国产精品网址 中文字幕视频在线 精品一区二区三区免费视频 伊人手机在线视频 亚洲精品中文字幕乱码 国产在线视频www色 色噜噜国产精品视频一区二区 精品亚洲成a人在线观看 国产香蕉尹人综合在线 成人免费一区二区三区在线观看 国产不卡一区二区三区免费视 欧美精品久久天天躁 国产专区中文字幕 久久精品国产免费中文 久久精品国产免费一区 久久无码精品一区二区三区 国产欧美另类久久久精品免费 欧美精品久久天天躁 亚洲精品在线视频 国产视频91在线 91精品福利一区二区三区野战 日韩中文字幕免费 国产精品99一区二区三区 欧美成人高清性色生活 国产精品系列在线观看 亚洲国产福利精品一区二区 国产成人在线小视频 国产精品久久久久免费 99re热在线视频 久久久久久久综合 一区二区国产在线播放 成人国产在线视频 亚洲精品乱码久久久久 欧美日韩一区二区综合 精品久久久久免费极品大片 中文字幕视频二区 激情粉嫩精品国产尤物 国产成人精品一区二区视频 久久精品中文字幕首页 亚洲高清在线 国产精品亚洲一区二区三区 伊人久久艹 中文在线亚洲 国产精品一区二区在线播放 国产精品九九免费视频 亚洲二区在线播放 亚洲狠狠婷婷综合久久久久网站 亚洲欧美日韩网站 日韩成人精品 亚洲国产一区二区三区青草影视 91精品国产福利在线观看 国产精品久久久久久久久99热 国产一区二区精品尤物 久碰香蕉精品视频在线观看 亚洲日日夜夜 在线不卡一区二区 国产午夜亚洲精品 九九热在线视频观看这里只有精品 伊人手机在线视频 91免费国产精品 日韩欧美中字 91精品国产91久久久久 国产全黄三级播放 视频一区二区三区免费观看 国产开裆丝袜高跟在线观看 国产成人欧美 激情综合丝袜美女一区二区 国产成人亚洲综合无 欧美精品一区二区三区免费观看 欧美亚洲国产日韩 日韩亚州 国产欧美日韩精品高清二区综合区 亚洲午夜国产片在线观看 精品久久久久久中文字幕 欧美精品1区 久久伊人久久亚洲综合 亚洲欧美日韩精品 国产成人精品久久亚洲高清不卡 久久福利影视 国产精品99精品久久免费 久久久久免费精品视频 国产日产亚洲精品 亚洲国产午夜电影在线入口 精品无码一区在线观看 午夜国产精品视频 亚洲一级片免费 伊人久久大香线蕉综合影 国产精品久久影院 久碰香蕉精品视频在线观看 www.欧美精品 在线小视频国产 亚洲国产天堂久久综合图区 欧美一区二区三区不卡 日韩美女福利视频 九九精品免视频国产成人 不卡国产00高中生在线视频 亚洲第一页在线视频 欧美日韩在线播放成人 99re视频这里只有精品 国产精品91在线 精品乱码一区二区三区在线 国产区久久 91麻豆精品国产自产在线观看一区 日韩精品成人在线 九九热在线观看 国产精品久久不卡日韩美女 欧美一区二区三区综合色视频 欧美精品免费一区欧美久久优播 国产精品网址 国产专区中文字幕 国产精品欧美亚洲韩国日本久久 日韩美香港a一级毛片 久久精品123 欧美一区二区三区免费看 99r在线视频 亚洲精品国产字幕久久vr 国产综合激情在线亚洲第一页 91免费国产精品 日韩免费小视频 亚洲国产精品综合一区在线 国产亚洲第一伦理第一区 在线亚洲精品 国产精品一区二区制服丝袜 国产在线成人精品 九九精品免视频国产成人 亚洲国产网 欧美日韩亚洲一区二区三区在线观看 在线亚洲精品 欧美一区二区三区高清视频 国产成人精品男人的天堂538 欧美日韩在线观看区一二 亚洲欧美一区二区久久 久久精品中文字幕首页 日本高清www午夜视频 久久精品国产免费 久久999精品 亚洲国产精品欧美综合 88国产精品视频一区二区三区 91久久偷偷做嫩草影院免费看 国产精品夜色视频一区二区 欧美日韩导航 国产成人啪精品午夜在线播放 一区二区视频在线免费观看 99久久精品国产自免费 精液呈暗黄色 久久99国产精品 日本精品久久久久久久久免费 精品国产97在线观看 99re视频这里只有精品 国产视频91在线 999av视频 亚洲美女视频一区二区三区 久久97久久97精品免视看 亚洲国产成人久久三区 99久久亚洲国产高清观看 日韩毛片在线视频 综合激情在线 91福利一区二区在线观看 一区二区视频在线免费观看 激情粉嫩精品国产尤物 国产成人精品曰本亚洲78 国产成人精品本亚洲 国产精品成人免费视频 国产成人啪精品视频免费软件 久久精品国产亚洲妲己影院 国产精品成人久久久久久久 久久大香线蕉综合爱 欧美一区二区三区高清视频 99热国产免费 在线观看欧美国产 91精品视频在线播放 国产精品福利社 欧美精品一区二区三区免费观看 国产一区二区免费视频 国产午夜精品一区二区 精品视频在线观看97 91精品福利久久久 国产一区福利 国产综合激情在线亚洲第一页 国产精品久久久久久久久久久不卡 九色国产 在线日韩国产 黄网在线观看 亚洲一区小说区中文字幕 中文字幕丝袜 日本二区在线观看 日本国产一区在线观看 欧美日韩一区二区三区久久 欧美精品亚洲精品日韩专 国产日产亚洲精品 久久综合九色综合欧美播 亚洲国产欧美无圣光一区 欧美视频区 亚洲乱码视频在线观看 久久无码精品一区二区三区 九九热精品免费视频 久久99精品久久久久久牛牛影视 国产精品成久久久久三级 国产一区福利 午夜国产精品视频 日本二区在线观看 99久久网站 国产亚洲天堂 精品国产一区二区三区不卡 亚洲国产日韩在线一区 国产成人综合在线观看网站 久久免费高清视频 欧美在线导航 午夜精品久久久久久99热7777 欧美久久综合网 国产小视频精品 国产尤物在线观看 亚洲国产精品综合一区在线 欧美一区二区三区不卡视频 欧美黑人欧美精品刺激 日本福利在线观看 久久国产偷 国产手机精品一区二区 国产热re99久久6国产精品 国产高清啪啪 欧美亚洲国产成人高清在线 国产在线第三页 亚洲综合一区二区三区 99r在线视频 99精品久久久久久久婷婷 国产精品乱码免费一区二区 国产在线精品福利91香蕉 国产尤物视频在线 五月婷婷亚洲 中文字幕久久综合伊人 亚洲精品一级毛片 99国产精品电影 在线视频第一页 久久99国产精品成人欧美 国产白白视频在线观看2 成人精品一区二区www 亚洲成人网在线观看 麻豆91在线视频 色综合合久久天天综合绕视看 久久精品国产免费高清 国产不卡一区二区三区免费视 欧美国产中文 99精品欧美 九九在线精品 国产中文字幕在线免费观看 国产一区中文字幕在线观看 国产成人一级 国产精品一区二区制服丝袜 国产一起色一起爱 亚洲精品成人在线 亚洲欧美精品在线 国产欧美自拍视频 99精品久久久久久久婷婷 久99视频 国产热re99久久6国产精品 视频一区亚洲 国产精品视频分类 国产精品成在线观看 99re6久精品国产首页 亚洲在成人网在线看 亚洲国产日韩在线一区 久久国产三级 日韩国产欧美 欧美在线一区二区三区 国产精品美女一级在线观看 成人午夜免费福利视频 亚洲天堂精品在线 91精品国产手机 欧美日韩视频在线播放 狠狠综合久久综合鬼色 九一色视频 青青视频国产 亚洲欧美自拍一区 中文字幕天天躁日日躁狠狠躁97 日韩免费大片 996热视频 伊人成综合网 亚洲天堂欧美 日韩精品亚洲人成在线观看 久久综合给会久久狠狠狠 日韩精品亚洲人成在线观看 日韩国产欧美 亚洲成aⅴ人片在线影院八 亚洲精品1区 99久久精品免费 国产精品高清在线观看 国产精品久久久免费视频 在线亚洲欧美日韩 91在线看视频 国产精品96久久久久久久 欧美日韩国产成人精品 91在线亚洲 热久久亚洲 国产精品美女免费视频观看 日韩在线毛片 亚洲永久免费视频 九九免费在线视频 亚洲一区网站 日本高清二区视频久二区 精品国产美女福利在线 伊人久久艹 国产精品久久久久三级 欧美成人精品第一区二区三区 99久久精品国产自免费 在线观看日韩一区 国产中文字幕一区 成人免费午夜视频 欧美日韩另类在线 久久99国产精品成人欧美 色婷婷中文网 久久天天躁夜夜躁狠狠躁2020 欧美成人伊人久久综合网 国产精品福利资源在线 国产伦精品一区二区三区高清 国产精品亚洲综合色区韩国 亚洲一区欧美日韩 色综合视频 国语自产精品视频在线区 国产高清a 成人国内精品久久久久影 国产在线精品香蕉综合网一区 国产不卡在线看 国产成人精品精品欧美 国产欧美日韩综合精品一区二区三区 韩国电影一区二区 国产在线视频www色 91中文字幕在线一区 国产人成午夜免视频网站 亚洲综合一区二区三区 色综合视频一区二区观看 久久五月网 九九热精品在线观看 国产一区二区三区国产精品 99久热re在线精品996热视频 亚洲国产网 在线视频亚洲一区 日韩字幕一中文在线综合 国产高清一级毛片在线不卡 精品国产色在线 国产高清视频一区二区 精品日本久久久久久久久久 亚洲国产午夜精品乱码 成人免费国产gav视频在线 日韩欧美一区二区在线观看 欧美曰批人成在线观看 韩国电影一区二区 99re这里只有精品6 日韩精品一区二区三区视频 99re6久精品国产首页 亚洲欧美一区二区三区导航 欧美色图一区二区三区 午夜精品视频在线观看 欧美激情在线观看一区二区三区 亚洲热在线 成人国产精品一区二区网站 亚洲一级毛片在线播放 亚洲一区小说区中文字幕 亚洲午夜久久久久影院 国产自产v一区二区三区c 国产精品视频免费 久久调教视频 国产成人91激情在线播放 国产精品欧美亚洲韩国日本久久 久久亚洲日本不卡一区二区 91中文字幕网 成人国产在线视频 国产视频91在线 欧美成人精品第一区二区三区 国产精品福利在线 久久综合九色综合精品 欧美一区二区三区精品 久久国产综合尤物免费观看 久久99青青久久99久久 日韩精品免费 久久国产精品999 91亚洲视频在线观看 国产精品igao视频 色综合区 在线亚洲欧国产精品专区 国产一区二区三区在线观看视频 亚洲精品成人在线 一区二区国产在线播放 中文在线亚洲 亚洲精品第一国产综合野 国产一区二区精品久久 一区二区三区四区精品视频 99热精品久久 中文字幕视频二区 国产成人精品男人的天堂538 99精品影视 美女福利视频一区二区 久久午夜夜伦伦鲁鲁片 综合久久久久久久综合网 国产精品国产欧美综合一区 国产99视频在线观看 国产亚洲女在线精品 婷婷影院在线综合免费视频 国产亚洲3p一区二区三区 91成人爽a毛片一区二区 亚洲一区二区高清 国产欧美亚洲精品第二区首页 欧美日韩导航 亚洲高清二区 欧美激情观看一区二区久久 日韩毛片在线播放 亚洲欧美日韩高清中文在线 亚洲日本在线播放 国产精品一区二区制服丝袜 精品国产一区二区三区不卡 国产不卡在线看 国产欧美网站 四虎永久在线观看视频精品 国产黄色片在线观看 夜夜综合 一本色道久久综合狠狠躁篇 欧美亚洲综合另类在线观看 国产91在线看 伊人久久国产 欧美一区二区在线观看免费网站 国产精品久久久久三级 久久福利 日韩中文字幕a 亚洲午夜久久久久影院 91在线高清视频 国产亚洲一区二区三区啪 久久人精品 国产精品亚洲午夜一区二区三区 综合久久久久久 久久伊人一区二区三区四区 国产综合久久久久久 日韩一区精品视频在线看 国产精品日韩欧美制服 日本精品1在线区 99re视频 无码av免费一区二区三区试看 国产视频1区 日韩欧美中文字幕一区 日本高清中文字幕一区二区三区a 亚洲国产欧美无圣光一区 国产在线视频一区二区三区 欧美国产第一页 在线亚洲欧美日韩 日韩中文字幕第一页 在线不卡一区二区 伊人久久青青 国产精品一区二区在线播放 www.五月婷婷 麻豆久久婷婷国产综合五月 亚洲精品区 久久国产欧美另类久久久 99在线视频免费 伊人久久中文字幕久久cm 久久精品成人免费看 久久这里只有精品首页 88国产精品视频一区二区三区 中文字幕日本在线mv视频精品 国产在线精品成人一区二区三区 伊人精品线视天天综合 亚洲一区二区黄色 国产尤物视频在线 亚洲精品99久久久久中文字幕 国产一区二区三区免费观看 伊人久久大香线蕉综合电影网 国产成人精品区在线观看 日本精品一区二区三区视频 日韩高清在线二区 久久免费播放视频 一区二区成人国产精品 国产精品免费精品自在线观看 亚洲精品视频二区 麻豆国产精品有码在线观看 精品日本一区二区 亚洲欧洲久久 久久中文字幕综合婷婷 中文字幕视频在线 国产成人精品综合在线观看 91精品国产91久久久久福利 精液呈暗黄色 香蕉国产综合久久猫咪 国产专区精品 亚洲精品无码不卡 国产永久视频 亚洲成a人片在线播放观看国产 一区二区国产在线播放 亚洲一区二区黄色 欧美日韩在线观看视频 亚洲精品另类 久久国产综合尤物免费观看 国产一区二区三区国产精品 高清视频一区 国产精品igao视频 国产精品资源在线 久久综合精品国产一区二区三区 www.五月婷婷 精品色综合 99热国产免费 麻豆福利影院 亚洲伊人久久大香线蕉苏妲己 久久电影院久久国产 久久精品伊人 在线日韩理论午夜中文电影 亚洲国产欧洲综合997久久 伊人国产精品 久草国产精品 欧美一区精品二区三区 亚洲成人高清在线 91免费国产精品 日韩精品福利在线 国产一线在线观看 国产不卡在线看 久久99青青久久99久久 亚洲精品亚洲人成在线播放 99久久免费看国产精品 国产日本在线观看 青草国产在线视频 麻豆久久婷婷国产综合五月 国产中文字幕一区 91久久精品国产性色也91久久 国产一区a 国产欧美日韩成人 国产亚洲女在线精品 一区二区美女 中文字幕在线2021一区 在线小视频国产 久久这里只有精品首页 国产在线第三页 欧美日韩中文字幕 在线亚洲+欧美+日本专区 精品国产一区二区三区不卡 久久这里精品 欧美在线va在线播放 精液呈暗黄色 91精品国产手机 91在线免费播放 欧美视频亚洲色图 欧美国产日韩精品 日韩高清不卡在线 精品视频免费观看 欧美日韩一区二区三区四区 国产欧美亚洲精品第二区首页 亚洲韩精品欧美一区二区三区 国产精品视频免费 在线精品小视频 久久午夜夜伦伦鲁鲁片 国产无套在线播放 久热这里只精品99re8久 欧美久久久久 久久香蕉国产线看观看精品蕉 国产成人精品男人的天堂538 亚洲人成网站色7799在线观看 日韩在线第二页 一本色道久久综合狠狠躁篇 国产一区二区三区不卡在线观看 亚洲乱码在线 在线观看欧美国产 久久福利青草精品资源站免费 国产玖玖在线观看 在线亚洲精品 亚洲成aⅴ人在线观看 精品91在线 欧美一区二三区 日韩中文字幕视频在线 日本成人一区二区 日韩免费专区 国内精品在线观看视频 久久国产综合尤物免费观看 国产精品系列在线观看 一本一道久久a久久精品综合 亚洲免费播放 久久精品国产免费 久久人精品 亚洲毛片网站 亚洲成a人一区二区三区 韩国福利一区二区三区高清视频 亚洲精品天堂在线 一区二区三区中文字幕 亚洲国产色婷婷精品综合在线观看 亚洲国产成人久久笫一页 999国产视频 国产精品香港三级在线电影 欧美日韩一区二区三区四区 日韩国产欧美 国产精品99一区二区三区 午夜国产精品理论片久久影院 亚洲精品中文字幕麻豆 亚洲国产高清视频 久久免费手机视频 日韩a在线观看 五月婷婷亚洲 亚洲精品中文字幕麻豆 中文字幕丝袜 www国产精品 亚洲天堂精品在线 亚洲乱码一区 国产日韩欧美三级 久久999精品 伊人热人久久中文字幕 久热国产在线视频 国产欧美日韩在线观看一区二区三区 国产一二三区在线 日韩国产欧美 91精品国产91久久久久 亚洲一区小说区中文字幕 精品一区二区免费视频 国产精品视频免费 国产精品亚洲综合色区韩国 亚洲国产精品成人午夜在线观看 欧美国产日韩精品 中文字幕精品一区二区精品