共用方式為


Choice 項目繫結支援

.NET Framework 會提供 <choice> 項目的繫結支援。

如果個別 choice 項目的型別及它們的名稱有所不同,則 Xsd.exe 只會將 XmlElementAttribute 屬性套用至 Public 成員。如果它們只依照名稱來區分,則 Xsd.exe 還會套用 XmlChoiceIdentifierAttribute,並新增額外邏輯以供選擇。

說明

<choice> 項目含有兩個或多個子項目,每一個都代表一個項目或項目群組。這表示在指定的執行個體文件中,那些實體中只有一個會出現在指定的位置。choice 必須依照項目名稱來區分,它們可以依項目型別來區分,而且如果 choice 是一個群組 (例如 <group> 項目),也可以依項目的數量來區分。

模稜兩可的群組組合會產生無法預期的結果。

依型別來區分

當個別項目的型別和它們的名稱不同時,便是最簡單的情況。請考慮下列 <choice> 定義:

<xsd:choice>
    <xsd:element name="numberA" type="xsd:int"/>
    <xsd:element name="numberB" type="xsd:decimal"/>
</xsd:choice>

在 C# 中,Xsd.exe 會將這個 XML 結構描述內容轉譯為下列程式碼:

[System.Xml.Serialization.XmlElementAttribute("numberA", typeof(int))]
[System.Xml.Serialization.XmlElementAttribute("numberB", typeof(System.Decimal))]
public object Item;

在產生的程式碼中,欄位會指定為 object 型別,但同時也會具備兩個 XmlElementAttribute 屬性。其中一個屬性用來將型別序列化為 int 執行個體,另一個屬性則是用來將型別序列化為 System.Decimal 執行個體。在這種情形中,XmlSerializer 類別會使用當時指派給物件的型別。有了下列對 int 物件的指派之後,便會使用 <numberA> 項目:

Item = 1;

當 choice 具備不同的 XML 結構描述資料型別時,Xsd.exe 就會將每個資料型別繫結至不同的類別。由於 System.Object 是 .NET Framework 型別階層架構的根型別,因此,所產生的欄位一定屬於通用基底型別 (Base Type)。Object 類別是最泛型的通用基底型別。

如果全部的 choice 都是從通用 XML 結構描述定義的資料型別衍生而來 (例如經由 <extension> 建構),則欄位型別便是該資料型別的繫結。例如,假設 <choice> 項目在 DerivedTypeA 的項目 <a>DerivedTypeB 的項目 <b> 之間提供 choice,並且這兩種型別都會擴充型別 BaseType。在 C# 中會產生下列原始檔:

