MinOccurs 屬性繫結支援
本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.
.NET Framework 會提供 minOccurs 屬性 (Attribute) 的部分繫結支援。
Xsd.exe 只有在 MaxOccurs 屬性繫結支援 屬性的值不是要求陣列欄位時,才會檢查 minOccurs 屬性的值,這是只針對 <element> 項目所做的檢查。然後會根據各種因數 (Factor) 解譯 (或產生) 值,首先需視對應的欄位是否具備參考或實值型別而定。
說明
minOccurs 和 maxOccurs 屬性會限制指定的實體 (Entity) 可以連續出現在 XML 執行個體文件中對應位置上的次數。
這些屬性只會出現在複雜型別定義中。因此,如果是 <element> 或 <group> 項目,則項目必須是區域宣告或是全域宣告的參考,而非全域宣告本身。
如果要繫結具有非 XML 特定類別的 XML 結構描述複雜型別,.NET Framework 並不會提供等同於 minOccurs 或 maxOccurs 屬性的直接式程式設計語言。
將 XSD 轉譯為原始檔
從 XML 結構描述文件產生原始程式碼時,Xsd.exe 會忽略套用至 <choice>、<sequence>、<group>、<all> 和 <any> 項目的 minOccurs 屬性。
對於 <element> 項目而言,如果 maxOccurs 屬性的值大於 1 或為 unbounded
,則 Xsd.exe 會忽略 minOccurs 屬性。在這種情況下,工具會產生對應到 XSD 資料型別的型別陣列。Xsd.exe 會使用 maxOccurs 屬性的值,來判斷要產生單一執行個體或陣列。
對於 <element> 項目而言,如果套用 minOccurs 屬性的結構描述資料型別會轉換為 .NET Framework 參考型別,則 Xsd.exe 也會忽略此屬性。
只有在下列所有條件都成立時,Xsd.exe 才會使用 minOccurs 屬性的值:
涉及 <element> 項目。
maxOccurs 屬性要求單一執行個體。
資料型別會轉換成實值型別。
然後,工具會解譯該值,如下所示:
1 or more
:Xsd.exe 會產生公用欄位。未套用 XML 相關屬性,因此會使用預設的 System.Xml.Serialization.XmlElementAttribute。0
:Xsd.exe 會產生公用欄位。未套用 XML 相關屬性,因此會使用預設的 XmlElementAttribute。此外,Xsd.exe 還會產生型別 bool 的公用欄位,該欄位的名稱為項目欄位的名稱加上Specified
。例如,如果項目欄位的名稱為startDate
,bool 欄位的名稱就會變成startDateSpecified
。將物件序列化為 XML 時,XmlSerializer 類別會檢查 bool 欄位的值,以判斷是否撰寫項目。bool 欄位會和 System.Xml.Serialization.XmlIgnoreAttribute 一起顯示,以避免被 XmlSerializer 序列化。
**更多陣列繫結的相關資訊:**當 maxOccurs 屬性值要求陣列繫結,而使 Xsd.exe 忽略 minOccurs 屬性時,會失去定義的精確度。從產生的陣列反向轉譯至新的 <element> 宣告時,不會產生原本的 minOccurs 值,而是產生 0
值,以及 unbounded
值的 maxOccurs。
若要了解如何將型別繫結至陣列,請想一想宣告特定型別的物件與指派值 (也就是堆疊或堆積 (Heap) 中的記憶體位置) 給該物件兩者之間的差異。從下列 XSD 項目開始:
<xsd:element minOccurs="5" maxOccurs="5" name="items" type="xsd:token" />
如果手動撰寫程式碼,就不會在型別宣告上表示五個陣列大小,宣告會是:public string[] items
。但是,如果指定值,則會表示該陣列大小:items = new string[5]
。
Xsd.exe 可從 XML 結構描述產生的原始程式碼,就只有型別和欄位宣告以及中繼資料,此中繼資料可以套用至型別和欄位做為屬性。指派值至物件已超出範圍。
您可以使用 XmlValidatingReader 類別,對照結構描述物件模型 (SOM) 所表示的 XML 結構描述文件,驗證 XML 文件,藉此強制值大於 1。SOM 使用 System.Xml.Schema.XmlSchemaParticle.MinOccurs 和 System.Xml.Schema.XmlSchemaParticle.MinOccursString 屬性 (Property),這兩項會套用至所有可能含有 minOccurs 屬性 (Attribute) 的項目。
如需有關 Xsd.exe 如何在不同的 XML 結構描述定義語言項目中處理發生次數條件約束的詳細資訊,請參閱 maxOccurs 屬性。
將原始檔轉譯為 XSD
從類別產生 XML 結構描述文件時,Xsd.exe 產生的 minOccurs 值會依所要產生的包含 XML 結構描述定義語言項目而有所不同。以下是可能的包含項目及它們的 minOccurs 行為:
<choice>:如果 choice 代表單一物件,則為 1
,如果 choice 代表陣列,則為 0
。
<sequence>:未指定,還原成預設 1
。
<group>:Xsd.exe 不會從原始檔產生 <group> 項目。
<all>:Xsd.exe 不會從原始檔產生 <all> 項目。
<any>:如果是根據針對 <element> 項目說明的規則,則為 0
。本主題稍後會詳細說明 <any> 項目。
<element>:Xsd.exe 會根據諸如欄位或屬性是否為陣列或單一執行個體、欄位或屬性是否具備實值型別或參考型別、實值型別是否具有預設值或額外欄位 (說明是否已指定值),以及參考型別是否已指派 IsNullable 屬性設為 true
的 XML 相關屬性等,產生不同的 minOccurs 值。
IsNullable 屬性是由特定 XML 相關屬性類別使用。屬性顯示如下:
如果類別成員的 IsNullable 屬性 (Property) 設定為 true
,並且已經將物件設定為 null 參考 (在 Visual Basic 中為 Nothing),則 XmlSerializer 類別會產生值為 true
的 xsi:nil 屬性 (Attribute) (前置詞 xsi是用來做為 XML結構描述的執行個體命名空間,http://www.w3.org/2001/XMLSchema-instance)
。
執行個體文件的項目存在 xsi:nil="true"
,即明確地表示項目沒有子項目或本文等內容。請參閱 xsi:nil 屬性。
IsNullable 屬性 (Property) 會對應到 XML 結構描述定義語言中的 nillable 屬性 (Attribute)。從類別產生 XSD 定義時,如果 Xsd.exe 遇到類別或成員的 IsNullable 屬性為 true
值 (而且可以指派 null 參考給型別),便會為對應的 XSD <element> 項目產生 nillable="true"
設定。請參閱 nillable 屬性。
下表中的規則會判斷對應到類別成員 (屬於單一執行個體) 的 minOccurs 屬性值。陣列也會遵循這些規則,只除了一個例外狀況,本主題稍後將詳細說明。此表是根據相關的類別成員變化以及產生的 minOccurs 值整理而成:
輸入類別成員 |
輸出 <element> 項目的 minOccurs 值 |
具有預設值的實值型別,該預設值是透過 System.Component.DefaultValueAttribute 指定。 |
|
附有公用 bool 欄位的實值型別,該欄位採用先前將 XSD 轉譯為原始檔所述的 |
|
沒有預設值或附有布林值欄位的實值型別。 |
|
XmlElement 屬性 (Attribute) 的 IsNullable 屬性 (Property) 設定為 |
|
具有 |
|
從 XML 結構描述文件反向轉譯至原始程式碼時,Xsd.exe 會保留這些區別功能。
注意:如果 default XML 屬性顯示具有設定為 0
的 minOccurs 屬性,並且資料型別會對應到實值型別,則只會產生 DefaultValue 屬性,而不會產生附有的布林值欄位。請參閱 default 屬性。
例如,假設在輸入原始程式檔 (Source File) 中遇到了下列項目:
<xsd:element name="birthdate" type="xsd:date" default="2002-03-04" minOccurs="0" />Xsd.exe would then produce:
[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
public System.DateTime birthdate = new System.DateTime(631507968000000000);
陣列繫結。 Xsd.exe 一定會針對陣列產生下列格式的 <element> 宣告。
<element minOccurs="0" maxOccurs="unbounded" />
由於陣列型別屬於參考型別,所以的確會發生這種情形。但是與其他參考型別不同的是,即使將下列屬性宣告套用至陣列成員,還是會發生這種情形:
[XmlElementAttribute(IsNullable=true)]
當 XmlElement 屬性 (而非預設的 XmlArrayAttribute) 套用至陣列時,陣列項目會出現在執行個體文件中,當做是繫結至類別之項目的子系。不會嚴格地引入額外項目,當做陣列項目的父項目。當 Xsd.exe 產生具有 nillable="true"
值的項目,藉以辨識 IsNullable=true
設定時,還是會產生 0
值的 minOccurs,而且陣列項目可能仍不存在。
如果套用預設的 XmlArray 屬性,就會建立名稱開頭為 ArrayOf 的結構描述資料型別,以代表陣列的父項目。如需陣列繫結的詳細資訊,請參閱 maxOccurs 屬性和使用屬性控制 XML 序列化。
父項目結構描述資料型別會對應到參考型別,而且 Xsd.exe 的處理方式就像產生 minOccurs 值一樣。也就是說,如果 IsNullable 屬性設定為 true
,就會產生值為 1
的 minOccurs,如下所示:
[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]
否則,會產生值為 0
的 minOccurs。
**<any> 項目。**無論是單一物件或陣列,只要對等程式碼建構是參考型別,Xsd.exe 就會針對 <any> 項目產生 minOccurs="0"
。該建構是型別 System.Xml.XmlElement 的欄位 (或陣列),具有屬性 System.Xml.Serialization.XmlAnyElementAttribute。屬性宣告 [XmlElementAttribute(IsNullable=true)]
可以套用至 XmlElement 物件或陣列,但是 Xsd.exe 並不會將此用法解譯成具有 minOccurs="1"
的 <any> 項目。
可能的包含項目:<all>、<any>、<choice>、<element>、<group>、<sequence>
另請參閱
參考
System.Xml.Schema.XmlSchemaParticle.MinOccurs
System.Xml.Schema.XmlSchemaParticle.MinOccursString
XmlSchemaAll
XmlSchemaAny
XmlSchemaChoice
XmlSchemaElement
XmlSchemaGroupRef
XmlSchemaSequence