曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
• 文檔的< ! D O C T Y P E >聲明中包含對i t i n e r a r y. d t d的引用。(遺憾的是,大多數標準A P I都不
提供該信息。)
• 解析器使用的是應用程序認為正確的i t i n e r a r y. d t d版本(這很難做到)。
• 輸入文檔中的文檔元素具有正確的元素類型( D T D并沒有說明哪個元素應該是頂級元素,
但幸運的是,應用程序很容易進行這項檢測)。
第4章數據建模與XML使用103 下載
• 輸入文檔的內部D T D子集沒有覆蓋外部D T D中關鍵的有效性規則。舉例來說,如果外部
D T D子集包含以下定義:
則應用程序自然會認為在有效的輸入文檔中, < PAY M E N T >元素應該包含M E A N S屬性,且
屬性的值是字符串“ c h e c k”或“c r e d i t - c a r d”。但是,如果輸入文檔的內部D T D子集包含以下聲
明:
它將覆蓋外部D T D中的聲明。因此, M E A N S屬性可以被省略,或者取值“ c a s h”,解析器
仍然會認為輸入文檔有效。
(3) 編寫D T D
D T D和X M L采用不同的語法,因此它不僅難讀,而且更難寫,它采用的定界符與S G M L完
全不同。D T D對元素和屬性含義的解釋作用如同用編譯后的J a v a字節碼說明商業過程:語法中
甚至規定有些地方不能插入注釋。
市場上的D T D編輯工具能夠簡化D T D的編寫,但是歸根到底,如果想完全理解D T D,就必
須學習它的語法。D T D不僅不方便,而且結構上比較笨拙,特別是不能像解析X M L文件那樣解
析D T D。
(4) DTD和命名空間
最后一個問題是D T D幾乎不能與X M L命名空間配合使用。命名空間使你能夠在一個文檔中
混合來自多個信息模型的元素,例如在關于污染擴散程度的文檔中同時使用化學公式和地理編
碼。你能夠選擇名稱的前綴,而不會改變元素的含義,例如:你可以用< G E O : L I >代表立陶宛,
用< C H E M : L I >代表鋰。
D T D和命名空間的問題主要體現在兩方面。首先,文檔只能引用一個外部D T D。其次,通
過添加前綴給元素重命名后,將導致D T D無法識別,因此如果你確實希望將二者相結合,實際
上每次都要創建新的D T D版本。
盡管D T D存在這些局限性,但是它是目前唯一的標準,因此我們將介紹如何根據信息模型
創建D T D。
根據信息模型創建D T D
我們已經了解了如何將信息模型中的概念轉化為X M L文檔的設計,其中的某些決策將直接
反映在D T D中。例如,選擇將對象的特性表示為元素或者屬性。
但是當你真正開始編寫D T D時,有些問題才能夠明朗,下面我們將介紹這些問題。
雖然D T D的建模功能相當有限,但是許多功能都能夠通過非常靈活的參數實體機制獲得。
參數實體可以實現D T D中不同定義之間的文本共享,除此之外它還有其他用途, D T D的效率在
一定程度上取決于使用參數實體的技巧。
大多數D T D都包含兩種類型的定義:元素定義和屬性定義。元素定義規定了元素的內容;
屬性定義規定了每個元素中能夠出現的屬性。我們將依次介紹這兩種定義。
(1) 定義元素內容
104使用XML 高級編程
下載
D T D支持以下五種元素結構定義(參見表4 - 3)。
表4 - 3
內容模型舉例
E M P T Y內容<!ELEMENT confirmed EMPTY >
A N Y內容<!ELEMENT description ANY >
元素內容<!ELEMENT payment (currency?, amount, date, mode-ofpayment?)
>
復合內容<!ELEMENT estimated-cost (#PCDATA | note)* >
P C D ATA內容<!ELEMENT color (#PCDATA) >
實際上, X M L規范僅標識了四種結構:根據語法規定, P C D ATA內容只是一種特殊的復合
內容,但是從建模的角度看,這兩者有很大差別。下面讓我們看看如何使用每種結構。
(2) EMPTY內容的元素
從本質上講, E M P T Y元素代表一個布爾值:它可能出現,或者不出現。如果你希望標記特
定的預約已經被確認,可以使用空的< C O N F I R M E D / >子元素來表示。
如果打算用屬性而不是子元素表示對象的特性, E M P T Y元素也是非常有用的。(注意,
E M P T Y意味著它沒有子元素或文本節點:但并不表示它沒有屬性。)當選擇這種方法時,會發
現文檔中幾乎所有元素都是空的:文檔可能包含幾千個這種形式的元素:
如果你希望構造一個特殊的文檔,它僅包含一個X M L元素,且該元素沒有子元素,只有許
多屬性:對于某些類型的消息來說,這種結構是非常合理的。
另外,還可以使用E M P T Y元素表示枚舉數據類型的值(這種方法的確不太常見)。例如,
可以編寫以下代碼:
G E N D E R元素的聲明可以采用元素內容結構的形式指定有效值列表,例如:
(3) ANY內容的元素
在由信息模型產生的D T D中,不太可能出現A N Y選項;相反地,如果部分信息模型未知,
常常會導致D T D中出現A N Y內容的元素。實際上,它并不允許一個元素包含任何類型的子元素,
只有D T D中定義的類型才能作為子元素出現,因此它等價于列出D T D中的所有元素類型。因為
有些元素類型在此出現是沒有意義的,所以這僅僅是懶惰的表現:最好使用元素內容或復合內
容,并列出在這種環境下有意義的所有元素。
(4) 元素內容的元素
元素內容定義了哪些元素可以作為被定義元素的子元素,而且定義了它們出現的順序,是
否必須出現,以及是否允許重復。在所有選項中,元素內容使得設計者能夠對有效性進行最精
確的控制。考慮以下定義:
第4章數據建模與XML使用105 下載
以上聲明規定R E S O RT必須有一個名稱,必須位于一個特定的國家內,它可以在一個特定的
地區,并且必須包含一個或多個旅館。根據語法規則,子元素可以以空白分隔,但是按照習慣,
空白是沒有意義的。
使用這種聲明最大的缺陷是它不僅說明了能夠出現的元素及出現的次數,而且隱含地規定
了元素的次序:如果D T D中包含以上聲明,則當國家出現在旅游勝地的名稱之前就被認為是無
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(45)