다음을 통해 공유


MaxOccurs 특성의 바인딩 지원

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

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

maxOccurs 특성을 지정할 수 있는 대부분의 요소에 대해 Xsd.exe는 0 값을 1로 해석하여 비배열 필드를 생성하고 1보다 큰 값을 unbounded로 해석하여 배열 필드를 생성합니다. 이 동작은 요소에 따라 다릅니다.

설명

maxOccursminOccurs 특성은 지정된 엔터티가 XML 인스턴스 문서의 해당 위치에 연속해서 나타날 수 있는 횟수를 제한합니다.

이러한 특성은 복합 형식 정의에서만 사용됩니다. 따라서 <element> 또는 <group> 요소에 이러한 특성을 지정하려면 해당 요소가 전역 선언이 아닌 로컬 선언이거나 전역 선언에 대한 참조여야 합니다.

XML 스키마 복합 형식이 있는 바인딩 클래스의 경우 .NET Framework에서는 maxOccurs 또는 minOccurs 특성에 해당하는 직접적인 프로그래밍 언어를 제공하지 않습니다.

XML 스키마 문서에서 소스 코드를 생성하거나 역변환을 수행할 때 Xsd.exe는 maxOccurs 특성이 나타나는 XML 스키마 정의 언어 요소에 따라 이 특성을 다르게 해석합니다. 다음 표에서는 요소별 해석 방식을 보여 줍니다.

요소 해석

<element>

가능한 값:

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

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

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

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

<group>

<group> 요소의 경우 Xsd.exe는 maxOccurs01로 해석하고 1보다 큰 maxOccurs 값을 unbounded로 해석합니다.

그러나 Xsd.exe는 기본적으로 <group> 요소의 maxOccurs="unbounded" 값을 각 자식 요소가 maxOccurs="unbounded"로 지정된 것처럼 취급합니다. 예를 들어, <group> 요소의 각 자식이 <element> 요소인 경우 결과 클래스에서 생성되는 각 필드는 적절한 형식의 배열입니다.

1보다 큰 maxOccurs를 사용하여 그룹이 포함된 스키마를 제대로 가져오려면 Xsd.exe에 /order 명령줄 옵션을 사용하는 것이 좋습니다. 이 옵션을 사용하면 여러 XmlElementAttribute 특성이 그룹의 각 요소에 하나씩 적용된 단일 배열로 전체 그룹을 가져옵니다. 배열의 형식은 요소의 형식에 따라 결정되며 이 형식은 모든 요소를 할당할 수 있는 가장 많이 파생되는 형식이 됩니다. 즉, 그룹에 TypeBase에서 파생된 Type1과 Type2 형식의 요소가 있으면 배열의 형식은 TypeBase가 됩니다. 공통 기본 형식이 없으면 배열의 형식은 Object가 됩니다. 관련 예제는 이 항목 아래쪽의 <sequence> 예제를 참조하십시오.

<all>

maxOccurs 특성에 대해 1 이외의 값은 유효하지 않습니다. Xsd.exe에서는 잘못된 값에 대해 오류를 보고합니다.

<any>

가능한 값:

  • 1: Xsd.exe는 System.Xml.Serialization.XmlAnyElementAttribute 특성이 지정된 System.Xml.XmlElement 형식의 필드를 생성합니다. 이 특성을 사용하면 클래스에서 임의의 XML 요소를 다른 가능한 클래스 멤버로 식별되는 비 XML 형식에 바인딩하지 않고도 나타낼 수 있습니다.

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

  • unbounded: Xsd.exe는 XmlAnyElement 특성이 지정된 XmlElement 배열을 생성합니다.

  • 1보다 큰 정수: unbounded 값의 경우처럼 Xsd.exe는 XmlAnyElement 특성이 지정된 XmlElement 배열을 생성합니다. SOM으로 표시되는 XML 스키마 문서에 대해 XmlValidatingReader 클래스를 통해 XML 문서의 유효성을 검사하여 1보다 큰 값을 적용할 수 있습니다.

<choice>

<choice> 요소는 각각 요소 또는 요소 그룹을 나타내는 두 개 이상의 자식 요소를 포함합니다. 즉, 지정된 인스턴스 문서에서 해당 엔터티 중 하나만 지정된 위치에 나타날 수 있습니다. choice는 요소 이름별로 달라야 하며, 필요에 따라 형식별로 다를 수 있고 그룹 내에서는 번호별로 다를 수 있습니다. 자세한 내용은 <choice> 요소를 참조하십시오.

