曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
枚舉類型,文檔創作者只需創建新的值,就能夠適應新的安全級別要求,而不必每次都編輯
D T D。只要符合我們前面介紹的有效的N M TO K E N值應該遵守的規則,任何值都可以作為這種
屬性的值。
顯然,N M T O K E N類型使得應用程序必須承擔驗證值有效性的任務。然而對于枚舉類型,
解析器能夠提供有效性檢查。
與I D R E F S和E N T I T I E S類似,你可以聲明屬性類型N M TO K E N S,它的值由多個名稱記號構
成。每個名稱必須是有效的名稱記號,它們之間以空格分隔:
程序清單3 - 11
這個職員能夠訪問名為r e d、g r e e n、m e g a和u l t r a的安全區域。就類型而言,這些都是有效的
N M TO K E N值。與枚舉類型不同,解析器不檢查這些值的有效性。文檔的作者必須確保自己使
用了適當的名稱。
6. NOTAT I O N:非X M L數據
當我們討論實體類型的屬性時,曾經提及表示法。通過將實體名稱作為屬性值,可以將G I F
和J P E G圖形文件與元素相關聯。然而, X M L解析器不能處理二進制格式。那么,解析器的作用
是什么呢?我們可以使用表示法標識要鏈接到X M L文檔的外部數據項的格式。表示法聲明能夠
說明格式的名稱,以及相關的外部處理器。解析器可以根據聲明將自己不能識別的數據交給外
部處理器處理。處理器聲明類似于用于定位D T D文件的D O C T Y P E聲明。它可以是P U B L I C或
S Y S T E M的,而且必須包含外部處理器的名稱:
現在我們知道,當j p g作為表示法名稱時,與之相關的數據將發送給j p g v i e w e r. e x e處理。利
用表示法, X M L文檔可以容納多種不同的數據類型。這對于報表、病歷、法律文書、學術報告,
以及任何豐富多彩的多媒體演示來說都是非常有用的。但是, X M L僅僅是一個最基本的工具集。
為了提供正確的表示語義,應用程序還有大量工作要做。
通過使用關鍵字N O TAT I O N,可以將屬性定義為表示法名稱類型的。例如:
66使用XML 高級編程
下載
在以上聲明中, I m a g e元素可以有一個名為t y p e的屬性,它是表示法類型的。該屬性可選的
值有g i f和j p g。如果元素實例沒有定義t y p e屬性,解析器會假設該屬性設置為缺省值g i f。然而,
在上述實例中,值j p g覆蓋了缺省值。
7. 枚舉類型:選擇
名稱記號的長度是不受限的。雖然N M TO K E N和N M TO K E N S屬性值的格式必須符合命名規
則,但是它所允許的值是可以自由設置的。在許多情況下,我們只希望允許一小部分字符串值,
例如:y e s和n o是表示決策的枚舉值; r e d、y e l l o w和g r e e n是信號燈的顏色,等等。在這些情況下,
我們要采用枚舉屬性。
為了聲明枚舉屬性,在通常出現類型關鍵字的位置應該放置一組值。這些可選值包含在圓
括號中,并以管道符號( |)分隔。聲明中的可選值不需要帶引號,但是與X M L中的名稱一樣,
它是大小寫敏感的。文檔中的屬性實例必須包含唯一的一個可選值,且這個值必須是在屬性聲
明中列舉的。與其他屬性值類似,枚舉值必須包含在引號中。下面是兩個簡單的例子:
程序清單3 - 1 2
在第一個例子中,屬性值只能是y e s或n o;Y E S、N O和m a y b e都是無效的。設置屬性值時,
不僅必須使用枚舉類型聲明中提供的值,而且要注意大小寫。如果你構建的枚舉類型的值可能
由用戶手工輸入,應該考慮因大小寫產生的各種變體。
現在讓我們討論D T D中使用的另一種技術。
3.3.4 條件部分
許多程序員都習慣于在程序中指定要解析的信息,僅當滿足特定的條件時,編譯器才解析
指定的內容。D T D提供了類似的功能,雖然它比通常的編程語言有更多的限制—運行時不能
執行條件表達式。D T D可以包含條件部分,它用于向解析器說明包含或忽略聲明部分。它們能
夠用來控制D T D中的相關聲明塊。然而, D T D內部子集不支持條件部分。
條件部分包括:驚嘆號、左方括號、關鍵字,以及由方括號包含的聲明塊。如果關鍵字為
I N C L U D E,其中的聲明被認為是D T D的一部分。如果關鍵字為I G N O R E,處理器雖然讀取其中
的聲明,但是在處理時忽略它:
程序清單3 - 1 3
第3章文檔類型定義使用67 下載
在上例中, A u d i t E n t r y及其屬性將成為D T D的一部分,D e b u g E n t r y及其屬性則不會對D T D產
生任何影響。根據該D T D創建的文檔可以使用A u d i t E n t r y,但是文檔中的D e b u g E n t r y元素會被認
為是無效的。
這一特征乍看起來沒有什么價值。如果你不需要某些聲明,為什么還要將它們添加到D T D
中呢?如果聲明包含在D T D中,為什么要使用I N C L U D E呢?實際上,條件部分應該與參數實體
配合使用。讓我們更改一下以上實例,并就條件部分的用法作進一步說明。假設創建文檔時,
我們在文檔實例的D O C T Y P E聲明中寫入以下實體聲明:
程序清單3 - 1 4
假設文檔在創建時需要包含調試信息或計費信息。如果D T D外部子集包含以下代碼:
程序清單3 - 1 5
然后,假設文檔實例是要交給財務部門的:
程序清單3 - 1 6
68使用XML 高級編程
下載
這樣,文檔就能夠正確地驗證有效性。
由于內部D T D子集中的聲明是先讀的,因此實際上,參數實體聲明是出現在外部D T D子
集中的參數實體引用之前的。
在以上例子中,我們需要的是在生產環境中用于審核的元素,但是在某些情況,出于測試
或錯誤檢測的需要,我們可能希望在文檔中包含用于調試的元素。與A u d i t E n t r y相關的聲明將包
含在D T D中,而與D e b u g E n t r y相關的聲明將被忽略。為了將D e b u g E n t r y作為文檔的有效元素,
只需交換參數實體的關鍵字,這一操作是相當簡單的。如果使用恰當,條件部分能夠提供大量
功能,并改善代碼的可重用性。
3.4 DTD的缺點
D T D能夠有效地推動X M L的發展。然而,它也受到一些因素的限制。首先,它使用自己的
中國航空網 m.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(28)