Element 要素のバインディング サポート

このトピックの対象は、レガシ テクノロジに特定されています。XML Web サービスと XML Web サービス クライアントは以下を使用して作成してください。 Windows Communication Foundation.

.NET Framework では、<element> 要素のバインディングをサポートしています。

説明

XML スキーマ仕様では、要素を、複合型定義内でローカルで宣言するか、ルート <schema> 要素の子としてグローバルに宣言できます。要素がグローバルに宣言されている場合、その要素は、ref 属性を使用して複数の複合型定義内から参照できます。

要素をローカルに宣言するコード例を次に示します。

<xsd:complexType name="UnitType">
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string"/>
  </xsd:sequence>
</xsd:complexType>

同じ要素をグローバルに宣言し、参照するコード例を次に示します。

<xsd:element name="name" type="xsd:string"/>
<xsd:complexType name="UnitType">
  <xsd:sequence>
    <xsd:element ref="name"/>
  </xsd:sequence>
</xsd:complexType>

XML スキーマ複合型から .NET Framework 型を生成するとき、Xsd.exe は、ローカルに宣言された要素と、グローバルに宣言された要素の参照とを区別しません。ただし、グローバル要素がスキーマのターゲット名前空間以外の名前空間で宣言されている場合は別です。

同じ名前空間での参照

Xsd.exe では同じ名前空間内の要素を区別しないため、XML スキーマからクラスに変換し、XML スキーマに変換し直した場合、グローバル要素に対するすべての参照はローカル要素に置き換えられます。

参照先のグローバル要素のデータ型に .NET Framework 型への自動バインディングが既に存在する場合、Xsd.exe では、そのデータ型に対応する新しい型は作成されません。その結果、グローバル要素宣言は、作成し直された XML スキーマで参照されないだけでなく、宣言自体がなくなります。

awac9czf.note(ja-jp,VS.100).gif注 :
すべての組み込み XML スキーマ データ型には、.NET Framework 型への自動バインディングが存在します。また、スキーマで定義されている単純型は、1 つの例外を除き、カスタム型ではなく .NET Framework 型にバインドされます。1 つの例外とは、文字列型の列挙定数に関するバインディングです。この例外の詳細については、<enumeration> 要素を参照してください。

awac9czf.note(ja-jp,VS.100).gif注 :
スキーマ定義の単純型のサポート詳細情報制限ファセットを表す各 <restriction> 要素を参照してください。

別の名前空間への参照

参照されているグローバル宣言が異なる名前空間に属している場合、Xsd.exe は、生成されたフィールドに適用された XmlElementAttribute 属性の Namespace プロパティを使用して、名前空間を指定します。この特別な要素では、次の例に示すように、XmlTypeAttribute 属性や、時には XmlRootAttribute 属性を使用してクラス レベルで指定された名前空間が、Namespace プロパティを使用して指定された名前空間によってオーバーライドされます。

