專利名稱:用于導(dǎo)入和導(dǎo)出分層結(jié)構(gòu)化數(shù)據(jù)的方法和計算機(jī)可讀介質(zhì)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及用于導(dǎo)入和導(dǎo)出分層結(jié)構(gòu)化數(shù)據(jù)的方法和計算機(jī)可讀介質(zhì)。
背景技術(shù):
計算機(jī)軟件應(yīng)用允許用戶生成包含組織成諸如電子數(shù)據(jù)表、日歷、銀行結(jié)單、產(chǎn)品清單、大綱等分層結(jié)構(gòu)的數(shù)據(jù)的文檔與如因特網(wǎng)之類的計算機(jī)網(wǎng)絡(luò)上的其它用戶交換。例如,用戶可使用可擴(kuò)展標(biāo)記語言(XML)程序生成文檔,以在使用不同格式的計算機(jī)系統(tǒng)之間交換分層數(shù)據(jù)。XML文檔具有用戶可定義的與包含在其中的數(shù)據(jù)鄰接的描述性標(biāo)記,使數(shù)據(jù)可被多種多樣的計算機(jī)理解。可從文檔導(dǎo)入數(shù)據(jù)并通過簡單地解析具有描述的標(biāo)記讓用戶觀看。觀看數(shù)據(jù)后,用戶可導(dǎo)出數(shù)據(jù)至新的或編輯的分層格式化文檔以發(fā)送給其它用戶。
然而,解析文檔是一個緩慢而復(fù)雜的需要多個步驟的過程。一些現(xiàn)有的解析程序如XML簡單應(yīng)用編程接口(SAX),都是基于事件的解析程序,在這些解析程序中一次一個地順序讀出XML標(biāo)記。然而,要求用戶記住狀態(tài)并搜索整個文檔以找到所要的XML標(biāo)記。其它解析程序,如文檔對象模型(DOM),是基于樹的解析程序,它將整個XML文件載入存儲器并允許隨機(jī)訪問,因此使它比基于事件的解析程序更容易找到所要的XML標(biāo)記。不過基于樹的解析程序需要遍歷“樹”以找到所要的XML標(biāo)記。而且,這樣的解析程序需要相當(dāng)多的時間和存儲器,這使得它們在分析大型XML文件時不實(shí)用。
因此,目前沒有簡易的方法從分層結(jié)構(gòu)化文檔導(dǎo)入數(shù)據(jù)。也就是說,沒有簡易的方法能可有選擇地搜索文檔查找指定標(biāo)簽或包含用戶感興趣的數(shù)據(jù)的部分,而無需不得不用諸如SAX這樣基于事件分析的程序搜索整個文檔,或者不得不用諸如DOM這樣基于樹的解析程序遍歷樹而同時耗費(fèi)相當(dāng)多的時間和存儲器資源。
同樣,雖然諸如DOM這樣基于樹的解析程序(將整個文件存儲在存儲器中)能夠?qū)С鲎訕浠蚱渌謱訑?shù)據(jù),但是這樣的解析程序受限其固有的相當(dāng)多的時間和存儲器資源的使用。
因此,在本領(lǐng)域內(nèi)需要一種在分層結(jié)構(gòu)化文檔中可有選擇地導(dǎo)入和導(dǎo)出內(nèi)容的方法和系統(tǒng)。正是相對于這些和其它考慮,產(chǎn)生了本發(fā)明。
概述本發(fā)明提供了用于在電子文檔中有選擇地導(dǎo)入和導(dǎo)出數(shù)據(jù)的方法和系統(tǒng)。在一個實(shí)施例中,提供了一種從電子文檔有選擇地導(dǎo)入內(nèi)容的方法。接收一個具有以分層文件結(jié)構(gòu)安排的數(shù)據(jù)的電子文檔。分層文件結(jié)構(gòu)可以是XML。電子文檔中的數(shù)據(jù)包括與其關(guān)聯(lián)的內(nèi)容。數(shù)據(jù)可以包括XML元素、屬性、節(jié)點(diǎn)和文本。指定要導(dǎo)入文檔的指定數(shù)據(jù),并針對指定數(shù)據(jù)執(zhí)行一個動作以導(dǎo)入其所關(guān)聯(lián)的內(nèi)容。動作可包括針對這個指定數(shù)據(jù)解析文檔并提取與其關(guān)聯(lián)的內(nèi)容項。
在本發(fā)明的另一個實(shí)施例中,提供了從計算機(jī)系統(tǒng)的一個源導(dǎo)出數(shù)據(jù)以建立電子文檔的方法。導(dǎo)出從計算機(jī)系統(tǒng)的一個源接收的指定數(shù)據(jù),生成電子文檔。所建立的電子文檔可以具有分層文件結(jié)構(gòu)諸如XML。所建立的文檔可包括XML元素、屬性和節(jié)點(diǎn)。源可以是計算機(jī)系統(tǒng)中的一個客戶機(jī)或服務(wù)器??梢詫?shù)據(jù)導(dǎo)出到數(shù)據(jù)流、存儲器緩沖區(qū)或文件。
本發(fā)明的實(shí)施例還提供用于在電子文檔中有選擇地導(dǎo)入和導(dǎo)出數(shù)據(jù)的計算機(jī)可讀介質(zhì)。有關(guān)本發(fā)明不同方面的其它細(xì)節(jié)將因下面本發(fā)明的詳細(xì)說明而變得顯而易見。
圖1是為本發(fā)明提供一例示性運(yùn)行環(huán)境的計算機(jī)及其關(guān)聯(lián)的外部設(shè)備和網(wǎng)絡(luò)設(shè)備的方框圖。
圖2是方框圖,示出依照本發(fā)明實(shí)施例導(dǎo)入電子文檔的例示性體系結(jié)構(gòu)。
圖3是方框圖,示出依照本發(fā)明實(shí)施例導(dǎo)出數(shù)據(jù)建立電子文檔的例示性體系結(jié)構(gòu)。
圖4是流程圖,示出依照本發(fā)明實(shí)施例導(dǎo)入電子文檔的例示性例程所執(zhí)行的步驟。
圖5是流程圖,示出依照本發(fā)明實(shí)施例導(dǎo)出數(shù)據(jù)建立電子文檔的例示性例程所執(zhí)行的步驟。
詳細(xì)說明參考上述附圖進(jìn)行下面本發(fā)明的一個實(shí)施例的說明。本發(fā)明集中于用于導(dǎo)入和導(dǎo)出電子文檔中的分層結(jié)構(gòu)化數(shù)據(jù)的方法和系統(tǒng)。
操作環(huán)境圖1和下列討論旨在提供對適當(dāng)計算環(huán)境的簡短、概括的說明,可在這個計算環(huán)境中實(shí)現(xiàn)本發(fā)明。雖然將在與個人計算機(jī)結(jié)合的操作系統(tǒng)上運(yùn)行的應(yīng)用程序接口的一般背景中描述本發(fā)明,但是本領(lǐng)域的熟練技術(shù)人員將認(rèn)識到還可以結(jié)合其它程序模塊一起實(shí)現(xiàn)本發(fā)明。一般地,程序模塊包括完成特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、組件、數(shù)據(jù)結(jié)構(gòu)等。此外,本領(lǐng)域的熟練技術(shù)人員將懂得本發(fā)明可以實(shí)現(xiàn)于其它計算機(jī)系統(tǒng)配置,包括手提設(shè)備、多處理器系統(tǒng)、基于微處理器或可編程消費(fèi)電子產(chǎn)品、蜂窩電話、小型機(jī)、大型計算機(jī)等等設(shè)備。本發(fā)明還可以實(shí)現(xiàn)于分布式計算環(huán)境,在其中可通過由通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備完成任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于本地和遠(yuǎn)程兩者的存儲器存儲設(shè)備上。
參考圖1,實(shí)現(xiàn)本發(fā)明的典型系統(tǒng)包括常規(guī)個人計算機(jī)20,它包括處理器單元21、系統(tǒng)存儲器22和將系統(tǒng)存儲器連接至處理器單元21的系統(tǒng)總線23。系統(tǒng)存儲器22包括只讀存儲器(ROM)24和隨機(jī)存取存儲器(RAM)25?;緦?dǎo)入/導(dǎo)出系統(tǒng)26存儲在ROM24中,包含幫助在個人計算機(jī)20內(nèi)部件之間傳送信息的基本例程,如在起動期間。個人計算機(jī)20還包括硬盤驅(qū)動器27、磁盤驅(qū)動器28,例如用于讀寫可移動磁盤29,和光盤驅(qū)動器75,例如用于讀取CD-ROM光盤31或讀寫其它光學(xué)介質(zhì)。硬盤驅(qū)動器27、磁盤驅(qū)動器28和光盤驅(qū)動器75分別通過硬盤驅(qū)動器接口32、磁盤驅(qū)動器接口33和光盤驅(qū)動器接口34連接到系統(tǒng)總線23。驅(qū)動器及其相關(guān)的計算機(jī)可讀介質(zhì)為個人計算機(jī)20提供非易失的存儲。盡管以上描述的計算機(jī)可讀介質(zhì)指的是硬盤、可移動磁盤和CD-ROM光盤,但本領(lǐng)域熟練技術(shù)人員應(yīng)該懂得可被計算機(jī)讀取的其它類型介質(zhì),如磁帶、閃存卡、數(shù)字視盤、伯努利盒(Bernoulli cartridge)等等,也可以用于典型操作環(huán)境。
許多程序模塊可存儲在驅(qū)動器和RAM25中,包括操作系統(tǒng)35、一個或多個諸如字處理程序(或其它類型程序)這樣的應(yīng)用程序37、導(dǎo)入API30、導(dǎo)出API40和其它程序模塊(未示出)。
用戶可通過鍵盤76和如鼠標(biāo)42這樣的定點(diǎn)設(shè)備向個人計算機(jī)20輸入命令和信息。其它輸入設(shè)備(未示出)可包括話筒、游戲桿、游戲墊、衛(wèi)星電視天線、掃描儀等等。這些和其它導(dǎo)入設(shè)備常常通過與系統(tǒng)總線連接的串行接口46連接至處理器單元21,但也可用其它接口連接,如游戲端口或通用串行總線(USB)。監(jiān)視器47或其它類型顯示設(shè)備也通過諸如視頻適配器48這樣的接口連接到系統(tǒng)總線23。除監(jiān)視器之外,個人計算機(jī)一般包括其它外部輸出設(shè)備(未示出),如喇叭或打印機(jī)。
個人計算機(jī)20可在網(wǎng)絡(luò)化環(huán)境中運(yùn)行,使用與一個或多個連接到諸如遠(yuǎn)程計算機(jī)49這樣的遠(yuǎn)程計算機(jī)的邏輯連接。遠(yuǎn)程計算機(jī)49可以是服務(wù)器、路由器、對等設(shè)備或其它普通網(wǎng)絡(luò)節(jié)點(diǎn),且一般包括許多或所有相對于個人計算機(jī)20所述的部件,盡管在圖1中只示出存儲器存貯設(shè)備50。圖1中所圖示的邏輯連接包括局域網(wǎng)(LAN)51和廣域網(wǎng)(WAN)52。這樣的網(wǎng)絡(luò)環(huán)境普遍存在于辦公室、企業(yè)級計算機(jī)網(wǎng)絡(luò)、企業(yè)內(nèi)部互聯(lián)網(wǎng)和國際互聯(lián)網(wǎng)。
當(dāng)在LAN網(wǎng)絡(luò)環(huán)境中使用時,個人計算機(jī)20通過網(wǎng)絡(luò)接口53連接到LAN51。當(dāng)在WAN網(wǎng)絡(luò)環(huán)境中使用時,個人計算機(jī)20一般包括調(diào)制解調(diào)器54或其它在諸如國際互聯(lián)網(wǎng)這樣的WAN52上建立通信的工具。可以是內(nèi)置或外置的調(diào)制解調(diào)器54通過串行接口46連接至系統(tǒng)總線23。在網(wǎng)絡(luò)環(huán)境中,相對于個人計算機(jī)20所述的程序模塊或其部分可存儲在遠(yuǎn)程存儲器存貯設(shè)備中。應(yīng)理解所示網(wǎng)絡(luò)連接是典型的且其它在計算機(jī)之間建立通信連接的方法也可利用。
操作圖2是一方框圖,示出結(jié)合本發(fā)明的一個實(shí)施例所使用的例示性軟件體系結(jié)構(gòu)200。這個結(jié)構(gòu)包括導(dǎo)入應(yīng)用程序接口(API)30,用于從具有以分層文件結(jié)構(gòu)安排的數(shù)據(jù)的電子文檔中導(dǎo)入內(nèi)容。在一個實(shí)施例中,電子文檔是由與各個內(nèi)容項關(guān)聯(lián)的標(biāo)記、屬性和節(jié)點(diǎn)(子樹)組成的XML文檔。僅為了舉例且不限制在此所述的本發(fā)明,以下是API30可能處理的例示性XML文件
<pre listing-type="program-listing"><![CDATA[<SOAP-ENVEnvelope xmlnsSOAP-ENV="http//schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENVBody><CancelResponse xmlns="http//schemas.microsoft.com/billing"> <Services><Service Name="Some service"/> <!-More Services here--></Services><Subscriptions> <Subscription ID="Subscription ID"> <BalanceImpacts> <BalaneeImpact ImpactType="Type of impact"><Amount>Non-zero amount of impact</Amount> </BalanceImpact> <!--More Balance Impacts here--> </BalanceImpacts> </Subscription> <!--More Subscriptions here--></Subscriptions><Currency>Account Currency type</Currency><Amount>Total balance impact</Amount> </CancelResponse> </SOAP-ENVBody></SOAP-ENVEnvelope>]]></pre>如圖2所示,導(dǎo)入API30從上述圖1中的客戶計算機(jī)20接收電子文檔。在另一個實(shí)施例中,還可從服務(wù)器諸如遠(yuǎn)程計算機(jī)服務(wù)器49接收電子文檔。導(dǎo)入API30與解析程序60聯(lián)系,用以針對定義電子文檔分層結(jié)構(gòu)的數(shù)據(jù)(即元素、屬性、節(jié)點(diǎn)和文本)及其關(guān)聯(lián)的內(nèi)容解析電子文檔。導(dǎo)入API30管理解析程序60用以指定要從文檔解析的特定數(shù)據(jù)。在一個實(shí)施例中,解析程序60可以是一個基于事件的解析程序,如華盛頓雷德蒙的微軟公司的OFFICE XMLPARSER。解析程序60也可以是基于樹的解析程序,如文檔對象模型(DOM)解析程序。API30比直接使用基于事件和基于樹的解析程序更有利,因為允許用戶指明他要從文檔中提取的特定數(shù)據(jù)。如本領(lǐng)域熟練技術(shù)人員所知道的,基于事件解析程序按順序一次一行地掃描文檔且一次提供一個數(shù)據(jù)項(如一標(biāo)記),要求用戶記住狀態(tài)以找到所要的數(shù)據(jù)?;跇涞慕馕龀绦?qū)⒄麄€文檔載入存儲器,但用戶仍需要遍歷所載入的文檔以找到所要的數(shù)據(jù)。將在下面參考圖4更詳細(xì)地描述前面所指出的優(yōu)點(diǎn)。
導(dǎo)入API30還與回調(diào)組件50聯(lián)系?;卣{(diào)組件50與導(dǎo)入API30通信以在提取第一數(shù)據(jù)之后確定要從電子文檔導(dǎo)入的附加內(nèi)容項。例如,如果電子文檔中的一個元素或節(jié)點(diǎn)與多于一個內(nèi)容項相關(guān)(如名稱的列表),則導(dǎo)入API30將提取第一個名稱,然后訪問回調(diào)組件50來提取下一名稱直到已經(jīng)提取表中所有的名稱。換句話說,對于項的列表,導(dǎo)入API30能順序地將表中每一項傳遞至回調(diào)組件50中,在那里API30的客戶機(jī)20隨后能對該項做它想做的操作。在導(dǎo)入過程中,客戶機(jī)20也能用回調(diào)組件50反過來與API30通信以改變對剩余數(shù)據(jù)的處理。在不同實(shí)施例中,由API30導(dǎo)入的內(nèi)容70可以是數(shù)據(jù)流、存儲器緩沖區(qū)或文件。
現(xiàn)在參考圖3,示出一個方框圖,說明與本發(fā)明實(shí)施例結(jié)合使用的例示性軟件體系結(jié)構(gòu)300。這個結(jié)構(gòu)包括用于從一個源導(dǎo)出數(shù)據(jù)建立電子文檔90的導(dǎo)出應(yīng)用程序接口(API)40。在一個實(shí)施例中,所建立的文檔90具有分層文件結(jié)構(gòu),如XML文檔。如圖3所示,導(dǎo)出API40從客戶計算機(jī)20接收數(shù)據(jù)。在另一個實(shí)施例中,可從服務(wù)器接收數(shù)據(jù),諸如遠(yuǎn)程計算機(jī)服務(wù)器49。導(dǎo)出的數(shù)據(jù)可包括文本字符串或其它數(shù)據(jù)類型變量的固定列表。
導(dǎo)出API40與編寫器80聯(lián)系,用以接收要導(dǎo)出的由API40指定的數(shù)據(jù)并使用這個數(shù)據(jù)在所建立的電子文檔90中編寫元素、節(jié)點(diǎn)、屬性或文本。導(dǎo)出API40管理編寫器80,用以指定要導(dǎo)出的特定數(shù)據(jù)。在一個實(shí)施例中,編寫器80可以是一XML導(dǎo)出器組件,如華盛頓雷德蒙的微軟公司的OFFICE XMLEXPORTER。導(dǎo)出API40允許單個API調(diào)用編寫多個數(shù)據(jù)片(如XML內(nèi)容)或整個文件。這比直接訪問編寫器80更有利,因為編寫器80一次只允許編寫一個數(shù)據(jù)片。應(yīng)該理解,用于實(shí)現(xiàn)導(dǎo)出API40的語法非常類似于導(dǎo)入API30。這樣,在本發(fā)明的實(shí)施例中,用戶可使用導(dǎo)出API40和導(dǎo)入API30來編寫及以后讀出用戶自己的數(shù)據(jù),盡管不要求用戶兩者皆用。前面所指出的導(dǎo)出API40的優(yōu)點(diǎn)將在下面參考圖5描述。
圖4是一流程圖,示出一例示性例程300,用于依照本發(fā)明實(shí)施例在一個計算機(jī)系統(tǒng)中,可有選擇地從諸如XML文檔這樣的電子文檔導(dǎo)入內(nèi)容。為說明的目的,圖4是根據(jù)圖1和2描述的。
例程400開始于方框410,在這里導(dǎo)入API30從個人計算機(jī)20或遠(yuǎn)程計算機(jī)服務(wù)器49接收一個電子文檔。在方框415,導(dǎo)入API30在這個文檔中指定要導(dǎo)入的數(shù)據(jù)。用戶可在應(yīng)用程序100(可能是字處理器)指定要導(dǎo)入的特定數(shù)據(jù),接著應(yīng)用程序100將這個信息傳送給導(dǎo)入API30。例如,在上面列出的例示性XML文檔中,用戶可能感興趣于<Service>元素內(nèi)容、<Subscription>節(jié)點(diǎn)內(nèi)容、<Currency>元素內(nèi)容(例如記賬貨幣類型)、<Amount>元素內(nèi)容(例如總結(jié)余影響),但不關(guān)心不向用戶傳達(dá)任何有用信息的<SOAP-ENV>元素和屬性。通過選擇特定的節(jié)點(diǎn)和元素,用戶也選擇了包含在它們當(dāng)中的所有元素。例如,<Subscription>節(jié)點(diǎn)包含了<BalanceImpacts>節(jié)點(diǎn),其中<BalanceImpact>是一個任意長度的元素列表。<Services>元素還包含ServiceNames的任意列表。
例程400在方框420繼續(xù),在這里解析程序60搜索電子文檔查找由導(dǎo)入API30指定的數(shù)據(jù)(即節(jié)點(diǎn)和元素)。在方框425,導(dǎo)入API30從已解析的文檔的數(shù)據(jù)提取內(nèi)容。如上簡述,在一個實(shí)施例中,解析程序60是基于事件的解析程序,在其中掃描文檔中的每個元素,并由導(dǎo)入API30提取在每個元素中所包含的內(nèi)容。例如,解析程序60針對先前由用戶指定的<Services>元素掃描文檔,并且導(dǎo)入API30從<Service>元素屬性“Name”提取文本字符串“Someservice”。以相似的方式掃描所有元素,直到所有與指定的元素關(guān)聯(lián)的內(nèi)容都已經(jīng)從文檔中提取出來。
例程400在方框430繼續(xù),在這里導(dǎo)入API30確定是否有另外的內(nèi)容項包含在指定要導(dǎo)入的元素中。如果沒有另外的內(nèi)容項,例程400隨后結(jié)束。然后客戶機(jī)20可選擇用提取的內(nèi)容建立一個新文檔(如使用導(dǎo)出API40)。反過來,如果有另外的內(nèi)容項包含在指定要導(dǎo)入的元素中,則例程400返回到方框425,在那里導(dǎo)入API30提取下一個另外的內(nèi)容項。例如,在導(dǎo)入API30從<Service>元素的“Name”屬性中提取“Some service”字符串之后,API30確定如果還有另外的<Service>元素包含“Name”屬性,則從每一個中提取內(nèi)容,并將它傳遞給回調(diào)組件50以打印出所要的字符串。
在圖4中所示的例程,用于使用API30可用處理XML數(shù)據(jù)的計算機(jī)代碼實(shí)現(xiàn),如下所示的例示性代碼實(shí)例。
導(dǎo)入API的例示性使用Illustrative Use of Import APIMsoFImportXML(pistm,F(xiàn)MyCallback(),NULL,"o CancelResponse;o Services;(*oService;a0 Name;c;p1;)c;o Subscriptions;(*o Subscription;al ID;oBalanceImpacts;p2;(*o BalanceImpact;a2 ImpactType;e3 Amount;c;p3;)c;c;)c;e4Currency;e5 Amount;p4;f;",NULL,msoffixSOAP);在上面所示導(dǎo)入API30的例示性使用中,客戶機(jī)20將傳入一個動作字符串,這個動作字符串指定所要的內(nèi)容(例如一個或多個<Service>元素的“Name”屬性)。動作字符串是指示要搜索的內(nèi)容或在某個特殊點(diǎn)上所期望的內(nèi)容的各個動作的序列。在上面的例子中,“o CancelResponse”動作表示到XML文檔中下一個<CancelResponse>開始元素,″al ID″動作表示拷貝當(dāng)前元素的“ID”屬性至一組提取的字符串的入口#1,客戶機(jī)能在其回調(diào)中或在導(dǎo)入API結(jié)束后查看這組字符串,“p2”動作表示調(diào)用回調(diào)的第二種情況,等等。動作字符串還可包含動作組,它們是標(biāo)記要以某種方式處理的一連串動作的方法。在上面的例子中,動作組由括號包圍的有關(guān)動作表示,在這里標(biāo)有星號的動作組表示所指示的這組動作可重復(fù)0次或多次,構(gòu)成一個列表。動作組的另一個例子(未在上述例示性應(yīng)用中示出)指示一組動作或期望在XML文檔中給定點(diǎn)出現(xiàn)的內(nèi)容片。
例示性的回調(diào)函數(shù)
<pre listing-type="program-listing"><![CDATA[BOOL FMyCallback(void*pvClient,MSOHISD*phisd,MSOXPS*rgxps,intiState){ switch(iState){ case1//Processing the<Services>listprintf(″<Service>Name attribute=%s\n",rgxps
.wz);break; case2//Processing the<Subscriptions>outer listprintf(″<Subscription>IDattribute=%s\n",rgxps[1].wz);break; case3//Processing the<BalanceImpacts>inner nested listprintf("<BalanceImpact>ImpactType attribute=%s\n",rgxps[2].wz);printf(″<Amount>element text=%s\n",rgxps[3].wz);break; case4//Processing final items after the lists aboveprintf("Final<Currency>element text=%s\n",rgxps[4].wz);printf("Final<Amount>element text=%s\n",rgxps[5].wz);break; } return TRUE;}]]></pre>應(yīng)該理解,導(dǎo)入API30在客戶機(jī)20不指定回調(diào)函數(shù)時也可使用,如當(dāng)文檔不包含任何列表或重復(fù)元素時。例如,如果XML文件只包含一個<Service>元素、一個<BalanceImpact>節(jié)點(diǎn)和一個<Subscription>節(jié)點(diǎn)時,導(dǎo)入API30能夠以如下所示的一行代碼導(dǎo)入文件
<pre listing-type="program-listing"><![CDATA[WCHAR wzServiceName[255],wzSubscriptionID[10],wzBalanceImpactImpactType[255],wzBalanceImpactAmount[20],wzCurrency[20],wzTotalAmount[20];MSOXPS rgxps[6];MsoInitXpsBuffer(&rgxps
,wzServiceName,255);MsoInitXpsBuffer(&rgxps[1],wzSubscriptionID,10);MsoInitXpsBuffer(&rgxps[2],wzBalanceImpactImpactType,255);MsoInitXpsBuffer(&rgxps[3],wzBalanceImpactAmount,20);MsoInitXpsBuffer(&rgxps[4],wzCurrency,20);MsoInitXpsBuffer(&rgxps[5],wzTotalAmount,20);MsoFImportXML(pistm,NULL,NULL,"o CancelResponse;o Services;oService;a0 Name;c;c;o Subscriptions;o Subscription;al ID;o BalanceImpacts;oBalanceImpact;a2 ImpactType;e3 Amount;c;c;c;c;e4 Currency;e5 Amount;f;",rgxps,msoffixSOAP);printf("<Service>Name attribute=%s\n", wzServiceName);printf("<Subscription>ID attribute=%s\n",wzSubscriptionID);printf("<BalanceImpact>ImpactType attribute=%s\n",wzBalanceImpactImpactType);printf("<Amount>element text=%s\n", wzBalanceImpactAmount);printf("Final<Currency>element text=%s\n", wzCurrency);printf("Final<Amount>element text=%s\n", wzTotalAmount);]]></pre>這樣,導(dǎo)入API30方便地允許用戶可有選擇地用單行代碼從分層結(jié)構(gòu)化文檔導(dǎo)入內(nèi)容,以及用單行代碼和回調(diào)語句從包含列表的分層結(jié)構(gòu)化文檔中可有選擇地導(dǎo)入內(nèi)容。如上簡單討論的,API30可作為數(shù)據(jù)流、存儲器緩沖區(qū)或文件導(dǎo)入內(nèi)容。
圖5是流程圖,示出一個例示性例程,用于依照本發(fā)明實(shí)施例在計算機(jī)環(huán)境中有選擇地導(dǎo)出內(nèi)容建立諸如XML文件這樣的電子文檔。為說明的目的,圖5是根據(jù)圖1和3描述的。
例程500始于方框510,在這里導(dǎo)出API40指定要導(dǎo)出的數(shù)據(jù)。如上簡短描述的,數(shù)據(jù)可包括文本字符串或變量的固定列表。用戶可指定在應(yīng)用程序100(可以是字處理器)所要導(dǎo)出的特定數(shù)據(jù),接著應(yīng)用程序100將此信息傳送給到導(dǎo)出API40。在指定要導(dǎo)出數(shù)據(jù)中,用戶還將指定在所建立的文檔中如何表示數(shù)據(jù)。例如,用戶可指定文本字符串“Services”表示為元素而“Name”表示為“Service”元素的屬性。在方框520,導(dǎo)出API40將指定的數(shù)據(jù)發(fā)送到編寫器80,編寫器80使用指定的數(shù)據(jù)建立文檔。
在圖5中所示的例程可作為一個函數(shù)調(diào)用實(shí)現(xiàn),這個函數(shù)調(diào)用使用下面所示的例示性代碼建立上面所列的例示性XML文件。
導(dǎo)出API的例示性使用MsoFExportXML(pistm,"n o;o CancelResponse;o Services;e Service;a Name"Some service";c;o Subscriptions;o Subscription;a ID"Subscription ID";oBalanceImpacts;o BalanceImpact;a ImpactType"Type of impact";e Amount"Non-zero amount of impact";c;c;c;c;e Currency"Account Currency type";e Amount"Total balance impact";c;",msogrffexSOAP)在上面所示的導(dǎo)出API例示性使用中,客戶機(jī)20傳入一個用與導(dǎo)入API 30例示性使用中的動作字符串類似的方式格式化的動作字符串。這里,動作字符串是指示要寫到XML文檔的內(nèi)容的各個動作的序列。在上例中,“e Amount’Total balance impact’”動作表示編寫包含文本“Total balance impact”的XML元素<Amount>,“c”動作表示編寫匹配當(dāng)前范圍的結(jié)束元素,等等。上面的例示性代碼行可生成沒有列表的完整XML文檔。所生成的文檔對應(yīng)于上面圖4的說明中所示的非列表導(dǎo)入代碼實(shí)例(即沒用回調(diào)函數(shù)),并能被這個導(dǎo)入代碼導(dǎo)入。
<pre listing-type="program-listing"><![CDATA[MSOHEXS hexs;MsoFInitExportXML(pistm,&hexs);MsoFExportXMLContents(&hexs,"n o;o CancelResponse;o Services;");while(FSomeItemsLeftInMyList(wzServiceName))//Fill out wzServiceName withcurrent service string.MsoFExportXMLContents2(&hexs,"e Service;a Name%0;",&wzServiceName);//Write<Service Name="Some service">MsoFExportXMLContents(&hexs,"c;");//And so on for the rest of the tags...MsoFFinishExportXML(&hexs);]]></pre>上面例示性代碼行可用于建立有列表的XML文件。所建立的文件對應(yīng)于上面在圖4說明中所示的列表導(dǎo)入代碼實(shí)例(即用回調(diào)函數(shù)),并能被這導(dǎo)入代碼導(dǎo)入。這樣,導(dǎo)出API40方便地允許用戶可有選擇地導(dǎo)出內(nèi)容,一次包括多個元素和屬性,用單行代碼建立分層結(jié)構(gòu)化文檔,以及僅用幾行代碼建立包含列表的分層結(jié)構(gòu)化文檔。
如上所述,可實(shí)現(xiàn)一個應(yīng)用程序接口(API)用于從諸如XML文件這樣的分層結(jié)構(gòu)化文檔中導(dǎo)入內(nèi)容。這個API結(jié)合解析程序運(yùn)行,以掃描文檔及從選定的元素、節(jié)點(diǎn)、屬性和文本中提取內(nèi)容。這個API還利用回調(diào)組件處理所提取的內(nèi)容(如從列表中)。這個導(dǎo)入API允許指定要從文檔中提取的特定數(shù)據(jù)。這比直接使用基于事件的解析程序有利,它們按順序一次從文檔中提供一個內(nèi)容項;這比直接使用基于樹的解析程序有利,它們需要遍歷所載入的文件以找到所要的數(shù)據(jù)。
還可以實(shí)現(xiàn)一個API用于導(dǎo)出數(shù)據(jù)建立諸如XML文件這樣的分層結(jié)構(gòu)化文檔。這個API結(jié)合編寫器運(yùn)行以接收數(shù)據(jù)并導(dǎo)出作為分層結(jié)構(gòu)化文檔中的元素、節(jié)點(diǎn)、屬性和文本的數(shù)據(jù)。導(dǎo)出API允許在一次API調(diào)用中編寫多個數(shù)據(jù)片(如XML內(nèi)容)或整個文件。這比使用一個編寫器(諸如一個XML編寫器)有利得多,因為編寫器一次只寫一個數(shù)據(jù)片。應(yīng)該理解導(dǎo)入API30和導(dǎo)出API40可以用被管理的或非被管理的代碼實(shí)現(xiàn)。對于本領(lǐng)域熟練技術(shù)人員,通過考慮在此公開的本發(fā)明的說明書和實(shí)踐,本發(fā)明的其它實(shí)施例將是顯而易見的。
權(quán)利要求
1.一種從電子文檔中有選擇地導(dǎo)入內(nèi)容的方法,包括接收具有數(shù)據(jù)和與所述數(shù)據(jù)關(guān)聯(lián)的內(nèi)容項的電子文檔,其特征在于,所述數(shù)據(jù)是用分層文件結(jié)構(gòu)安排的;指定在所述電子文檔中與至少一個內(nèi)容項關(guān)聯(lián)的特定數(shù)據(jù);以及針對所述指定的數(shù)據(jù)執(zhí)行一個動作以導(dǎo)入所述內(nèi)容。
2.如權(quán)利要求1所述的方法,其特征在于,所述針對所述指定的數(shù)據(jù)執(zhí)行一個動作以導(dǎo)入所述內(nèi)容包括下列步驟針對所述指定的數(shù)據(jù)解析所述電子文檔;以及從所述電子文檔提取與所述指定的數(shù)據(jù)關(guān)聯(lián)的第一個內(nèi)容項。
3.如權(quán)利要求2所述的方法,其特征在于,所述針對所述指定的數(shù)據(jù)執(zhí)行一個動作以導(dǎo)入所述內(nèi)容還包括在從所述電子文檔提取與所述指定的數(shù)據(jù)關(guān)聯(lián)的第一個內(nèi)容項之后,確定是否還有任何另外的與所述指定的數(shù)據(jù)關(guān)聯(lián)的內(nèi)容項;以及如果有另外的與所述指定的數(shù)據(jù)關(guān)聯(lián)的內(nèi)容項,從所述電子文檔提取與所述指定的數(shù)據(jù)關(guān)聯(lián)的下一個內(nèi)容項。
4.如權(quán)利要求1所述的方法,其特征在于,所述分層文件結(jié)構(gòu)是XML。
5.如權(quán)利要求1所述的方法,其特征在于,所述指定的內(nèi)容是一個XML元素。
6.如權(quán)利要求1所述的方法,其特征在于,所述指定的內(nèi)容是一個XML屬性。
7.如權(quán)利要求1所述的方法,其特征在于,是一個XML節(jié)點(diǎn)。
8.如權(quán)利要求1所述的方法,其特征在于,所述指定的內(nèi)容是文本。
9.如權(quán)利要求1所述的方法,其特征在于,所述內(nèi)容是從一個數(shù)據(jù)流導(dǎo)入的。
10.如權(quán)利要求1所述的方法,其特征在于,所述內(nèi)容是從一個存儲器緩沖區(qū)導(dǎo)入的。
11.如權(quán)利要求1所述的方法,其特征在于,所述內(nèi)容是從一個文件導(dǎo)入的。
12.一種具有計算機(jī)可執(zhí)行組件的計算機(jī)可讀介質(zhì),所述可執(zhí)行組件在一個計算機(jī)系統(tǒng)中從一個電子文檔導(dǎo)入內(nèi)容,包括一個導(dǎo)入組件用于,接收具有包含來自所述計算機(jī)系統(tǒng)中一個源的內(nèi)容的數(shù)據(jù)的電子文檔,其特征在于,所述電子文檔具有分層文件結(jié)構(gòu);指定與所述電子文檔中至少一個內(nèi)容項關(guān)聯(lián)的特定數(shù)據(jù);以及從所述電子文檔提取與所述指定的數(shù)據(jù)關(guān)聯(lián)的內(nèi)容項。
13.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),具有更多的計算機(jī)可執(zhí)行組件,包括一個解析程序組件用于,針對所述指定的數(shù)據(jù)解析所述電子文檔;以及將所述指定的文檔發(fā)送到所述導(dǎo)入組件。
14.如權(quán)利要求13所述的計算機(jī)可讀介質(zhì),其特征在于,所述解析程序組件是基于事件的。
15.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),具有更多的計算機(jī)可執(zhí)行組件,包括一個回調(diào)組件,用于處理從所述電子文檔提取的與所述指定數(shù)據(jù)關(guān)聯(lián)的內(nèi)容項。
16.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述至少一個內(nèi)容項包括一個文本字符串。
17.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述分層文件結(jié)構(gòu)是XML。
18.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述指定的內(nèi)容是一個XML元素。
19.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述指定的內(nèi)容是一個XML屬性。
20.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述指定的內(nèi)容是一個XML節(jié)點(diǎn)。
21.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述指定的內(nèi)容是文本。
22.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述源是所述計算機(jī)系統(tǒng)中的一個客戶機(jī)。
23.如權(quán)利要求12所述的計算機(jī)可讀介質(zhì),其特征在于,所述源是所述計算機(jī)中的一個服務(wù)器。
24.一種在計算機(jī)系統(tǒng)中從一個源導(dǎo)出數(shù)據(jù)建立電子文檔的方法,包括從所述源接收所述數(shù)據(jù);指定一組要導(dǎo)出到所述電子文檔的數(shù)據(jù);以及導(dǎo)出所述數(shù)據(jù)組建立所述電子文檔。
25.如權(quán)利要求24所述的方法,其特征在于,所述建立的文檔具有分層文件結(jié)構(gòu)。
26.如權(quán)利要求25所述的方法,其特征在于,所述分層文件結(jié)構(gòu)是XML。
27.如權(quán)利要求24所述的方法,其特征在于,所述導(dǎo)出所述數(shù)據(jù)組建立所述電子文檔包括建立至少一個XML元素。
28.如權(quán)利要求24所述的方法,其特征在于,所述導(dǎo)出所述數(shù)據(jù)組建立所述電子文檔包括建立至少一個XML屬性。
29.如權(quán)利要求24所述的方法,其特征在于,所述導(dǎo)出所述數(shù)據(jù)組建立所述電子文檔包括建立至少一XML節(jié)點(diǎn)。
30.如權(quán)利要求24所述的方法,其特征在于,所述導(dǎo)出所述數(shù)據(jù)組建立所述電子文檔包括建立文本。
31.如權(quán)利要求24所述的方法,其特征在于,所述指定的數(shù)據(jù)組被導(dǎo)出到一個數(shù)據(jù)流。
32.如權(quán)利要求24所述的方法,其特征在于,所述指定的數(shù)據(jù)組被導(dǎo)出到一個存儲緩沖區(qū)。
33.如權(quán)利要求24所述的方法,其特征在于,所述指定的數(shù)據(jù)組被導(dǎo)出到一個文件。
34.一種具有計算機(jī)可執(zhí)行組件的計算機(jī)可讀介質(zhì),所述可執(zhí)行組件用于在計算機(jī)系統(tǒng)從一個源導(dǎo)出數(shù)據(jù)建立電子文檔,包括導(dǎo)出組件用于,從所述源接收所述數(shù)據(jù);以及指定一組要導(dǎo)出到所述電子文檔的數(shù)據(jù);以及編寫器組件用于從所述導(dǎo)出組件接收所述指定的數(shù)據(jù)組并導(dǎo)出所述指定的數(shù)據(jù)組建立所述電子文檔。
35.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述建立的電子文檔具有分層文件結(jié)構(gòu)。
36.如權(quán)利要求35所述的計算機(jī)可讀介質(zhì),其特征在于,所述分層文件結(jié)構(gòu)是XML。
37.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述導(dǎo)出所述指定的數(shù)據(jù)組建立所述電子文檔包括建立至少一個XML元素。
38.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述導(dǎo)出所述指定的數(shù)據(jù)組建立所述電子文檔包括建立至少一個XML屬性。
39.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述導(dǎo)出所述指定的數(shù)據(jù)組建立所述電子文檔包括建立至少一個XML節(jié)點(diǎn)。
40.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述導(dǎo)出所述指定的數(shù)據(jù)組建立所述電子文檔包括建立文本。
41.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述源是所述計算機(jī)系統(tǒng)中的一個客戶機(jī)。
42.如權(quán)利要求34所述的計算機(jī)可讀介質(zhì),其特征在于,所述源是所述計算機(jī)系統(tǒng)中的一個服務(wù)器。
全文摘要
提供一種方法和計算機(jī)可讀介質(zhì),用于在電子文檔中有選擇地導(dǎo)入和導(dǎo)出數(shù)據(jù)。可實(shí)現(xiàn)一種導(dǎo)入應(yīng)用程序接口(API),用于從諸如XML文件這樣的分層結(jié)構(gòu)化文檔導(dǎo)入內(nèi)容。所述導(dǎo)入API結(jié)合解析程序運(yùn)行,用以掃描文檔和從選定的元素、節(jié)點(diǎn)、屬性和文本中提取內(nèi)容。所述導(dǎo)入API還可利用回調(diào)組件處理所提取內(nèi)容??蓪?shí)現(xiàn)一種導(dǎo)出應(yīng)用程序接口用以導(dǎo)出數(shù)據(jù)建立分層結(jié)構(gòu)化文檔,如XML文件。所述導(dǎo)出API結(jié)合編寫器運(yùn)行,用以接收數(shù)據(jù)并導(dǎo)出作為分層結(jié)構(gòu)化文檔中的元素、節(jié)點(diǎn)、屬性和文本的數(shù)據(jù)。
文檔編號G06F17/21GK1504925SQ20031012070
公開日2004年6月16日 申請日期2003年11月27日 優(yōu)先權(quán)日2002年11月27日
發(fā)明者W·D·珀倫, W D 珀倫 申請人:微軟公司