曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
時,它會用這三個屬性取代參數實體名稱。如果我們需要在D T D輸入該屬性集合,只需引用實
體p e o p l e P a r a m e t e r s即可。
在D T D中,所有參數實體必須在引用之前進行聲明。這意味著D T D內部子集不能引用在外
部子集中聲明的參數實體,因為解析器首先讀取內部子集—所以會導致引用出現在聲明之前。
引用參數實體時,需要在實體名稱之前增加百分號,在其后增加分號。定界符與名稱之間
沒有空格。下面的代碼顯示了如何引用上面定義的參數實體:
第3章文檔類型定義使用57 下載
以上代碼聲明I n s u r e d P e r s o n元素包含4個屬性:其中c a r r i e r是顯式聲明的,其余三個參數
(a g e、w e i g h t和h e i g h t)包含在參數實體中,當解析器用置換文本取代實體引用時,會出現元素
的完整列表。因此,上面的例子等價于以下代碼段:
程序清單3 - 1
這種類型的替換形式—在聲明中進行替換—只能用于D T D外部子集。在內部子集中,
參數實體引用只能位于其他聲明之間;因此這類實體引用的置換文本必須是一個完整的聲明,
否則將影響D T D格式的正規性。
一個格式正規的文檔應該遵循的規則都可以應用于參數實體。用置換文本取代實體引用后,
仍然必須保證文檔格式的正規性。當你構建參數實體時,一定要謹記這條規則。通常,在參數
實體的置換文本中使用標記時要格外謹慎。下面的例子就破壞了格式正規約束:
% m y P a r m ;的置換文本是不完整的聲明,它缺少結束標記>,因此當解析器替換% m y P a r m ;時,
D T D就不再是格式正規的了。
與通用實體類似,參數實體的置換文本也可以位于外部文件中。例如:
從以上討論可以看出,對于定義X M L文檔詞匯表來說,實體是一種非常有價值的工具。下
面讓我們看看如何定義詞匯表中的元素類型。
3.3.2 元素
元素是X M L的核心與靈魂。在D T D中,元素類型是通過E L E M E N T標記聲明的。除了關鍵
字,標記還提供所聲明類型的名稱和內容規范。正如第2章所述,元素類型名要遵守X M L對名稱
的限制。名稱可以是字母、數字,也可以使用標點符號,如:冒號( :)、下劃線( _)、連字符
(-)和句點( .)。然而,名稱不能以數字開頭。它的第一個字符只能是字母、下劃線或冒號。
雖然名稱中可以使用冒號,但是在第7章介紹名稱空間時,你會看到有關冒號的保留用法。
鑒于這方面的原因,最好避免在元素名稱中使用冒號。
元素內容可以分為以下四種類型:空、元素、復合及任意。空元素中既不包含文本,也不
含子元素。但是它可以有屬性。它用關鍵字E M P T Y來表示。元素(更確切地說是純元素)內容
是指元素中只包含子元素,而不含文本。顧名思義,復合內容是元素和可解析字符數據
(# P C D ATA)或文本的組合。對于兩種類型,我們可以通過結構表達所需的內容。復合內容和
元素內容是采用內容模型( content model)表示的。內容模型是一種規范,它定義了元素內容
的內部結構。如果你希望元素具有任意形式的內容,同時不破壞X M L的格式正規語法,應該使
58使用XML 高級編程
下載
用關鍵字A N Y進行聲明。
元素類型S o m e D a t a不含任何內容。下面是該類型的實例:
通常,在以下情況你可能會使用空元素。在文檔中寫入元素本身足以起到標識的作用。例
如,H T M L中的< B R / >元素。你可以利用這種方法通知應用程序改變處理模式。如果你希望在文
檔中插入一組相關的參數,而專門為它們建立結構又不太值得,此時你可以使用空元素,利用
它來表達參數之間的關系。稍后討論屬性時,你會對此有進一步認識, X M L定義的某些屬性類
型可以用來表示一對一或一對多關系。如果你要說明的僅僅是關系本身,空元素是最適合不過
的。
A n y O l d T h i n g聲明為A N Y內容,因此我們可以使
用元素和文本的任意組合。一般而言,使用A N Y內
容模型時要格外謹慎,因為解析器基本上不能提供
有效性驗證。
內容模型即元素結構的聲明。它是由圓括號包含的若干子元素名稱、運算符和# P C D ATA關鍵
字的組合。運算符用于說明元素包含的元組,以及元素和字符數據之間的組合方式(參見表3 - 3)。
以逗號分隔的列表表示順序排列的元素。下面的代碼聲明了P e r s o n N a m e元素:
在元素實例中, F i r s t、M i d d l e和L a s t必須按指定的順序出現。如果你希望為文檔的創作者提
供選擇的余地,可以參考下面的F r u i t B a s k e t元素類型聲明,它可以包含A p p l e或O r a n g e,但是兩
者不能同時出現:
內容模型可以嵌套。下面的例子是修改后的F r u i t B a s k e t,它包含的第一個參數是C h e r r y,第
二個參數可以從A p p l e或O r a n g e中選擇其一:
根據以上聲明產生的實例必須包含兩個元素: C h e r r y以及A p p l e或O r a n g e,且它們必須按照
指定的順序出現。根據聲明,元素實例只可能有以下兩種形式:
程序清單3 - 2
程序清單3 - 3
第3章文檔類型定義使用59 下載
表3 - 3
順序運算符含義
, (逗號)表示嚴格順序
| (管道符號)表示選擇
除了我們前面介紹的順序運算符,還有一種非
常重要的運算符——元組運算符。特定的元素類型
允許多少實例?表3 - 4列出了元組運算符。
如果沒有元組運算符,說明元組數為一。元組
運算符可以用于元素或內容模型,它能夠產生許多
非常復雜的結構。讓我們進一步修改F r u i t B a s k e t元
素類型聲明:
以上內容模型組表示F r u i t B a s k e t可以有一個或多個元素類型C h e r r y的實例,以及零個或多個
A p p l e或O r a n g e的實例。而且所有C h e r r y元素必須連續出現。下面是一個正確的F r u i t B a s k e t實例:
程序清單3 - 4
如果你希望表示復合內容,需要在內容模型中包含# P C D ATA。內容模型中的元素必須以|運
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(25)