曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
三個C a t e g o r y元素的實例。
X M L模式能夠提供更精確的控制,我們將在第7章介紹有關(guān)內(nèi)容。我們將使用模式語法說
明Category至少出現(xiàn)三次,且至多出現(xiàn)三次。
P r i c e元素有屬性c u r r e n c y,它用于說明圖書價格的貨幣單位。在該D T D中,我們規(guī)定只能選
擇美元、加元或英鎊。
我們很容易增加貨幣單位的種類。這就是為何我們將P r i c e設(shè)計為元素,而不是屬性。通常
情況下,我們可以將一個簡單的原子特性設(shè)計為屬性。由于我們要處理國際貿(mào)易,因此必須指
定P r i c e內(nèi)容的貨幣單位,以便滿足應(yīng)用程序的需求。我希望說明貨幣單位是應(yīng)用于P r i c e的。所
以,我沒有將價格和貨幣單位都作為B o o k的屬性。通過將P r i c e說明為有# P C D ATA內(nèi)容的元素,
我可以將c u r r e n c y作為屬性,并顯式指定它的內(nèi)容。
下面的程序清單顯示了B o o k元素的屬性:
程序清單3 - 1 9
第3章文檔類型定義使用75 下載
這是目前為止我們見到的最復(fù)雜的屬性列表。I S B N當(dāng)然是圖書唯一的I S B N號,我們將它作
為I D類型以便于引用。L e v e l屬性代表出版社給圖書設(shè)置的難度級別。你正在閱讀的這本書設(shè)置
為P r o f e s s i o n a l。該屬性的值是由各個出版社自行定義的。雖然大多數(shù)出版社都有類似的概念,
但它并不是通用的,因此我將它指定為可選的屬性。然而,如果元素包含該屬性,它可以作為
排序或過濾的關(guān)鍵字。p u b D a t e和p a g e C o u n t屬性分別代表圖書的出版日期和頁數(shù)。
D T D語法不允許定義日期和數(shù)字類型,雖然我們在此非常需要這兩種類型。應(yīng)用程序可
以通過簡單的算法計算圖書面世的時間,以及一套書的總頁數(shù)。D T D不允許傳遞用于這
類計算的信息。它們必須隱含在對詞匯表的認(rèn)識中。XML模式將解決這類問題。
我們已經(jīng)在D T D中定義了幾個I D類型的屬性。現(xiàn)在終于到使用它們的時候了。屬性a u t h o r s
的值是指向代表特定作者的I D的a u t h o r C i t e I D值的一個或多個引用。例如:
以上代碼表示書的作者是a u t h o r C i t e I D值分別為s m o h r、m k a y和m b i r b e c k的作者。屬性
t h r e a d s與屬性a u t h o r s類似,它將一本圖書與一個或多個知識線索相關(guān)聯(lián):
由于線索可以引用多個I D,因此能夠從多條途徑分析目錄。用戶可以查閱一個目錄文檔,
并根據(jù)他所感興趣的一條或多條線索進行過濾。出版社能夠以目錄文檔為基礎(chǔ),根據(jù)線索和級
別選取圖書,產(chǎn)生適當(dāng)?shù)拈喿x列表。
最后, i m p r i n t屬性是對出版社印記的引用。一本書只能有一個印記,因此該屬性是I D R E F
類型的。B o o k元素中為什么沒有關(guān)于圖書的出版社的屬性?書的I S B N包含出版社的編號。這個
編號位于I S B N中的固定位置,所以我們能夠從I S B N中提取出版社編號,并搜索具有相同i s b n屬
性值的P u b l i s h e r元素。為了進一步簡化,我們也可以根據(jù)i m p r i n t的值進行搜索。它能夠直接得
到P u b l i s h e r元素,而不必象I S B N那樣需要從屬性值中提取子串。實際上,上述兩種方法都不是
直截了當(dāng)?shù)模撬鼈兌己軐嵱谩?br />
任何設(shè)計工作都會產(chǎn)生各種不同的結(jié)果。你完全可以根據(jù)自己的經(jīng)驗或需求考慮類似的圖
書出版或目錄信息問題。看看你會設(shè)計出什么樣的D T D;我是否忽略了你所需的某些概念。你
也可以嘗試著通過不同的方式表達(dá)同樣的想法,或許對于你來說,它更加有效。到底應(yīng)該將某
個項目模型劃為元素還是屬性,人們常常會在這方面產(chǎn)生爭論。你不妨修改一下我的設(shè)計方案,
看看會產(chǎn)生怎樣的后果。優(yōu)秀的D T D設(shè)計來自于經(jīng)驗和試驗。
(5) 完整的D T D
下面是P u b C a t a l o g . d t d的完整清單。本書的其他章節(jié)將用到它:
程序清單3 - 2 0
76使用XML 高級編程
下載
3.5.2 對象關(guān)系問題
請?zhí)貏e注意我們?nèi)绾卫肐 D、I D R E F和I D R E F S類型的屬性說明模型中對象之間的關(guān)系。這
第3章文檔類型定義使用77 下載
些類型雖然結(jié)構(gòu)簡單,但是能夠解決復(fù)雜的問題。XML 1.0在這方面涉及的內(nèi)容非常有限,它僅
僅指出I D在文檔中必須是唯一的。規(guī)范中并未強制定義任何編程語法。如果應(yīng)用程序需要使用
該特征,我們必須自己提供編程支持。我們不能期望符合XML 1.0規(guī)范的解析器提供鏈接功能。
目前,某些解析器準(zhǔn)備支持X S L,它使我們能夠在不進行過多編程的情況下簡便地實現(xiàn)鏈
接功能。然而,這是X S L的特性,而不是X M L的特征,如今市場上的大多數(shù)解析器都不
提供該功能。
盡管如此, I D和I D R E F仍然是X M L中的重要結(jié)構(gòu)。它使我們能夠在一個純文本的文檔中實
現(xiàn)類似于關(guān)系數(shù)據(jù)庫中的關(guān)系模型。如果你所設(shè)計的詞匯表要被一些未知的應(yīng)用程序使用,就
會發(fā)現(xiàn)這兩種結(jié)構(gòu)非常重要。只要知道存在關(guān)系,就可以利用適當(dāng)?shù)膶傩粤斜砺暶鞑东@信息。
應(yīng)用程序能夠充分利用該信息。
3.5.3 進一步討論
D T D語法還存在著一些局限性。它主要體現(xiàn)在以下三個方面:
• 所有內(nèi)容必須寫入同一D T D:沒有分段,除非利用適當(dāng)?shù)穆暶骱蛥?shù)實體機制將一個D T D
從邏輯上分為若干子D T D。然而在解析時,驗證有效性所需的聲明不能從邏輯分隔的模式
實體中提取出來。
• DTD與X M L文檔采用不同的語法(因此需要兩種不同的解析機制)。
• 某些事物的表述存在缺陷,例如:類型和元組。
我們的圖書目錄D T D不太長,也不十分復(fù)雜。即使如此,我們涉及的兩個概念—出版社
和作者—也可以應(yīng)用于其他領(lǐng)域。有些D T D聲明能夠跨領(lǐng)域重用,在新的D T D中,必須包含
這些D T D組件。然而,如果問題空間比較復(fù)雜,可能會產(chǎn)生一些麻煩。如果你需要驗證文檔的
有效性,就必須從邏輯上將X M L詞匯表涉及的所有內(nèi)容都包含在同一D T D中,這使得我們很難
動態(tài)構(gòu)建跨領(lǐng)域的內(nèi)容, X M L模式在這方面有所增強。
D T D的語法與X M L文檔使用的語法截然不同。驗證有效性的X M L解析器能夠處理D T D,但
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(32)