[System.Xml.Serialization.XmlElementAttribute("a", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("b", typeof(DerivedTypeB))]
public BaseType Item;

依名稱來區分

如果 choice 具有相同型別,則在建立執行個體文件時,便會使用 XmlChoiceIdentifierAttribute 屬性來產生項目名稱的 choice。請考慮下列 <choice> 定義:

<xsd:choice>
    <xsd:element name="stringA" type="xsd:string"/>
    <xsd:element name="stringB" type="xsd:string"/>
</xsd:choice>

Xsd.exe 會將這個 XML 結構描述內容轉譯為下列程式碼:

[System.Xml.Serialization.XmlElementAttribute("stringA", typeof(string))]
[System.Xml.Serialization.XmlElementAttribute("stringB", typeof(string))]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
public string Item;

[System.Xml.Serialization.XmlIgnoreAttribute()]
public ItemChoiceType ItemElementName;
...
public enum ItemChoiceType {
        
    stringA,
        
    stringB,
}

Item 欄位除了具有兩個 XmlElement 屬性之外,還具有一個 XmlChoiceIdentifier 屬性。XmlChoiceIdentifier 屬性的參數是列舉型別執行個體的名稱。對應的列舉型別包含 choice 項目。列舉型別執行個體會和 XmlIgnore 屬性一起顯示,如此就不會將它的值加以序列化。

接著,開發人員必須撰寫程式碼,以指派值給列舉型別執行個體。下列行會為名稱為 i 的物件進行這項工作:

i.ItemElementName = ItemChoiceType.stringA;

如需詳細資訊,請參閱 XmlChoiceIdentifierAttribute 類別。

範例

下列輸入 XML 結構描述文件示範 <choice> 群組的不同用法:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
    <xsd:element name="choicesInstance" type="MyChoicesType"/>

    <xsd:complexType name="MyComplexType">
        <xsd:sequence>
            <xsd:element name="field1" type="xsd:string"/>
            <xsd:element name="field2" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="DerivedTypeA">
        <xsd:complexContent>
            <xsd:extension base="MyComplexType">
                 <xsd:attribute name="extraInfoForA" type="xsd:string"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="DerivedTypeB">
        <xsd:complexContent>
            <xsd:extension base="MyComplexType">
                 <xsd:attribute name="extraInfoForB" type="xsd:string"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="MyChoicesType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:choice>
                <xsd:element name="stringA" type="xsd:string"/>
                <xsd:element name="stringB" type="xsd:string"/>
            </xsd:choice>
            <xsd:choice>
                <xsd:element name="numberA" type="xsd:int"/>
                <xsd:element name="numberB" type="xsd:decimal"/>
            </xsd:choice>
            <xsd:choice>
                <xsd:element name="complexA" type="MyComplexType"/>
                <xsd:element name="complexB" type="MyComplexType"/>
                <xsd:element name="simpleC"  type="xsd:string"/>
            </xsd:choice>
            <xsd:choice>
                <xsd:element name="derivedA" type="DerivedTypeA"/>
                <xsd:element name="derivedB" type="DerivedTypeB"/>
            </xsd:choice>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

由前面的 XML 結構描述文件所產生的 C# 類別:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("choicesInstance", Namespace="http://example.org/", IsNullable=false)]
 public class MyChoicesType {
        
     public string name;
        
    [System.Xml.Serialization.XmlElementAttribute("stringA", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("stringB", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
    public string Item;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemChoiceType ItemElementName;
        
    [System.Xml.Serialization.XmlElementAttribute("numberA", typeof(int))]
    [System.Xml.Serialization.XmlElementAttribute("numberB", typeof(System.Decimal))]
    public object Item1;
        
    [System.Xml.Serialization.XmlElementAttribute("complexA", typeof(MyComplexType))]
    [System.Xml.Serialization.XmlElementAttribute("complexB", typeof(MyComplexType))]
    [System.Xml.Serialization.XmlElementAttribute("simpleC", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("Item2ElementName")]
    public object Item2;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public Item2ChoiceType Item2ElementName;
        
    [System.Xml.Serialization.XmlElementAttribute("derivedA", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedB", typeof(DerivedTypeB))]
    public MyComplexType Item3;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/", IncludeInSchema=false)]
public enum ItemChoiceType {
        
    stringA,
        
    stringB,
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
public class MyComplexType {
        
    public string field1;
        
    public string field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
    public class DerivedTypeA : MyComplexType {
        
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string extraInfoForA;
    }
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class DerivedTypeB : MyComplexType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string extraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/", IncludeInSchema=false)]
public enum Item2ChoiceType {
        
    complexA,
        
    complexB,
        
    simpleC,
}

主要 XML 結構描述文件型別會從前面 C# 原始檔所編譯的組件而產生 (不會顯示第二個 .xsd 檔,該檔案是產生用以定義複雜型別的任意全域項目)。

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="choicesInstance" type="tns:MyChoicesType" />
  <xs:complexType name="MyChoicesType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="name" type="xs:string" />
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="stringA" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="1" name="stringB" type="xs:string" />
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="1" maxOccurs="1" name="numberA" type="xs:int" />
        <xs:element minOccurs="1" maxOccurs="1" name="numberB" type="xs:decimal" />
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="complexA" type="tns:MyComplexType" />
        <xs:element minOccurs="0" maxOccurs="1" name="simpleC" type="xs:string" />
        <xs:element minOccurs="0" maxOccurs="1" name="complexB" type="tns:MyComplexType" />
      </xs:choice>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedB" type="tns:DerivedTypeB" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedA" type="tns:DerivedTypeA" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="MyComplexType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="field1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="field2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DerivedTypeA">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyComplexType">
        <xs:attribute name="extraInfoForA" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DerivedTypeB">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyComplexType">
        <xs:attribute name="extraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>
可能的屬性 繫結支援

id

Xsd.exe 公用程式會忽略試圖提供唯一識別項的 id 屬性。

maxOccurs

如果是 <choice> 項目,Xsd.exe 會將值為 0maxOccurs 解譯為 1,而將值大於 1 的 maxOccurs 解譯為 unbounded

如果是值 1,Xsd.exe 會如依型別來區分和依名稱來區分所述產生程式碼。

若為 unbounded 值,Xsd.exe 會執行相同的繫結,但是為 choice 所產生的欄位會是適當型別的陣列。如果所有的 choice 都具有相同的型別,則第二個欄位 (由 XmlChoiceIdentifier 屬性所識別) 就會是所產生之列舉型別的陣列。第二個陣列中的每個項目會為第一個陣列中對應的項目選擇項目名稱。

請參閱 MaxOccurs 屬性繫結支援 屬性。

minOccurs

從 XML 結構描述文件產生原始程式碼時,如果 minOccurs 屬性已套用至 <choice> 項目,Xsd.exe 會忽略該屬性。

從類別產生 XML 結構描述文件時,如果 choice 代表單一物件,則 Xsd.exe 會產生 <choice> 項目,該項目具有值為 1 的 minOccurs;如果 choice 代表陣列,則項目會有值為 0 的 minOccurs。

請參閱 MinOccurs 屬性繫結支援 屬性。

可能的父項目:<choice>、<complexType><extension><group><restriction><sequence>

可能的子項目:<annotation><any><element><group><sequence>、<choice>

請參閱

參考

XmlSchemaChoice

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.