<choice> 요소의 경우 <element><any> 요소에 대해 Xsd.exe는 maxOccurs01로 해석하고, 1보다 큰 maxOccurs 값을 unbounded로 해석합니다.

해당 값이 1인 경우 Xsd.exe는 공통 형식 또는 공통 기본 형식의 필드를 생성합니다. 각 choice에 대해 XmlElementAttribute 형식의 특성이 필드에 적용됩니다. choice가 형식별로 다르지 않으면 Xsd.exe는 XmlChoiceIdentifierAttribute 형식의 특성을 생성하여 각 choice를 나타내는 열거형 형식을 가진 또 다른 필드를 지정합니다. 이 메커니즘은 <choice> 요소와 관련된 예제를 통해 자세히 설명되어 있습니다.

해당 값이 unbounded인 경우 Xsd.exe는 choice에 대해 생성된 필드가 해당 형식의 배열인 경우를 제외하고 동일한 바인딩을 수행합니다. 모든 choice의 형식이 동일하면 XmlChoiceIdentifier 특성으로 식별되는 두 번째 필드는 생성된 열거형의 배열이고, 두 번째 배열의 각 요소는 첫 번째 배열의 해당 요소에 대한 요소 이름을 선택합니다.

<sequence>

<sequence> 요소의 경우 Xsd.exe는 앞에 나온 대부분의 요소에 대해 maxOccurs01로 해석하고, 1보다 큰 maxOccurs 값을 unbounded로 해석합니다.

그러나 <sequence> 요소의 maxOccurs="unbounded" 값은 각 자식 요소가 maxOccurs="unbounded"로 지정된 것처럼 처리합니다. 예를 들어, <sequence> 요소의 각 자식이 <element> 요소인 경우 결과 클래스에서 생성되는 각 필드는 해당 형식의 배열입니다. Xsd.exe는 새 XSD 문서에 대한 역변환을 수행한 경우 이 필드 구조체를 지정된 수의 <element maxOccurs="unbounded"> 요소가 포함된 <sequence maxOccurs="1"> 요소로 바인딩합니다.

그룹의 요소마다 하나씩 XmlElementAttribute 특성이 적용됩니다. 배열의 형식은 요소의 형식에 따라 결정되며, 이 형식은 모든 요소를 할당할 수 있는 가장 많이 파생되는 형식이 됩니다. 즉, 그룹에 TypeBase에서 파생된 Type1과 Type2 형식의 요소가 있으면 배열의 형식은 TypeBase가 됩니다. 공통 기본 형식이 없으면 배열의 형식은 Object가 됩니다. 관련 예제는 이 항목 아래쪽의 <sequence> 예제를 참조하십시오.

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

Xsd.exe는 maxOccursunbounded는 배열에 바인딩하고 maxOccurs1은 배열의 지정된 부모 요소(있는 경우)에 바인딩합니다.

배열에 기본 System.Xml.Serialization.XmlArrayAttribute가 적용되면 배열의 부모 요소를 나타내기 위해 이름이 ArrayOf로 시작되는 스키마 데이터 형식이 만들어집니다. 또는 배열에 System.Xml.Serialization.XmlElementAttribute 특성이 배열에 적용된 경우, 배열 요소는 클래스에 바인딩되는 요소의 자식으로 인스턴스 문서에 나타납니다. 배열 바인딩에 대한 자세한 내용은 특성을 사용하여 XML Serialization 제어를 참조하십시오.

배열 바인딩에 대한 추가 정보. 1보다 큰 값을 배열로 변환하는 과정을 이해하기 위해 특정 형식의 개체를 선언하는 경우와 이러한 개체에 값(스택이나 힙에서의 메모리 위치)을 할당하는 경우의 차이점을 파악해 볼 수 있습니다. 예를 들어, 다음과 같은 XSD 요소가 있다고 가정합니다.

<xsd:element minOccurs="5" maxOccurs="5" name="items" type="xsd:token" />

