XML Schema幫你建模(3)

2021-03-31 08:56:31 字數 2235 閱讀 3565

我們現在已經討論了如何定義新的復合型別(比如purchaseordertype)、宣告元素(比如purchaseorder)和宣告屬性(如orderdate)。在這些定義行為中,一般都包含著命名,如果我們給兩個物件賦予同樣的名稱會有何種結果? 答案取決於問題中的兩個物件,一般來說這兩個物件越相近,它們越有可能引起衝突。

下面,我們給出一些例子來說明什麼時候同樣的名稱會導致問題。如果兩個物件都是型別,而且定義了乙個復合型別為usstates,同時又定義了乙個簡單型別為usstates,此時就出現了衝突。如果兩個物件是型別和元素或者是型別和屬性,當定義了乙個復合型別叫usaddress時,同時又定義了乙個元素稱為usaddress,此時是沒有衝突發生的。如果兩個物件是不同型別的元素(一般地、並非是全域性元素),當我們宣告了乙個元素名字作為usaddress型別的一部分,並且第二個元素名字作為item型別的一部分,此時就沒有衝突(類似的元素有時候稱為區域性元素宣告)。最後,如果兩個物件都是型別,你自己定義了其中的乙個,而xml schema規範內建定義了另外的乙個,比如定義了乙個簡單型別稱為decimal,那麼此時沒有衝突發生。這裡之所以沒有命名衝突發生的,因為它們屬於不同的命名空間。

使用簡單型別

在購買訂單模式文件po.xsd中,有幾個元素和屬性被宣告為簡單型別。其中一些簡單型別如 string 和decimal是xml schema中內建的,其它的一些則是源於(如果使用物件技術的語言就是繼承)內建的型別。舉例來說,partnum屬性的型別稱為sku(stock keeping unit),它是源於string的。內建的簡單型別和它們的後繼版本都能夠用在所有的元素和屬性宣告中。

新的簡單型別通過從現有的簡單型別(內建的簡單型別以及源於內建簡單型別的簡單型別)引出定義。通常,我們通過重新約束乙個現存的簡單型別來引出乙個新的簡單型別。換句話說,新型別的合法值範圍是現有型別的值範圍的子集。我們使用******type元素來定義和命名新的簡單型別,使用restriction元素來指出現有的基型別,並且用它來標識約束值範圍的細節。

假設希望建立乙個新的整數型別稱為myinteger,它的值範圍為10000到99999。那麼定義應當基於簡單型別integer,然後定義它的值範圍為10000到99999。為了定義myinteger,這樣來約束integer的範圍,參見**6:

**6的例子顯示了由乙個基本型別定義和兩個值域區間方面描述的組合,通過這三個要素對myinteger實施定義。

先前的購買訂單模式文件包含了其它更詳細的定義簡單型別的例子。乙個叫sku的新簡單型別(參見**7)是從(通過約束)簡單型別string引出的。此外,我們使用乙個稱為pattern的描述,以及pattern的正規表示式值「/d-[a-z]」來約束sku的值。其中,該正規表示式值的語義為3個數字後面跟著乙個連字型大小,接著跟著兩個大寫的英文本母。

xml schema定義了15個用於簡單型別定義描述的元素。在這些元素中,enumeration特別有用,它能夠被用於約束除boolean型別之外的幾乎每乙個簡單型別。enumeration限制簡單型別的值為一系列不同的列舉值。舉例來說,我們可以使用enumeration來定義乙個新型別稱為usstate(參見**8),usstate是從string型別引出的,同時它的值必須為美國州名的縮寫。

usstate將會在現用的state元素宣告中成為string型別的乙個非常好的替換品。通過使用這個替換品可以使state元素具有合法值的校驗能力。舉例來說,billto和shipto元素的子元素state,將會被限制在ak、al和ar等中。注意對於特定型別的列舉值必須是惟一的。

匿名型別定義

使用xml schema,我們能夠通過定義一系列具有名稱的型別,如purchaseordertype型別。然後宣告乙個元素,比如purchaseorder,通過使用「type=」這樣的構造方法來應用型別。這種型別的模式構造非常直截了當,但有些不實用。特別是如果定義了許多只應用一次而且包含非常少約束的型別,在這種情況下,乙個型別應該能夠被更簡單的定義。這樣的簡單定義通常的形式是乙個節省了名稱和外部引用開銷的匿名型別。

在po.xsd(參見**9)中型別items的定義中,有兩個元素宣告使用了匿名型別定義,它們是item和quantity。一般的來說,你通過元素中是否包含「type=」這個屬性可以判斷匿名元素定義(或者是匿名屬性定義)。如果出現無名稱的型別定義,也可以認為是匿名元素(屬性)定義。

在item元素中,它被定義為乙個復合匿名型別。該複雜型別是由productname、quantity、usprice、***ment、shipdate元素和乙個稱為partnum的屬性組成的。在quantity元素中,它有乙個簡單匿名型別從integer型別中引出,它的值範圍為1到99。

XML Schema幫你建模(4)

除了使用簡單型別中描述的原子型別 這些原子型別可用於組合成絕大多數的其它型別,包括其它的簡單型別和復合型別 外,xml schema中在簡單型別範疇中還有列表型別 list type 的概念。原子型別 列表型別以及聯合型別,總稱為簡單型別。乙個原子型別的值在xml schema中是不可分割的。舉例來...

XML Schema幫你建模(二)

xml schema幫你建模 2 復合型別定義 元素和屬性宣告 在xml schema中,對於那些允許元素有自己的內容,以及可以攜帶自身屬性的復合型別與那些不能夠有元素內容和屬性的簡單型別,它們的表示形式有著本質的不同。在例項文件中,對於能建立新的型別 無論簡單和複雜 的定義和允許元素和屬性有特定的...

人臉掃瞄建模 3D建模 新手3D建模設計知識點

3d建模設計職業 如今,3d建模被廣泛應用於各個領域。醫療行業使用詳細的器官3d模型,包括來自ct或mri掃瞄的2 d影象切片。建築師和工程師還利用3d軟體程式來展示擬議的建築,景觀,裝置,結構,車輛等。甚至科學家也開始使用3d地質模型。例如,學家利用它們來 由於板塊,侵蝕等引起的地殼內部事件。當然...