Share via


Element 요소의 바인딩 지원

이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. 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 스키마에서 클래스로의 라운드트립 변환 및 그 반대 방향의 라운드트립 변환이 수행되면 전역 요소에 대한 참조를 대체하는 로컬 요소가 만들어집니다.

참조된 전역 요소의 데이터 형식이 이미 .NET Framework 형식에 자동으로 바인딩되어 있으면 Xsd.exe는 이러한 데이터 형식에 해당하는 새 형식을 생성하지 않습니다. 따라서 전역 요소 선언은 라운드트립 시 생성된 XML 스키마에서 더 이상 참조되지 않을 뿐만 아니라 해당 스키마에 더 이상 나타나지도 않습니다.

awac9czf.note(ko-kr,VS.100).gif참고:
기본 제공 XML 스키마 데이터 형식은 .NET Framework 형식에 자동으로 바인딩됩니다. 또한 한 가지 예외는 있지만 스키마 정의된 단순 형식은 사용자 지정 형식이 아닌 .NET Framework 형식에 바인딩됩니다. 단일 예외는 문자열 바인딩 형식의 열거형을 포함합니다. 이 예외에 대해서는 <enumeration> 요소에 대한 설명서에 자세히 나와 있습니다.

awac9czf.note(ko-kr,VS.100).gif참고:
스키마 정의된 단순 형식 지원에 대한 자세한 내용은 <restriction> 요소 또는 제한 패싯을 나타내는 다른 요소를 참조하십시오.

다른 네임스페이스에 대한 참조

참조된 전역 선언이 다른 네임스페이스에 속할 경우 Xsd.exe는 생성된 필드에 적용되는 XmlElementAttribute 특성의 Namespace 속성을 사용하여 네임스페이스를 지정합니다. 이러한 특정 요소의 경우 Namespace 속성을 사용하여 지정된 네임스페이스가 XmlTypeAttribute 특성이나 다음 예제와 같이 XmlRootAttribute를 사용하여 클래스 수준에서 지정된 네임스페이스를 재정의합니다.

