曝光臺(tái) 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費(fèi)者
息中包含許多相關(guān)信息是因?yàn)椋核沟媒邮照吣軌蚋奖愕貜南⒅刑崛⌒畔,而不必使用?br />
獨(dú)的A P I;更重要的是,如果消息是為了審計(jì)等用途而進(jìn)行的歸檔,將所有內(nèi)容放在一起便于存
儲(chǔ)。
2. 用于永久性數(shù)據(jù)的X M L
消息的設(shè)計(jì)主要是由動(dòng)態(tài)信息模型決定的。相反,當(dāng)將X M L用于永久性數(shù)據(jù)時(shí),靜態(tài)模型
是至關(guān)重要的。
(1) 一個(gè)文檔有多大
在設(shè)計(jì)過程中,最困難的部分莫過于決定數(shù)據(jù)的粒度:一個(gè)文檔中應(yīng)該包括多少內(nèi)容?
對于有些應(yīng)用來說,一個(gè)包含幾千兆字節(jié)的X M L文檔是比較適宜的,而有些應(yīng)用寧愿使用
小文檔。X M L不太適于直接訪問;就當(dāng)前技術(shù)而言,如果要訪問這樣一個(gè)大文檔的任何部分,
都必須解析整個(gè)文檔,這可能要耗費(fèi)幾個(gè)小時(shí)。
從另一個(gè)極端看,擁有許許多多小文檔也不太理想,因?yàn)樗豢赡芾肵 M L豐富的結(jié)構(gòu)來
表示信息模型中的關(guān)系。
有時(shí),當(dāng)業(yè)務(wù)對象非常大而且內(nèi)部結(jié)構(gòu)很復(fù)雜時(shí),自然會(huì)將每個(gè)對象映射為一個(gè)X M L文檔。
例如,在人力資源系統(tǒng)中,自然要為每個(gè)職員的記錄使用一個(gè)X M L文檔,或者在病歷系統(tǒng)中,
每個(gè)病歷都對應(yīng)一個(gè)X M L文檔。
當(dāng)你使用X M L保存永久性數(shù)據(jù)時(shí),尋找信息的過程通常可以分為以下兩個(gè)步驟:首先找到
正確的文檔,然后找到你所感興趣的內(nèi)容。這兩步用到的工具和技術(shù)截然不同,因此決定在每
個(gè)文檔中放置哪些信息是相當(dāng)關(guān)鍵的。
要定位正確的文檔,主要有以下可選的四種方法:
• 利用操作系統(tǒng)文件存儲(chǔ)中的目錄結(jié)構(gòu)通過名稱定位文檔。文檔的文件名可能與系統(tǒng)中使用
的對象標(biāo)識符相關(guān),人事文件可能以職員的人事編號命名。
• 利用文檔之間的相互索引,這種方法類似于傳統(tǒng)的We b站點(diǎn),文檔總是通過鏈接找到的,
不過在此通常采用更加結(jié)構(gòu)化的文檔組織方式。舉例來說,如果有一組足球比賽報(bào)道,每
個(gè)報(bào)道都是由一個(gè)X M L文檔構(gòu)成的,可以建立另一個(gè)文檔作為它們的索引,列出所有比賽
第4章數(shù)據(jù)建模與XML使用91 下載
—日期、地點(diǎn)和參賽的球隊(duì)。當(dāng)然,不必手工維護(hù)這個(gè)索引?梢詫⑺O(shè)置為自動(dòng)更新:
提交新的比賽報(bào)道后,系統(tǒng)自動(dòng)對它進(jìn)行分析,并將相關(guān)信息添加到索引文檔中。X S LT
非常適于編寫這類應(yīng)用。
• 利用關(guān)系數(shù)據(jù)庫索引文檔。還可以選擇將X M L文檔保存為文件形式,并通過數(shù)據(jù)庫引用,
或者將X M L文檔也存儲(chǔ)在數(shù)據(jù)庫中。越來越多的數(shù)據(jù)庫明確表示支持該功能,如果必要的
話,還可以使用“ b l o b”(Binary Large Object,二進(jìn)制大對象)字段。如果利用關(guān)系數(shù)據(jù)
庫索引X M L文檔,就可以通過任意S Q L語句識別它們,但是只能使用那些數(shù)據(jù)庫直接包含
的特性。要深入了解如何使用X M L和關(guān)系數(shù)據(jù)庫,參見第1 0章。
• 利用自由原文搜索引擎索引文檔。越來越多的搜索引擎提供對X M L的支持。通過這種方法,
可以根據(jù)在文檔的任何位置出現(xiàn)的關(guān)鍵字搜索文檔。雖然自由原文搜索通常被定位為支持
用戶對非結(jié)構(gòu)化數(shù)據(jù)的查詢,但是由于X M L文檔中的標(biāo)記使得文檔具有更強(qiáng)的結(jié)構(gòu)性,因
此將使這種查詢方法變得更加有效。對于數(shù)據(jù)更新量不太大的應(yīng)用來說,這種方法比使用
關(guān)系數(shù)據(jù)庫查詢更加高效。
另外,你還可以使用所謂的“ X M L服務(wù)器”。X M L服務(wù)器通常不以未解析的純文本形式保
存X M L數(shù)據(jù),而是將它們存為D O M形式—即:它將文檔對象模型中的節(jié)點(diǎn)保存為對象數(shù)據(jù)庫
中的對象。這樣,不必首先從磁盤讀取整個(gè)文檔,然后再解析它,而可以直接通過D O M接口訪
問數(shù)據(jù)。這種方法的主要優(yōu)點(diǎn)體現(xiàn)在它使得數(shù)據(jù)訪問變得更加平滑,避免使用一個(gè)A P I定位正確
的文檔,使用另一個(gè)A P I在文檔中搜索信息。然而, X M L服務(wù)器將每個(gè)D O M節(jié)點(diǎn)保存為一個(gè)獨(dú)
立的數(shù)據(jù)庫對象,這使得它的性能受到一定影響,特別是當(dāng)加載或更新大型數(shù)據(jù)庫時(shí)。另外,
由于標(biāo)準(zhǔn)的D O M接口只能通過遍歷來尋找數(shù)據(jù),因此具體的查詢方法是每個(gè)廠家所特有的。
另一種能夠降低解析大型文檔的代價(jià)的方法是將文檔緩存到內(nèi)存中。例如,對于M i c r o s o f t
的A S P頁面或Java Server Pages,你可以在應(yīng)用程序范圍內(nèi)保存數(shù)據(jù),這意味著當(dāng)We b服務(wù)器啟
動(dòng)時(shí),將數(shù)據(jù)讀入內(nèi)存,當(dāng)服務(wù)器關(guān)閉時(shí),從內(nèi)存讀出數(shù)據(jù)。對于幾千兆字節(jié)的文檔,這種方
法的代價(jià)過于昂貴(就大多數(shù)D O M實(shí)現(xiàn)而言,源X M L文件中每字節(jié)的內(nèi)容大約會(huì)占用1 0個(gè)字節(jié)
的內(nèi)存),但是對于幾兆字節(jié)的數(shù)據(jù)來說,這種方法還是切實(shí)可行的—添置內(nèi)存或許比購買
X M L服務(wù)器軟件更便宜。
憑經(jīng)驗(yàn)而論,我習(xí)慣于根據(jù)一個(gè)稱為“整屏”的概念決定合適的文檔大小。從理論上講,
這種方法是不能令人滿意的,畢竟X M L應(yīng)該是獨(dú)立于表示的,以每次要顯示給用戶的信息量作
為設(shè)計(jì)決策的主要依據(jù)似乎不太恰當(dāng),然而實(shí)際上,這是一種很好的測試方法。如果存儲(chǔ)的
X M L文檔所包含的數(shù)據(jù)量超過了一個(gè)用戶愿意在屏幕上看到的內(nèi)容,最終你所解析的大量數(shù)據(jù)
可能永遠(yuǎn)得不到用戶的青睞;相反,如果你需要訪問幾百個(gè)存儲(chǔ)的X M L文檔才能夠形成一屏信
息,在訪問每個(gè)用戶頁面時(shí)都會(huì)產(chǎn)生大量處理開銷。
但是,如果用戶希望每次看到不同的一小部分?jǐn)?shù)據(jù)呢?可以將整個(gè)D O M文檔作為應(yīng)用程序
的一個(gè)對象保存在服務(wù)器的內(nèi)存中,根據(jù)用戶請求對D O M文檔進(jìn)行過濾,產(chǎn)生能夠更精確地滿
足用戶請求的較小的X M L文檔。
我們將在第1 0章詳細(xì)介紹X M L和數(shù)據(jù)庫。
(2) 需要多少種文檔類型
92使用XML 高級編程
下載
令人驚訝的是,這個(gè)問題并不像看上去那么簡單,因?yàn)閄 M L并沒有嚴(yán)格定義文檔類型的概
念。特別是有兩個(gè)獨(dú)立的概念,它們并不一定是一一對應(yīng)的: D T D和頂級元素類型。
但是從概念角度講,模型中可以包含幾種不同的文檔類型,在X M L中可以通過以下幾種方
式表示它們:
• 每種文檔類型對應(yīng)于一個(gè)不同的D T D。如果不同的文檔類型中有部分內(nèi)容是公共的,可以
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(39)