共用方式為


MinOccurs 屬性繫結支援

.NET Framework 會提供 minOccurs 屬性 (Attribute) 的部分繫結支援。

Xsd.exe 只有在 MaxOccurs 屬性繫結支援 屬性的值不是要求陣列欄位時,才會檢查 minOccurs 屬性的值,這是只針對 <element> 項目所做的檢查。然後會根據各種因數 (Factor) 解譯 (或產生) 值,首先需視對應的欄位是否具備參考或實值型別而定。

說明

minOccursmaxOccurs 屬性會限制指定的實體 (Entity) 可以連續出現在 XML 執行個體文件中對應位置上的次數。

這些屬性只會出現在複雜型別定義中。因此,如果是 <element><group> 項目,則項目必須是區域宣告或是全域宣告的參考,而非全域宣告本身。

如果要繫結具有非 XML 特定類別的 XML 結構描述複雜型別,.NET Framework 並不會提供等同於 minOccursmaxOccurs 屬性的直接式程式設計語言。

將 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。例如,如果項目欄位的名稱為 startDatebool 欄位的名稱就會變成 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.MinOccursSystem.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 類別會產生值為 truexsi:nil 屬性 (Attribute) (前置詞 xsiis used for the XML Schema instance namespace, 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 指定。

0. 在 <element> 項目中,也是透過 default XML 屬性指定預設值。

附有公用 bool 欄位的實值型別,該欄位採用先前將 XSD 轉譯為原始檔所述的 Specified 命名慣例。

0

沒有預設值或附有布林值欄位的實值型別。

1

XmlElement 屬性 (Attribute) 的 IsNullable 屬性 (Property) 設定為 true 的參考型別。

1. 在 <element> 項目中,nillable 屬性也是設定為 true

具有 IsNullable=false 或者沒有 IsNullable 設定的參考型別。

0

從 XML 結構描述文件反向轉譯至原始程式碼時,Xsd.exe 會保留這些區別功能。

注意:如果 default XML 屬性顯示具有設定為 0minOccurs 屬性,並且資料型別會對應到實值型別,則只會產生 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,就會產生值為 1minOccurs,如下所示:

[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]

否則,會產生值為 0minOccurs

**<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

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.