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

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

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

ただし、Xsd.exe は、グローバル属性がスキーマの対象名前空間以外で宣言されない限り、ローカルに宣言された属性とグローバルに宣言された属性を区別しません。

説明

XML スキーマ仕様では、属性は複合型定義内でローカルに、またはグローバルに宣言できます。その場合、ref 属性を使用して、1 つ以上の複合型定義で参照できます。

ローカルに宣言された属性の例を次に示します。

<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>

同じ属性をグローバルに宣言し、参照する例を次に示します。

<xsd:attribute name="name" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute ref="name"/>
</xsd:complexType>

Xsd.exe は、グローバル属性がスキーマの対象名前空間以外で宣言されない限り、ローカルに宣言された属性とグローバルに宣言された属性を区別しません。

同じ名前空間での参照

Xsd.exe は同じ名前空間内で区別しないため、XML スキーマとクラスの間のラウンドトリップ変換によって、グローバル属性および参照であった位置にローカル属性が作成されます。

別の名前空間への参照

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

[System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]

public string Key;

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

Example

その属性が定義されている同じ対象名前空間で、その属性への参照が含まれる場合に、Xsd.exe がグローバル属性を処理する方法を 1 番目の例に示します。

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:attribute name="version" type="xsd:string"/>
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required"/>
  </xsd:complexType>
  <xsd:element name="key" type="keyInfo"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

上記の 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="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute name="version" type="xs:string" />
    <xs:attribute name="public" type="xs:boolean" />
  </xs:complexType>
</xs:schema>

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

属性が別の名前空間で定義されている場合に、Xsd.exe がグローバル属性への参照を処理する方法を 2 番目の例に示します。この例では、別の 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:attr="http://example.org/attr">
  <xsd:import  namespace="http://example.org/attr" />
  <xsd:element name="key" type="keyInfo" />
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="attr:version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required" />
  </xsd:complexType>
</xsd:schema> 

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
            xmlns="http://example.org/attr" targetNamespace="http://example.org/attr">
  <xsd:attribute name="version" type="xsd:string" />
</xsd:schema> 

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

上記の 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/attr" />
  <xs:element name="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute xmlns:q1="http://example.org/attr" ref="q1:version" />
    <xs:attribute name="public" type="xs:boolean" />
  </xs:complexType>
</xs:schema>

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

<xs:schema xmlns:tns="http://example.org/attr" elementFormDefault="qualified" targetNamespace="http://example.org/attr" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="version" type="xs:string" />
</xs:schema>

Use 属性

<attribute> 宣言の use 属性では、属性が XML インスタンス ドキュメント内で現れることがあるか、または現れる必要があるかを決定します。

Use 属性 : XML スキーマ ドキュメントからソース コードの生成

Xsd.exe による use 属性の optional 値の解釈は、既定の属性値が default 属性を使用して指定されているかどうかによって異なります。use で使用可能な値、および optionaldefault の組み合わせについて、Xsd.exe の出力内容と共に次に示します。

  • required: Xsd.exe は、System.Xml.Serialization.XmlAttributeAttribute を持つパブリック フィールドを生成します。

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

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

  • prohibited: Xsd.exe は、何も生成しません。

Use 属性 : クラスから XML スキーマ ドキュメントの生成

次の 2 つのうちいずれの場合でも、Xsd.exe は use 属性を指定しないため、既定値 optional に逆変換されます。

  • Specified 名前付け規則に従う、追加の bool パブリック フィールドが存在する。

  • System.Component.DefaultValueAttribute 型の属性を使用して、既定値がメンバーに割り当てられている。

これらの条件のいずれも満たさない場合、Xsd.exe は use 属性に値 required を生成します。

例 : Use 属性

入力 XML スキーマ複合型 :

<xsd:complexType name="Numbers">
  <xsd:attribute name="optionalNumber" type="xsd:int" use="optional"/>
  <xsd:attribute name="requiredNumber" type="xsd:int" use="required"/>
  <xsd:attribute name="prohibitedNumber" type="xsd:int" use="prohibited"/>
</xsd:complexType>

上記の複合型から生成される C# クラス :

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://example.org/", IsNullable=false)]
public class Numbers {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int optionalNumber;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool optionalNumberSpecified;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int requiredNumber;
}

上記の C# クラスから生成された複合型は、実質的に元の複合型と等価です。

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

default

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

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

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

また、スキーマからソース コードを生成するとき、Xsd.exe は、値 optionaluse 属性を解釈する方法を決定するために、default 属性が指定されているかどうかをチェックします。詳細な説明については、default 属性を参照してください。

Xsd.exe ツールは、既定値の設定されたリスト型の属性に対して、有効なソース コードを生成できません。この場合については、default 属性で説明しています。<list> 要素も参照してください。

fixed

<attribute> 宣言の場合、Xsd.exe は fixed 属性の値を使って、静的にフィールドを固定値に初期化します。次に例を示します。

[System.Xml.Serialization.XmlAttribute()]
public in age = -1;

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

form

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

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

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

id

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

name

XSD ドキュメントからソース コードを生成する場合、name 属性の値は、その属性を表すパブリック クラス フィールドの名前になります。予約されているキーワードと名前が競合する場合は、生成される名前の先頭にアット マーク (@) が付けられます。

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

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

ref

XML スキーマ複合型から .NET Framework 型を生成するとき、Xsd.exe は、グローバル属性がスキーマの対象名前空間以外で宣言されない限り、ローカルに宣言された属性とグローバルに宣言された属性を区別しません。

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

type

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

Xsd.exe は、XML スキーマ データ型について、type 属性を使用してデータ型を参照するグローバル要素宣言を突き止めることができない限り、その XML スキーマ データ型の .NET Framework 型を生成しません。

use

use=“optional” の場合、Xsd.exe は、DefaultValueAttribute または追加の -Specified フィールドを生成するかどうかを決定するために、default 属性が存在するかどうかをチェックします。参照型 (たとえば文字列) の場合は追加のフィールドを生成しません。パブリック フィールドにどちらも存在しない場合、Xsd.exe は、生成される XSD ドキュメントで use=“required” を指定します。

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

使用可能な親要素 : <attributeGroup><complexType><extension><restriction><schema>

使用可能な子要素 : <annotation><simpleType>

参照

リファレンス

XmlSchemaAttribute