MaxOccurs 특성의 바인딩 지원
이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.
.NET Framework에서는 maxOccurs 특성에 대한 부분 바인딩 지원을 제공합니다.
maxOccurs 특성을 지정할 수 있는 대부분의 요소에 대해 Xsd.exe는 0
값을 1
로 해석하여 비배열 필드를 생성하고 1보다 큰 값을 unbounded
로 해석하여 배열 필드를 생성합니다. 이 동작은 요소에 따라 다릅니다.
설명
maxOccurs 및 minOccurs 특성은 지정된 엔터티가 XML 인스턴스 문서의 해당 위치에 연속해서 나타날 수 있는 횟수를 제한합니다.
이러한 특성은 복합 형식 정의에서만 사용됩니다. 따라서 <element> 또는 <group> 요소에 이러한 특성을 지정하려면 해당 요소가 전역 선언이 아닌 로컬 선언이거나 전역 선언에 대한 참조여야 합니다.
XML 스키마 복합 형식이 있는 바인딩 클래스의 경우 .NET Framework에서는 maxOccurs 또는 minOccurs 특성에 해당하는 직접적인 프로그래밍 언어를 제공하지 않습니다.
XML 스키마 문서에서 소스 코드를 생성하거나 역변환을 수행할 때 Xsd.exe는 maxOccurs 특성이 나타나는 XML 스키마 정의 언어 요소에 따라 이 특성을 다르게 해석합니다. 다음 표에서는 요소별 해석 방식을 보여 줍니다.
요소 | 해석 |
---|---|
<element> |
가능한 값:
|
<group> |
<group> 요소의 경우 Xsd.exe는 maxOccurs 값 그러나 Xsd.exe는 기본적으로 <group> 요소의
|
<all> |
maxOccurs 특성에 대해 |
<any> |
가능한 값
|
<choice> |
<choice> 요소는 각각 요소 또는 요소 그룹을 나타내는 두 개 이상의 자식 요소를 포함합니다. 즉, 지정된 인스턴스 문서에서 해당 엔터티 중 하나만 지정된 위치에 나타날 수 있습니다. choice는 요소 이름별로 달라야 하며, 필요에 따라 형식별로 다를 수 있고 그룹 내에서는 번호별로 다를 수 있습니다. 자세한 내용은 <choice> 요소를 참조하십시오. <choice> 요소의 경우 <element> 및 <any> 요소에 대해 Xsd.exe는 maxOccurs 값 해당 값이 해당 값이 |
<sequence> |
<sequence> 요소의 경우 Xsd.exe는 앞에 나온 대부분의 요소에 대해 maxOccurs 값 그러나 <sequence> 요소의 그룹의 요소마다 하나씩 XmlElementAttribute 특성이 적용됩니다. 배열의 형식은 요소의 형식에 따라 결정되며, 이 형식은 모든 요소를 할당할 수 있는 가장 많이 파생되는 형식이 됩니다. 즉, 그룹에 TypeBase에서 파생된 Type1과 Type2 형식의 요소가 있으면 배열의 형식은 TypeBase가 됩니다. 공통 기본 형식이 없으면 배열의 형식은 Object가 됩니다. 관련 예제는 이 항목 아래쪽의 <sequence> 예제를 참조하십시오. |
어셈블리의 클래스 집합에서 XML 스키마 문서를 생성할 때 Xsd.exe는 앞의 변환을 역으로 수행하여 단일 인스턴스에서 maxOccurs 값 1
을 생성하고 배열에서 maxOccurs 값 unbounded
를 생성합니다.
Xsd.exe는 maxOccurs 값 unbounded
는 배열에 바인딩하고 maxOccurs 값 1
은 배열의 지정된 부모 요소(있는 경우)에 바인딩합니다.
배열에 기본 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.MaxOccurs 및 System.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
maxOccurs가 1
보다 큰 시퀀스를 포함하는 입력 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>
앞에서 살펴 본 것처럼 결과 스키마는 원래 스키마와 같지 않습니다. maxOccurs가 1
보다 큰 시퀀스를 갖는 스키마를 제대로 가져오려면 /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