다음을 통해 공유


Attribute 요소의 바인딩 지원

이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.

.NET Framework에서는 <attribute> 요소에 대한 바인딩 지원을 제공합니다.

그러나, Xsd.exe에서는 전역 특성이 스키마 대상 네임스페이스 이외의 네임스페이스에서 선언된 경우를 제외하고는 로컬로 선언된 특성과 전역으로 선언된 특성에 대한 참조를 구분하지 않습니다.

설명

XML 스키마 사양에는 특성이 복합 형식 정의 내에서 로컬로 또는 전역으로 선언될 수 있으며, 이렇게 선언된 속성은 ref 특성을 통해 하나 이상의 복합 형식에 의해 참조될 수 있다고 나와 있습니다.

다음은 로컬로 선언된 특성의 예입니다.

<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 속성을 사용하여 네임스페이스를 지정합니다. 이러한 특정 요소의 경우 Namespace 속성을 통해 지정된 네임스페이스가 XmlTypeAttribute 특성이나 XmlRootAttribute를 사용하여 클래스 수준에서 지정된 네임스페이스를 재정의합니다. 이러한 예제는 다음과 같습니다.

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

공개 문자열 키;

추가 네임스페이스는 <import> 요소를 사용하여 XML 스키마 정의로 가져옵니다.

Example

이 첫 번째 예제에서는 전역 특성이 해당 전역 특성에 대한 참조를 포함하는 동일한 대상 네임스페이스에 정의되어 있는 경우 Xsd.exe에서 이러한 전역 특성을 처리하는 방법을 보여 줍니다.

입력 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 스키마에서는 원래 전역으로 선언된 버전 특성이 로컬 특성이 되었습니다.

다음 두 번째 예제에서는 전역 특성이 별도의 네임스페이스에 정의된 경우 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: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> 

앞의 두 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 특성을 통해 지정되었는지 여부에 따라 다릅니다. optionaldefault 조합을 포함하여 use 특성에 사용할 수 있는 값과 해당하는 Xsd.exe 출력은 다음과 같습니다.

  • required: Xsd.exe에서 System.Xml.Serialization.XmlAttributeAttribute를 사용하여 public 필드를 생성합니다.

  • default와 함께 optional이 지정됨: Xsd.exe는 XmlAttributeAttribute와 기본값을 지정하는 System.Component.DefaultValueAttribute를 갖는 public 필드를 생성합니다.

  • default 없이 optional이 지정됨: Xsd.exe는 XmlAttributeAttribute를 갖는 public 필드를 생성합니다. 또한 특성의 형식이 참조 형식(예: 문자열)이 아니면 특성 필드 이름에 Specified가 추가된 이름을 갖는 bool 형식의 public 필드를 생성합니다. 예를 들어, 특성 필드 이름이 startDate인 경우 bool 필드 이름은 startDateSpecified가 됩니다. 개체를 XML로 serialize할 때 XmlSerializer 클래스는 bool 필드의 값을 확인하여 선택적 특성을 쓸지 여부를 결정합니다. bool 필드는 XmlSerializer가 serialize되지 않도록 System.Xml.Serialization.XmlIgnoreAttribute로 표시됩니다.

  • prohibited: Xsd.exe에서 아무것도 생성하지 않습니다.

Use 특성: 클래스에서 XML 스키마 문서 생성

다음 두 경우 중 하나인 경우, Xsd.exe는 use 특성을 지정하지 않고 기본값인 optional로 되돌립니다.

두 조건 중 어디에도 해당되지 않으면, 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에서는 default 특성이 지정되었는지 여부를 확인하여 optional 값을 갖는 use 특성을 해석하는 방법을 결정합니다. 자세한 내용은 default 특성을 참조하십시오.

Xsd.exe 도구는 기본값을 갖는 목록 형식의 특성에 대해 유효한 소스 코드를 생성하지 못합니다. 이런 경우에 대해서는 default 특성에서 설명합니다. 또한 <list> 요소도 참조하십시오.

fixed

<attribute> 선언의 경우 Xsd.exe는 다음 예제와 같이 fixed 특성 값을 사용하여 필드를 fixed 값으로 정적으로 초기화합니다.

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

fixed 특성을 참조하십시오.

form

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

XML 스키마의 <attribute> 선언에서 form="qualified"를 지정하는 경우, Xsd.exe는 해당 필드에 대해 XmlAttribute 특성을 생성하고 이 특성에 Form=XmlSchemaForm.Qualified 매개 변수를 전달합니다.

form 특성을 참조하십시오.

id

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

name

XSD 문서에서 소스 코드를 생성할 경우 name 특성의 값은 해당 특성을 나타내는 공용 클래스의 이름을 제공합니다. 이름과 예약된 키워드가 충돌하면 이름 앞에 @ 기호가 붙습니다.

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

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

ref

XML 스키마 복합 형식에서 .NET Framework 형식을 생성할 경우, Xsd.exe에서는 전역 특성이 스키마 대상 네임스페이스 이외의 네임스페이스에서 선언된 경우를 제외하고는 로컬로 선언된 특성과 전역으로 선언된 특성에 대한 참조를 구분하지 않습니다.

동일한 네임스페이스 내에서 참조 및 다른 네임스페이스에 대한 참조 단원을 참조하십시오.

type

Xsd.exe 도구는 <attribute><element> 선언의 type 특성으로 참조되는 데이터 형식을 .NET Framework 형식에 연결합니다.

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

use

use=“optional”인 경우, Xsd.exe는 default 특성이 있는지를 확인하여 DefaultValueAttribute를 생성할지 또는 추가 –Specified 필드를 생성할지를 결정합니다. 참조 형식(예: 문자열)에는 추가 필드가 생성되지 않습니다. 두 공용 필드가 모두 없으면 Xsd.exe는 생성된 XSD 문서에서 use=“required”를 지정합니다.

앞에서 설명한 Use 특성 단원을 참조하십시오.

가능한 부모 요소: <attributeGroup>, <complexType>, <extension>, <restriction>, <schema>

가능한 자식 요소: <annotation>, <simpleType>

참고 항목

참조

XmlSchemaAttribute