Share via


Mixed 특성의 바인딩 지원

.NET Framework에서는 mixed 특성에 대한 부분 바인딩 지원을 제공합니다.

확장을 통해 복합 형식을 정의할 경우 Xsd.exe 도구에서는 mixed="true" XML 특성을 XmlTextAttribute가 적용된 문자열 배열 필드와 동일한 것으로 간주합니다.

설명

mixed 특성은 complexTypecomplexContent 요소에 사용할 수 있습니다. true 값은 자식 요소나 본문 텍스트(문자 그대로 형식화되지 않은 문자 데이터) 또는 둘의 조합이 요소에 포함될 수 있음을 나타냅니다.

XML 스키마에 따라 **<complexContent>**의 mixed 값이 **<complexType>**의 mixed 값을 재정의합니다. <complexContent> 요소가 있는 경우 이 요소는 <complexType> 요소의 유일한 자식입니다.

Xsd.exe에서는 다음과 같이 mixed 특성에 대한 true 설정을 System.Xml.Serialization.XmlTextAttribute 특성을 갖는 문자열 배열 필드로 매핑합니다.

[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;

XmlText 특성은 클래스 멤버를 본문 텍스트로 serialize하도록 XmlSerializer 클래스에 지시합니다. 바인딩은 양방향으로, 즉 클래스에서 .xsd 파일을 생성할 때와 .xsd 파일에서 소스를 생성할 때에 수행됩니다.

확장에 의한 형식 파생

XML 스키마 사양에서는 다음과 같이 확장을 통한 혼합 콘텐츠와 요소만 있는 콘텐츠 간의 전환을 금지합니다.

  • XML 스키마에서는 비혼합 자식 요소가 있는 복합 형식을 확장하여 혼합 콘텐츠가 있는 복합 형식을 만드는 것을 금지합니다.

  • 마찬가지로 XML 스키마에서는 혼합 콘텐츠가 있는 복합 형식을 확장하여 비혼합 자식 요소가 있는 복합 형식을 만드는 것을 금지합니다.

Xsd.exe는 XML 스키마 문서에서 소스 코드를 생성할 때 이러한 잘못된 확장을 발견하는 경우 다음 경고를 표시합니다.

스키마 유효성 검사 경고: 파생 형식과 기본 형식은 내용 형식이 같아야 합니다.

동시에 Xsd.exe는 앞서 설명한 XmlText 특성을 갖는 문자열 배열 필드를 혼합 콘텐츠가 도입된 파생 클래스에 배치합니다. 이렇게 하면 모든 하위 항목이 혼합 콘텐츠를 가지게 됩니다.

상위 복합 형식에 자식 요소가 있고 하위 복합 형식에서 mixed="true"를 지정하는 경우 앞의 경고가 발생합니다. 상위 복합 형식에서 mixed 특성에 true 값을 지정하고 하위 복합 형식에서 <complexContent> 또는 <complexType> 요소에 true 값을 명시적으로 지정하지 않는 경우에도 이 경고가 발생합니다.

일반적으로 어셈블리의 클래스 집합에서 XML 스키마 문서를 생성할 때 Xsd.exe는 다음 요소의 mixed 특성을 true로 설정합니다.

  • <complexType>: 혼합 콘텐츠를 포함하는 복합 형식을 위한 요소입니다. 이 형식은 XmlText 특성을 갖는 문자열 배열 필드가 포함된 클래스에 해당합니다. 이 항목의 뒷부분에서 설명한 것처럼 데이터 형식이 기본 복합 형식이 아니어도 스키마는 유효할 수 있습니다.

  • <complexContent>: 하위 복합 형식을 위한 요소입니다.

XML 스키마 문서를 사용할 때 Xsd.exe는 기본값인 <complexContent mixed="false">로 재정의해야 하는 경우에도 하위 형식에 대해 상속된 혼합 콘텐츠를 나타내도록 <complexType mixed="true">를 사용합니다. 생성된 코드에서 변환하는 역방향 변환의 경우 다음과 같이 올바른 형식이 복원됩니다.

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

혼합 콘텐츠가 파생 복합 형식에 도입될 수도 있습니다. 이 경우 기본 복합 형식에는 특성을 가질 수 있는 자식 요소가 포함되지 않습니다. 그러나 Xsd.exe에서 라운드트립 변환을 수행할 때 다른 의미를 갖는 XML 스키마를 생성하는 경우도 있을 수 있습니다.

혼합 콘텐츠를 도입하는 파생 형식은 다음과 같이 지정해야 합니다.

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

역방향 변환 시 Xsd.exe는 다음 예제에서 볼 수 있듯이 mixed="true"의 위치를 변경합니다.

<complexType mixed="true">
    <complexContent mixed="false">
        ...
    </complexContent>
</complexType>

여기서 XML 스키마에 따라 <complexContent> 요소의 false 값이 <complexType> 요소의 true 값을 재정의하므로 파생 형식의 콘텐츠가 비혼합 콘텐츠가 되며 이는 원래 의도와 모순됩니다.

혼합 콘텐츠를 포함하는 복합 형식의 경우 Xsd.exe는 항상 <complexContent> 요소가 아닌 <complexType> 요소(있는 경우)에서 mixed 특성을 true로 설정하기 때문에 이러한 실수가 발생합니다.

하지만 Xsd.exe에서는 이러한 역 출력을 입력으로 받을 경우, XmlText 특성을 갖는 문자열 배열 필드를 해당 클래스의 멤버로 만들어 파생 형식을 포함하는 혼합 콘텐츠로 일관되게 해석합니다. 앞에서 설명한 대로 Xsd.exe는 <complexContent mixed="false>로 재정의해야 하는 경우에도 하위 형식을 상속된 혼합 콘텐츠로 나타내도록 <complexType mixed="true">를 적용합니다.

제한에 의한 형식 파생

XML 스키마를 사용하면 혼합 콘텐츠가 있는 복합 형식을 제한하여 비혼합 자식 요소가 있는 복합 형식을 파생시킬 수 있습니다. 그러나 .NET Framework는 복합 형식 제한을 인식하지 않습니다. 대신 Xsd.exe는 기본 클래스에서 상속되는 빈 클래스를 만듭니다. <restriction> 요소를 참조하십시오.

포함할 수 있는 요소: <complexContent>, <complexType>

참고 항목

참조

System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.