Default 属性のバインディング サポート

.NET Framework では、default 属性のバインディングを部分的にサポートしています。

Xsd.exe ツールは、既定の要素または属性値を、生成されたフィールドに適用される System.ComponentModel.DefaultValueAttribute と同等と見なします。フィールドは既定値に静的に初期化されます。

説明

<element> または <attribute> 宣言に表示できる default 属性は、インスタンス ドキュメントを受け取ったときに、要素が空か属性が存在しないときに使用される既定値を提供します。

属性の場合、属性が省略可能なとき (Attribute 要素のバインディング サポート で説明した use 属性が既定値 optional のとき) にのみ、既定値が関連します。属性を指定する場合は、値を指定する必要があります。

要素の場合、要素がコンテンツを持たないインスタンス ドキュメントに表示される場合のみ、既定値が使用されます。要素そのものが指定されていない場合、インスタンス ドキュメントに既定値は入力されません。

XML スキーマ ドキュメントからソース コードを生成するとき、Xsd.exe は、要素または属性に対応する各フィールドに既定値を使用し、System.ComponentModel.DefaultValueAttribute を適用して既定値を引数として渡します。さらに Xsd.exe は、静的にフィールドを既定値に初期化します。

[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;

既定の属性は、配列 (1 を超える値の maxOccurs を持つ要素) では無視されます。

データ型によるバインディング サポート

XML スキーマによれば、default 属性の値は単純型である必要があります。ほとんどの単純型の場合、Xsd.exe が XML スキーマからクラスへ、そして新しい XML スキーマ ドキュメントへとラウンドトリップ変換を実行する場合、Xsd.exe は既定値を保持します。

例外は、xsd:base64Binary または xsd:hexBinary 型の要素または属性です。DefaultValue 属性は、作成された対応する System.Byte フィールドには適用されません。

もう 1 つの例外は、リスト型の属性です。<list> 構造体は、空白文字で区切られた他の単純型からの一連の値が使用可能な値である単純型を定義するために使用されます (Xsd.exe は、リスト型の要素に対してソース コードを生成しません)。リストの場合、Xsd.exe は構成要素型の配列を作成しますが、既定値を、配列ではなく構成要素型のインスタンスに変換します。

入力 <attribute> 宣言の例を次に示します。

<xsd:attribute name="siblings" default="unknown">
  <xsd:simpleType>
    <xsd:list itemType="xsd:string"/>
  </xsd:simpleType>
</xsd:attribute>

この宣言の場合、次のソース コードが生成されます。

[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";

String オブジェクトを String オブジェクトの配列として暗黙的に型キャストすることができないため、このソースはコンパイルできません。列挙型を含むすべての単純型のリストに対して、同じエラーが発生します。

要素バインディングの値型に対する minOccurs 属性への影響

たとえば、クラス メンバに .NET Framework 値型があり、既定の XmlElementAttribute をで XML 要素に割り当てられているとします。クラスから XSD ドキュメントを生成しているときに、そのようなメンバに適用された DefaultValue 属性が存在する場合、Xsd.exe は、<element> 要素の minOccurs 属性に値 0 を設定します。このことは、有効な XML インスタンス ドキュメントでは、この要素を使用する必要がないことを示します。

属性の use="optional" の組み合わせ

<attribute> 宣言に、既定値 optional を持つ use 属性が含まれているとします。XSD ドキュメントからソース コードを生成するとき、Xsd.exe は default 属性が指定されているかどうかという事実と組み合わせてこの値を解釈します。使用できる 2 つの解釈の一覧を次に示します。

  • default 指定あり : Xsd.exe は、XmlAttributeAttribute および既定値を指定する DefaultValueAttribute を持つパブリック フィールドを生成します。

  • default 指定なし : Xsd.exe は XmlAttributeAttribute を持つパブリック フィールドを生成します。さらに、値型の場合に bool 型のパブリック フィールドを生成します。このフィールドの名前は、属性のフィールドの名前に Specified を追加した名前になります。たとえば属性フィールドの名前が startDate である場合、bool フィールドの名前は startDateSpecified になります。オブジェクトを XML にシリアル化すると、省略可能な属性を書き込むかどうかを判断するために、XmlSerializer クラスは bool フィールドの値をチェックします。XmlSerializer でシリアル化されないようにするには、bool フィールドを System.Xml.Serialization.XmlIgnoreAttribute と共に使用します。

入力 XML スキーマ ドキュメント :

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

    <xsd:complexType name="FamilyDogType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:stringo" default="Spot"/>
            <xsd:element name="birthdate" type="xsd:date" default="2002-03-04"/>
        </xsd:sequence>
        <xsd:attribute name="gender" type="GenderType" default="UNKNOWN"/>
        <xsd:attribute name="fixed" type="xsd:boolean" default="false"/>
        <xsd:attribute name="breed" type="xsd:string" default="Swedish Vallhund"/>
    </xsd:complexType>
    
    <xsd:simpleType name="GenderType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="FEMALE" />
            <xsd:enumeration value="MALE" />
            <xsd:enumeration value="UNKNOWN" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

上記の XML スキーマ ドキュメントから生成される C# クラス :

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyDog", Namespace="http://example.org/", IsNullable=false)]
public class FamilyDogType {
        
    [System.ComponentModel.DefaultValueAttribute("Spot")]
    public string name = "Spot";
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="date")]
    [System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
    public System.DateTime birthdate = new System.DateTime(631507968000000000);
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(GenderType.UNKNOWN)]
    public GenderType gender = GenderType.UNKNOWN;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool @fixed = false;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute("Swedish Vallhund")]
    public string breed = "Swedish Vallhund";
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum GenderType {        
    FEMALE,        
    MALE,
    UNKNOWN,
}

上記の C# ソース コードによってコンパイルされたアセンブリから生成される XML スキーマ ドキュメントは、C# ソースが生成された元の XML スキーマと実質的に同一です。

使用可能なコンテナ要素 : <attribute><element>

関連項目

参照

System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.