[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 요소가 로컬 요소로 만들어졌습니다.

다음의 두 번째 예제에서는 Xsd.exe에서 별도의 네임스페이스에 정의되어 있는 전역 요소에 대한 참조를 처리하는 방법을 보여 줍니다. 이 예제에서는 <import> 요소를 사용하여 별도의 XSD 파일에 있는 두 번째 네임스페이스를 가져옵니다. 가져온 .xsd 파일의 위치를 지정하는 데는 <import> 요소의 schemaLocation 특성이 사용되지 않습니다. 대신, Xsd.exe에서는 이 파일을 추가 명령줄 인수로 지정합니다.

입력으로 사용되는 최상위 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>

앞의 두 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 특성을 참조하십시오.

대체 요소가 파생 데이터 형식에 속하며, 해당 형식에 대한 <complexType> 정의가 abstract로 선언되지 않고 head 요소가 abstract로 선언되면 대체가 발생하는 위치에서는 기본 형식을 사용할 수 없지만 XML 인스턴스 문서의 다른 위치에서는 기본 형식을 사용할 수 있습니다.

XML 스키마 문서에서 소스 코드를 생성할 때 Xsd.exe는 head 요소의 데이터 형식과 일치하는 형식을 생성합니다. 이 형식에는 이름이 Item인 필드가 포함됩니다. Xsd.exe는 대체 항목별로 하나의 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 serialization이 작동합니다. head 요소와 일치하는 기본 형식의 인스턴스가 할당되면 XmlSerializer 클래스는 실패합니다.

역변환 시 Xsd.exe는 head 요소를 나타내는 <element> 요소를 제외하고 각 대체 요소에 대해 <element> 요소를 포함하는 <choice> 요소를 생성합니다. 이러한 요소는 복합 형식 정의 내에 독립적으로 정의되므로 ref 참조는 사용되지 않습니다.

awac9czf.note(ko-kr,VS.100).gif참고:
abstract head 요소를 지정하는 ref 특성이 포함된 로컬 <element> 선언에서 Xsd.exe는 maxOccurs 특성을 무시합니다.

awac9czf.note(ko-kr,VS.100).gif참고:
MyBaseType 형식의 head 요소에 대한 다음 선언을 살펴보십시오.

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />
awac9czf.note(ko-kr,VS.100).gif참고:
앞의 선언에서 Xsd.exe는 여전히 다음 필드를 생성합니다(특성 생략).

public MyBaseType Item;
awac9czf.note(ko-kr,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 특성: abstract가 아닌 head 요소

head 요소가 abstract가 아닌 경우 Xsd.exe는 head에 대한 각 ref 참조를 사용하고, 참조하는 요소의 maxOccurs 특성 값에 따라 head의 XML 데이터 형식 또는 해당 형식의 배열과 일치하는 형식 필드를 만듭니다. 대체 그룹에 대한 참조는 모두 유실됩니다.

파생 형식의 개체가 해당 필드에 할당될 수 있으며 XmlSerializer 클래스가 해당 개체를 serialize하지만 이러한 동작은 파생 형식으로의 대체 작업과는 관계없이 발생합니다. 대체 요소 이름은 사용되지 않습니다.

SubstitutionGroup 특성: abstract head 요소

head 요소가 abstract이면 Xsd.exe는 head의 데이터 형식과 일치하는 형식 필드를 생성합니다. 이 필드에는 Item이라는 이름이 지정됩니다. Xsd.exe는 대체 항목별로 하나의 XmlElementAttribute를 해당 필드에 적용합니다. 각 특성은 해당 이름을 식별하며 대체 요소가 파생 데이터 형식이면 해당 형식을 인식합니다. 대체 요소가 head 요소와 동일한 데이터 형식을 사용하면 XmlChoiceIdentifierAttribute도 적용되어야 합니다. <choice> 요소를 참조하십시오.

다음은 abstract head 요소에 대한 참조에서 생성된 예제 필드입니다.

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

파생 형식이 사용될 경우 파생 형식 중 하나의 인스턴스가 해당 필드에 할당된 경우에만 XML serialization이 작동합니다. 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 특성을 사용하여 요소 선언이 대체 그룹 머리글(그룹 멤버에 의해 대체된 요소)로 사용되지 않도록 할 수 있습니다.

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 특성을 입력으로 사용합니다. 이러한 멤버에 DefaultValue 특성이 적용되면 Xsd.exe는 요소의 minOccurs 특성에 대해 값 0을 생성합니다. 이것은 해당 요소가 유효한 XML 인스턴스 문서에 나타날 필요가 없음을 의미합니다.

배열(maxOccurs1보다 큰 요소)에서는 기본 특성이 무시됩니다.

Default 특성의 바인딩 지원 특성을 참조하십시오.

final

final 특성을 사용하여 요소 선언이 대체 그룹 머리글(그룹 멤버에 의해 대체된 요소)로 사용되지 않도록 할 수 있습니다.

Xsd.exe는 <schema> 요소의 finalDefault 특성뿐 아니라 final 특성도 무시합니다.

fixed

fixed 특성은 인스턴스 문서의 요소에 fixed 값을 제공합니다. XML 스키마 문서에서 소스 코드를 생성할 때 Xsd.exe는 fixed 값을 가진 요소에 해당하는 각 필드를 사용하며 다음 예제와 같이 필드의 정적 이니셜라이저를 생성합니다.

public int age = -1;

배열(maxOccurs1보다 큰 요소)에서는 fixed 특성이 무시됩니다.

form

Xsd.exe 도구는 <element> 요소의 form XML 특성을 XmlElementAttributeForm 속성과 동일한 것으로 간주합니다. .NET Framework의 XML serialization 인프라에서는 다른 기본값 qualified를 인식합니다.

XML 스키마의 <element> 선언에 form="unqualified"가 지정되면 Xsd.exe는 일치하는 필드에 대해 XmlElement 특성을 생성하고 특성 매개 변수 Form=XmlSchemaForm.Unqualified를 전달합니다.

form 특성을 참조하십시오.

id

Xsd.exe 유틸리티는 고유 식별자를 제공하기 위한 id 특성을 무시합니다. 대신 Xsd.exe에서는 name 특성을 인식합니다.

maxOccurs

XSD 문서에서 클래스를 생성할 때 Xsd.exe는 다음의 가능한 값에 따라 <element> 요소의 maxOccurs 특성을 해석합니다.

  • 1: Xsd.exe는 요소의 데이터 형식과 일치하는 형식의 필드를 생성합니다.

  • 0: Xsd.exe는 값 0을 처리하지 못하고 이 값을 기본값인 1로 취급합니다.

  • unbounded: Xsd.exe는 요소의 데이터 형식과 일치하는 형식의 배열 필드를 생성합니다.

  • 1보다 큰 정수: Xsd.exe는 unbounded 값의 경우처럼 요소의 데이터 형식과 일치하는 형식의 배열 필드를 생성합니다. SOM으로 표시되는 XML 스키마 문서에 대해 XmlValidatingReader 클래스를 통해 XML 문서의 유효성을 검사하여 1보다 큰 값을 적용할 수 있습니다.

어셈블리의 클래스 집합에서 XML 스키마 문서를 생성할 때 Xsd.exe는 앞의 변환을 역으로 수행하여 단일 인스턴스에서 maxOccurs1을 생성하고 배열에서 maxOccursunbounded를 생성합니다.

Xsd.exe는 maxOccursunbounded는 배열에 바인딩하고 maxOccurs1은 배열의 지정된 부모 요소(있는 경우)에 바인딩합니다. 추가 부모 요소 지정을 비롯하여 배열 바인딩을 위한 maxOccurs 요소 처리 방법에 대한 자세한 내용은 MaxOccurs 특성의 바인딩 지원 특성을 참조하십시오.

minOccurs

<element> 요소의 경우 Xsd.exe는 MaxOccurs 특성의 바인딩 지원 특성 값이 배열 필드를 지정하지 않을 경우에만 minOccurs 특성 값을 확인합니다. 그런 다음 이 값은 해당 필드에 참조 또는 값 형식이 있는지 여부를 비롯한 다양한 요소에 따라 해석되거나 생성됩니다.

MinOccurs 특성의 바인딩 지원 특성을 참조하십시오.

name

XSD 문서에서 소스 코드를 생성할 때 name 특성 값은 해당 요소를 나타내는 public 클래스 필드의 이름을 제공합니다. <element> 요소에 익명 <complexType> 정의가 포함되어 있으면 이 이름은 복합 형식에 해당하는 클래스의 이름이 됩니다.

코딩 규칙을 따르기 위해 대/소문자 변경을 시도하지 않습니다. 예를 들어, 익명 복합 형식 정의를 포함하는 <element>의 이름 특성 값이 testInfo이면 결과 클래스는 첫 문자가 대문자인 TestInfo가 아닌 testInfo로 명명됩니다. 이름과 예약된 키워드가 충돌하면 이름 앞에 @ 기호가 붙습니다.

Xsd.exe는 public 클래스 필드에서 <element> 선언을 생성할 때 name 특성 값으로 필드 이름을 사용합니다. 다음 특성의 속성을 통해 다른 이름(name 특성 값)이 제공될 수 있습니다.

Name 특성의 바인딩 지원 특성을 참조하십시오.

nillable

Xsd.exe 도구는 nillable 특성과 참조 형식에 적용된 특정 XML serialization 관련 특성의 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 도구는 <element> 및 <attribute> 선언의 type 특성으로 참조되는 데이터 형식을 .NET Framework 형식에 연결합니다.

XML 스키마 데이터 형식이 type 특성을 통해 데이터 형식을 참조하는 전역 요소 선언으로 추적될 수 없는 경우, Xsd.exe는 이러한 데이터 형식에 대해 .NET Framework 형식을 생성하지 않습니다.

가능한 부모 요소: <all>, <choice>, <schema>, <sequence>

가능한 자식 요소: <annotation>, <complexType>, <key>, <keyref>, <simpleType>, <unique>

참고 항목

참조

XmlSchemaElement