코드를 수동으로 작성하는 경우에는 public string[] items와 같이 형식 선언에 배열 크기 5를 표시하지 않습니다. 반면 값을 할당하는 경우에는 items = new string[5]와 같이 배열 크기를 표시합니다.

Xsd.exe에서 XML 스키마로 생성하는 소스 코드 유형은 형식, 필드 선언 및 형식과 필드에 특성으로 적용할 수 있는 메타데이터뿐입니다. 개체에 값을 할당하면 이러한 범위가 확장됩니다.

1보다 큰 값을 적용하는 경우는 XmlValidatingReader 클래스를 사용하여 SOM(스키마 개체 모델)으로 표시되는 XML 스키마 문서에 대해 XML 문서의 유효성을 검사할 경우입니다. SOM은 System.Xml.Schema.XmlSchemaParticle.MaxOccursSystem.Xml.Schema.XmlSchemaParticle.MaxOccursString 속성을 사용합니다. 이 두 속성은 maxOccurs 특성을 포함할 수 있는 모든 요소에 적용됩니다.

Example

복합 형식 정의 내의 입력 XML 스키마 <choice> 요소:

<xsd:choice maxOccurs="unbounded">
    <xsd:element name="stringA" type="xsd:string"/>
    <xsd:element name="stringB" type="xsd:string"/>
</xsd:choice>

앞의 XML 스키마 문서에서 생성된 C# 클래스로부터의 관련 경로와 choice 요소를 나타내는 열거형(대상 네임스페이스가 http://example.org/인 것으로 가정):

    [System.Xml.Serialization.XmlElementAttribute("stringA", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("stringB", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public string[] Items;
        
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType[] ItemsElementName;
...
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/", IncludeInSchema=false)]
public enum ItemsChoiceType {
    stringA,
    stringB,
}

앞의 C# 소스 코드에서 컴파일된 클래스에서 생성된 복합 형식은 원래의 복합 형식과 사실상 동일합니다.

<sequence>

Example

maxOccurs1보다 큰 시퀀스를 포함하는 입력 XML 스키마 문서:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="ComplexInstance">
   <xsd:complexType>
     <xsd:sequence maxOccurs="unbounded">
       <xsd:element name="Field1" type="xsd:token"/>
       <xsd:element name="Field2" type="xsd:int" />
     </xsd:sequence>
   </xsd:complexType>
  </xsd:element>
</xsd:schema>

명령줄 옵션을 사용하지 않고 앞의 XML 스키마 문서에서 생성된 C# 클래스:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://example.org/", IsNullable=false)]
public class ComplexInstance {        
    [System.Xml.Serialization.XmlElementAttribute("Field1", DataType="token")]
    public string[] Field1;
        
    [System.Xml.Serialization.XmlElementAttribute("Field2")]
    public int[] Field2;
}

앞의 C# 소스에서 컴파일된 어셈블리에서 생성된 XML 스키마 복합 형식:

<xs:complexType name="ComplexInstance">
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="unbounded" name="Field1" type="xs:token" />
    <xs:element minOccurs="0" maxOccurs="unbounded" name="Field2" type="xs:int" />
  </xs:sequence>
</xs:complexType>

앞에서 살펴 본 것처럼 결과 스키마는 원래 스키마와 같지 않습니다. maxOccurs1보다 큰 시퀀스를 갖는 스키마를 제대로 가져오려면 /order 명령줄 옵션을 사용하십시오. 그 결과는 다음과 같습니다.

[System.Xml.Serialization.XmlTypeAttribute

(Namespace="http://example.org/")]

[System.Xml.Serialization.XmlRootAttribute

(Namespace="http://example.org/", IsNullable=false)]

public partial class ComplexInstance

{

/// <remarks/>

[System.Xml.Serialization.XmlElementAttribute

("Field1", typeof(string), DataType="token", Order=0)]

[System.Xml.Serialization.XmlElementAttribute("Field2",

typeof(int), Order=0)]

public object[] Items;

}

포함할 수 있는 요소: <all>, <any>, <choice>, <element>, <group>, <sequence>

참고 항목

참조

System.Xml.Schema.XmlSchemaParticle.MaxOccurs
System.Xml.Schema.XmlSchemaParticle.MaxOccursString
XmlSchemaAll
XmlSchemaAny
XmlSchemaChoice
XmlSchemaElement
XmlSchemaGroupRef
XmlSchemaSequence