[System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem")]
public string Text;

<import> 要素を使用して、追加の名前空間が XML スキーマ定義にインポートされます。

グローバル要素宣言の作成

アセンブリ内の一連のクラスから XML スキーマ ドキュメントを生成するとき、Xsd.exe は、アセンブリ内の型定義から <complexType> 定義または <simpleType> 定義を生成するたびに、グローバル <element> 宣言を生成します。

この最初の例では、Xsd.exe でグローバル要素を処理するときに、この要素がこの要素への参照を含む名前空間と同じターゲット名前空間で定義されている場合の処理方法を示します。

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="Text" type="xsd:normalizedString"/>
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

上記の C# ソースからコンパイルされたアセンブリから生成される XML スキーマ ドキュメント。

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" name="Text" type="xs:normalizedString" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

上記の生成された XML スキーマでは、もともとグローバルに宣言されていた Text 要素がローカル要素になっています。

2 番目の例は、要素が別の名前空間で定義されている場合に、Xsd.exe がグローバル要素への参照を処理する方法を示しています。この例では、別の XSD ファイル内にある 2 番目の名前空間をインポートするために、<import> 要素を使用します (インポートする .xsd ファイルの場所は、<import> 要素の schemaLocation 属性では指定されていません。その代わり、ファイルは、追加のコマンド ライン引数として指定されます)。

入力として使用される最上位の XML スキーマ ドキュメント。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
      xmlns="http://example.org/" targetNamespace="http://example.org/" xmlns:elem="http://example.org/elem">
  <xsd:import  namespace="http://example.org/elem" />
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="elem:Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

入力として使用されるインポート済み XML スキーマ ドキュメント。

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

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem", DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

上記の C# ソースからコンパイルされたアセンブリから生成されるトップレベルの XML スキーマ ドキュメント。

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://example.org/elem" />
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" xmlns:q1="http://example.org/elem" ref="q1:Text" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

上記の C# ソースからコンパイルされたアセンブリから生成されるインポート済み XML スキーマ ドキュメント。

<xs:schema xmlns:tns="http://example.org/elem" elementFormDefault="qualified" targetNamespace="http://example.org/elem" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Text" type="xs:normalizedString" />
</xs:schema>

Abstract 属性

グローバル要素の宣言には abstract 属性を指定できます。ローカル要素では指定できません。

要素を abstract と宣言 (abstract="true") すると、代替グループを使用して強制的に代替されます。要素が abstract でない場合、代替はオプションです。

代替されるグローバル要素を head 要素と呼びます。ローカル要素宣言で ref 属性を使用して head 要素を参照している場合は、任意のグローバルな代替要素を代わりに使用できます。詳細については、次のトピックを参照してください。 substitutionGroup 属性を参照してください。

代替要素が派生データ型のメンバーであり、(その head 要素の型に対応する <complexType> 定義が abstract 宣言されているのではなく) その head 要素自体が abstract 宣言されている場合、その XML インスタンス ドキュメントの任意の場所でその基本型を使用できます。ただし、代替が行われる場所では使用できません。

XML スキーマ ドキュメントからソース コードを生成するとき、Xsd.exe は、head 要素のデータ型に対応する型を生成します。この型には、Item という名前のフィールドが含まれます。Xsd.exe は、このフィールドに対して、1 つの代替につき 1 つの XmlElementAttribute 属性を適用します。各属性には名前を識別する情報が設定され、その代替要素に派生された型が含まれる場合には、その型の情報が設定されます。代替要素で head 要素と同じデータ型を使用する場合は、XmlChoiceIdentifierAttribute 属性も適用する必要があります。詳細については、次のトピックを参照してください。<choice> 要素を参照してください。

abstract head 要素への参照から生成されたサンプル フィールド Item のコード例を次に示します。

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

派生したデータ型のメンバーである代替要素を使用している場合、XML シリアル化は、派生型のいずれかのインスタンスがそのフィールドに割り当てられている場合にのみ可能です。その head 要素に対応する基本型のインスタンスが代入されている場合は、XmlSerializer クラスでシリアル化することはできません。

逆変換では、Xsd.exe が、代替要素ごとの <element> 要素をメンバーとする <choice> 要素を生成し、head 要素を表す <element> 要素は生成しません。各要素は複合型定義内で別々に定義され、ref 参照は使用されません。

awac9czf.note(ja-jp,VS.100).gif注 :
abstract head 要素を指定する ref 属性を含むローカル <element> 宣言では、Xsd.exe が maxOccurs 属性を無視します。

awac9czf.note(ja-jp,VS.100).gif注 :
MyBaseType 型の head 要素に対する次の宣言について考えます。

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />
awac9czf.note(ja-jp,VS.100).gif注 :
前の宣言に対して、Xsd.exe は引き続き、次のフィールドを作成します (属性は省略されます)。

public MyBaseType Item;
awac9czf.note(ja-jp,VS.100).gif注 :
入力 XML スキーマ内でグローバルに宣言された要素がすべて abstract と宣言されている場合、Xsd.exe ではクラスを作成できません。

例: Abstract 属性

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

上記の C# ソースからコンパイルされたアセンブリから生成される XML スキーマ ドキュメント。

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <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:MyBaseType">
        <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:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema> 

SubstitutionGroup 属性

Xsd.exe ツールでは、代替要素が abstract と宣言されている場合にのみ代替グループを認識できます。(前の Abstract Attribute セクションを参照してください。)これを逆変換する場合、Xsd.exe は、代替要素ごとの <element> 要素を含む <choice> 要素を作成します。

SubstitutionGroup 属性: 背景

substitutionGroup 属性を、グローバルに宣言した要素と一緒に使用して、XML インスタンス ドキュメント中のグローバルに宣言された他の要素と置換できることを示します。この属性の値は、代替される要素 (head 要素と呼びます) の名前です。実際には、複合型定義内の <element> 要素で置換される場合があります。この定義内の head 要素は、ref 属性を使用して参照されています。substitutionGroup 属性を付けて宣言する各要素は、head 要素と同じデータ型に属しているか、その派生型に属している必要があります。

代替グループを使用すると、名前が異なる要素およびオプションで、基本型が同じで型の異なる要素を、インスタンス ドキュメントの指定の位置で使用するように設定できます。

入れ子になった代替グループはサポートされていません。つまり、ある代替グループの head 要素として機能する要素を、別の代替グループの代替要素にすることはできません。例:

<xs:element name="Animal" abstract="true"/>
<xs:element name="Mammal" abstract="true" 
    substitutionGroup="tns:Animal"/>
<xs:element name="Dog" type="xs:string" 
    substitutionGroup="tns:Mammal"/>

このスキーマは、Mammal が Dog の head 要素および Animal の代替要素の両方として機能するため、サポートされません。このようなスキーマが検出された場合は、Xsd.exe が Mammal の XmlElementAttribute を生成しないため、Dog が Animal 要素に含まれなくなります。ただし、次の例に示すように、このスキーマを手動で追加すると、この状況に対応できます。

public class PetShop 
{
    private object Animal;
    
    // Apply the XmlElementAttribute to the generated property.
    [System.Xml.Serialization.XmlElementAttribute("Mammal"), 
     System.Xml.Serialization.XmlElementAttribute("Dog")]
    public object Animal {
        get {
            return this.Animal;
        }
        set {
            this.Animal = value;
        }
    }
}

substitutionGroup 属性: 具象 head 要素

head 要素が abstract でない場合は、Xsd.exe が、その head 要素への各 ref 参照を受け取り、その head 要素の XML データ型に対応する型またはその型の配列のフィールドを作成します。配列にするかどうかは、参照元の要素にある maxOccurs 属性の値によって決まります。代替グループに対するすべての参照は失われます。

派生型のオブジェクトをそのフィールドに割り当てて、そのオブジェクトを XmlSerializer クラスでシリアル化することはできますが、この動作は派生型による代替の外部で行われます。代替要素の名前は使用されません。

SubstitutionGroup 属性 : Abstract head 要素

head 要素が abstract の場合、Xsd.exe は、その head 要素のデータ型に対応する型のフィールドを作成します。このフィールドは、Item と名付けられます。Xsd.exe は、このフィールドに対して、1 つの代替につき 1 つの XmlElementAttribute 属性を適用します。各属性には名前を識別する情報が設定され、その代替要素に派生された型が含まれる場合には、その型の情報が設定されます。代替要素で head 要素と同じデータ型を使用する場合は、XmlChoiceIdentifierAttribute 属性も適用する必要があります。<choice> 要素を参照してください。

abstract head 要素に対する参照から生成されるフィールドの例を次に示します。

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

派生型が使用されている場合は、派生型のいずれかのインスタンスがそのフィールドに割り当てられている場合にのみ、XML シリアル化が可能です。その head 要素に対応する基本型のインスタンスが代入されている場合には、XmlSerializer でシリアル化することはできません。

逆変換では、この構造から Xsd.exe が、各代替要素 (head 要素ではなく) の <element> 要素をメンバーとする <choice> 要素を生成します。各要素は複合型定義内で別々に定義され、ref 参照は使用されません。

maxOccurs attribute. abstract head 要素を指定する ref 属性を含むローカル <element> 宣言では、Xsd.exe が maxOccurs 属性を無視します。

MyBaseType 型の head 要素に関する次の宣言について考えます。

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />

前の宣言に対して、Xsd.exe は引き続き、次のフィールドを作成します (属性は省略されます)。

public MyBaseType Item;

例: SubstitutionGroup 属性

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

上記の C# ソースからコンパイルされたアセンブリから生成される XML スキーマ ドキュメント。

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <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:MyBaseType">
        <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:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

使用可能な属性 バインディング サポート

abstract

Xsd.exe ユーティリティは、abstract <element> 宣言を使用して代替グループをバインドしますが、逆変換では <choice> 要素を作成します。

前のセクション「Abstract 属性」を参照してください。

block

block 属性を使用して、要素宣言が代替グループ head 要素 (グループのメンバーによって代替される要素) として使用されないようにすることができます。

Xsd.exe ツールは、Schema 要素のバインディング サポート 要素の blockDefault 属性と同様に、block 属性を無視します。

default

default 属性には、インスタンス ドキュメントで要素が空の場合に使用する既定値を設定します。要素そのものが指定されていない場合は、インスタンス ドキュメントに既定値が入力されません。

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

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

.NET Framework 値型を持つクラス メンバーから <element> 要素を生成するときに、Xsd.exe は、minOccurs 属性を設定するときの入力として DefaultValue 属性を使用します。Xsd.exe での処理対象に、そのようなメンバーに適用された DefaultValue 属性が存在する場合、Xsd.exe は、その要素の minOccurs 属性に値 0 を設定します。このことは、有効な XML インスタンス ドキュメントでは、この要素を使用する必要がないことを示します。

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

Default 属性のバインディング サポート 属性を参照してください。

final

final 属性を使用して、要素宣言が代替グループ head 要素 (グループのメンバーによって代替される要素) として使用されないようにすることができます。

Xsd.exe は、final 属性および <schema> 要素の finalDefault 属性を無視します。

fixed

fixed 属性は、インスタンス ドキュメント内の要素に固定値を提供します。Xsd.exe は、XML スキーマ ドキュメントからソース コードを生成するときに、固定値のある要素に対応する各フィールドを受け取り、静的な初期化子を生成します。次に例を示します。

public int age = -1;

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

form

Xsd.exe ツールは、<element> 要素の form XML 属性を、XmlElementAttributeForm プロパティと同等であると見なします。.NET Framework の XML シリアル化インフラストラクチャでは、別の既定値である qualified を認識できます。

XML スキーマの <element> 宣言で form="unqualified" と指定されている場合は、Xsd.exe が、対応するフィールドに XmlElement 属性を作成し、この属性に Form=XmlSchemaForm.Unqualified というパラメーターを渡します。

form 属性を参照してください。

id

Xsd.exe ユーティリティでは、一意な識別子を提供するための id 属性は無視されます。代わりに、name 属性を認識します。

maxOccurs

XSD ドキュメントからクラスを生成するときに、Xsd.exe は、<element> 要素の maxOccurs 属性を、この属性に設定されている値に従って次のように解釈します。

  • 1: その要素のデータ型に対応する型のフィールドが作成されます。

  • 0: Xsd.exe では値 0 を処理できません。代わりに、既定の値である 1 として処理されます。

  • unbounded: その要素のデータ型に対応する型の配列フィールドが作成されます。

  • 2 以上のすべての整数: 値 unbounded と同様に、その要素のデータ型に対応する型の配列フィールドが作成されます。XmlValidatingReader クラスを使用して、スキーマ オブジェクト モデルで表された XML スキーマ ドキュメントに対して XML ドキュメントを有効化すると、1 を超える値を適用できます。

Xsd.exe でアセンブリ内の一連のクラスから XML スキーマ ドキュメントを生成する場合は、上の変換とは逆の変換処理が行われ、単一のインスタンスから値 1maxOccurs が、配列から値 unboundedmaxOccurs が作成されます。

Xsd.exe では、maxOccurs の値 unbounded が配列にバインドされますが、配列の親要素が存在する場合は、maxOccurs の値 1 がその親要素にバインドされます。追加の親要素の指定など、配列のバインディングにおける maxOccurs 要素の扱いの詳細については、MaxOccurs 属性のバインディング サポート 属性を参照してください。

minOccurs

<element> 要素に関しては、MaxOccurs 属性のバインディング サポート 属性で配列フィールドが必要とされない場合にのみ、Xsd.exe が minOccurs 属性の値をチェックします。そのため、対応するフィールドに参照型と値型のどちらがあるかなどのさまざまな要因に従って、値が解釈 (または生成) されます。

MinOccurs 属性のバインディング サポート 属性を参照してください。

name

name 属性の値は、XSD ドキュメントからソース コードを生成するときに、その要素を表すパブリック クラス フィールドの名前を示します。<element> 要素に、匿名の <complexType> 定義が含まれている場合は、その名前が、その複合型に対応するクラスの名前になります。

コーディング規則に準拠するために大文字と小文字の変換が行われることはありません。たとえば、匿名の複合型を含む <element> 要素の name 属性の値が testInfo の場合、作成されるクラスの名前は、大文字に変換された TestInfo ではなく、testInfo になります。予約されているキーワードと名前が競合する場合は、生成される名前にアット マーク (@) が付けられます。

パブリック クラス フィールドから <element> 宣言を生成するときに、Xsd.exe は、name 属性の値としてフィールド名を使用します。代替名、つまり name 属性の値は、次の属性プロパティを使用して指定できます。

Name 属性のバインディング サポート 属性を参照してください。

nillable

Xsd.exe ツールは、nillable 属性を、参照型に適用された特定の XML シリアル化関連属性の IsNullable プロパティと同等であると見なします。値型の場合は、nillable の値が true であると、NULL 許容型が生成されます。

nillable 属性を参照してください。nillable 属性は <element> 要素でのみ使用されます。

ref

XML スキーマ複合型から .NET Framework 型を生成するとき、Xsd.exe は、ローカルに宣言された要素と、グローバルに宣言された要素の参照とを区別しません。ただし、グローバル要素がスキーマのターゲット名前空間以外の名前空間で宣言されている場合は別です。

「同じ名前空間での参照」および「別の名前空間への参照」の各セクションを参照してください。

substitutionGroup

Xsd.exe ツールでは、代替要素が abstract と宣言されている場合にのみ代替グループを認識できます。これを逆変換する場合、Xsd.exe は、代替要素ごとの <element> 要素を含む <choice> 要素を作成します。

前の「SubstitutionGroup 属性」セクションを参照してください。

type

Xsd.exe ツールは、参照されるデータ型と、.NET Framework 型の <element> 宣言と <attribute> 宣言の type 属性とを関連付けます。

Xsd.exe が XML スキーマ データ型から .NET Framework 型を生成するのは、type 属性を使用して、そのデータ型を、特定のデータ型 (元の型とは異なる場合もあります) を参照するグローバル要素宣言までさかのぼって追跡できる場合だけです。

使用可能な親要素: <all><choice><schema><sequence>

使用可能な子要素: <annotation><complexType><key><keyref><simpleType><unique>

参照

リファレンス

XmlSchemaElement