Default 특성의 바인딩 지원
이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.
.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;
배열에서는 기본 특성(maxOccurs가 1
보다 큰 요소)이 무시됩니다.
데이터 형식별 바인딩 지원
XML 스키마에 따라 default 특성 값은 반드시 단순 형식이어야 합니다. Xsd.exe는 XML 스키마를 클래스로 변환하고 다시 새 XML 스키마 문서로 변환하는 라운드트립 변환을 수행할 때 거의 모든 단순 형식에 대해 기본값을 유지합니다.
xsd:base64Binary 또는 xsd:hexBinary 형식의 요소나 특성은 예외입니다. 만들어진 해당 System.Byte 필드에는 DefaultValue 특성이 적용되지 않습니다.
다른 예외로는 목록 형식의 특성을 들 수 있습니다. <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> 선언에 use 특성이 포함되어 있고 이 특성의 값이 기본값인 optional
이라고 가정합니다. XSD 문서에서 소스 코드를 생성할 때 Xsd.exe는 이 값과 함께 default 특성의 지정 여부를 해석합니다. 다음 두 가지로 해석될 수 있습니다.
default가 지정됨: Xsd.exe는 XmlAttributeAttribute와 기본값을 지정하는 DefaultValueAttribute를 갖는 public 필드를 생성합니다.
default가 지정되지 않음: Xsd.exe는 XmlAttributeAttribute를 갖는 public 필드를 생성합니다. 또한 값 형식의 경우 특성 필드 이름에
Specified
가 추가된 이름을 갖는 bool 형식의 공용 필드를 생성합니다. 예를 들어, 특성 필드 이름이startDate
인 경우 bool 필드 이름은startDateSpecified
가 됩니다. 개체를 XML로 serialize할 때 XmlSerializer 클래스는 bool 필드의 값을 확인하여 선택적 특성을 쓸지 여부를 결정합니다. bool 필드는 XmlSerializer가 serialize되지 않도록 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