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 會將值為 如果是值 若為 請參閱 MaxOccurs 屬性繫結支援 屬性。 |
minOccurs |
從 XML 結構描述文件產生原始程式碼時,如果 minOccurs 屬性已套用至 <choice> 項目,Xsd.exe 會忽略該屬性。 從類別產生 XML 結構描述文件時,如果 choice 代表單一物件,則 Xsd.exe 會產生 <choice> 項目,該項目具有值為 請參閱 MinOccurs 屬性繫結支援 屬性。 |
可能的父項目:<choice>、<complexType>、<extension>、<group>、<restriction>、<sequence>
可能的子項目:<annotation>、<any>、<element>、<group>、<sequence>、<choice>
請參閱
參考
Copyright © 2007 by Microsoft Corporation. All rights reserved.