2.5. 복잡한 데이터 유형 정의

초록

XML 스키마는 단순 데이터 형식에서 복잡한 데이터 구조를 구축하기 위한 유연하고 강력한 메커니즘을 제공합니다. 요소 및 속성 시퀀스를 만들어 데이터 구조를 만들 수 있습니다.You can create data structures by creating a sequence of elements and attributes. 정의된 유형을 확장하여 더욱 복잡한 유형을 생성할 수도 있습니다.

복잡한 데이터 구조를 빌드하는 것 외에도 열거된 형식, 특정 범위의 값이 있는 데이터 형식 또는 기본 형식을 확장하거나 제한하여 특정 패턴을 따라야 하는 데이터 형식도 설명할 수 있습니다.In addition to building complex data structures, you can also describe specialized types such as enumerated types, data types that have a specific range of values, or data types that need to follow certain patterns by either extending or restricting the primitive types.

2.5.1. 데이터 구조 정의

2.5.1.1. 개요

XML 스키마에서 데이터 필드 컬렉션인 데이터 단위는 complexType 요소를 사용하여 정의됩니다. 복잡한 유형을 지정하려면 다음 세 가지 정보가 필요합니다.

  1. 정의된 형식의 이름은 complexType 요소의 name 특성에 지정됩니다.
  2. complexType 의 첫 번째 자식 요소는 유선에 배치될 때 구조 필드의 동작을 설명합니다. “복잡한 유형 종류” 을 참조하십시오.
  3. 정의된 구조의 각 필드는 complexType 요소 의 손자인 요소에 정의됩니다. “구조의 부분 정의” 을 참조하십시오.

예를 들어 예 2.3. “간단한 구조” 에 표시된 구조는 두 개의 요소가 있는 복잡한 유형으로 XML 스키마로 정의됩니다.

예 2.3. 간단한 구조

struct personalInfo
{
  string name;
  int age;
};

예 2.4. “복잡한 유형” 예 2.3. “간단한 구조” 에 정의된 구조의 사용 가능한 XML 스키마 매핑을 보여 줍니다. 예 2.4. “복잡한 유형” 로 정의된 구조는 nameage 의 두 가지 요소를 포함하는 메시지를 생성합니다.

.

예 2.4. 복잡한 유형

<complexType name="personalInfo">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="age" type="xsd:int" />
  </sequence>
</complexType>

2.5.1.2. 복잡한 유형 종류

XML 스키마에는 XML 문서를 표시하고 유선으로 전달될 때 복잡한 형식의 필드를 구성하는 방법을 설명하는 세 가지 방법이 있습니다. complexType 요소의 첫 번째 자식 요소는 사용 중인 복잡한 유형을 결정합니다. 표 2.1. “복잡한 유형 설명자 요소” 복잡한 유형 동작을 정의하는 데 사용되는 요소를 보여줍니다.

표 2.1. 복잡한 유형 설명자 요소

요소복잡한 유형 동작

순서

모든 복잡한 유형의 필드가 있을 수 있으며 유형 정의에 지정된 순서에 있어야 합니다.

all

모든 복잡한 유형의 필드는 존재할 수 있지만 임의의 순서로 있을 수 있습니다.

choice

구조의 요소 중 하나만 메시지에 배치할 수 있습니다.

예 2.5. “간단한 복잡한 선택 유형” 에 표시된 대로 선택 요소를 사용하여 구조가 정의된 경우 name 요소 또는 age 요소와 함께 메시지를 생성합니다.

예 2.5. 간단한 복잡한 선택 유형

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
  </choice>
</complexType>

2.5.1.3. 구조의 부분 정의

요소 요소 를 사용하여 구조를 구성하는 데이터 필드를 정의합니다. 모든 complexType 요소에는 하나 이상의 요소 가 포함되어야 합니다. complexType 요소 의 각 요소는 정의된 데이터 구조의 필드를 나타냅니다.

데이터 구조의 필드를 완전히 설명하기 위해 요소 요소에 는 다음 두 가지 필수 특성이 있습니다.

  • name 속성은 데이터 필드의 이름을 지정하고 정의된 복잡한 유형 내에서 고유해야 합니다.
  • type 속성은 필드에 저장된 데이터 유형을 지정합니다. 형식은 XML Schema 단순 유형 중 하나이거나 계약에 정의된 이름이 지정된 복잡한 유형일 수 있습니다.

nametype 외에도요소 요소에minOcurrsmaxOccurs 라는 두 가지 일반적으로 사용되는 선택적 속성이 있습니다. 이러한 속성은 구조에서 필드가 발생하는 횟수에 바인딩됩니다. 기본적으로 각 필드는 복잡한 유형에서 한 번만 수행됩니다. 이러한 특성을 사용하여 필드에 필요한 횟수 또는 구조에 나타날 수 있는 횟수를 변경할 수 있습니다. 예를 들어 예 2.6. “발생 제약 조건을 사용하는 간단한 복합 유형” 과 같이 최소 세 번 이상 발생해야 하는 필드인 previous Job을 정의할 수 있으며, 7번 이상은 지정할 수 없습니다.

예 2.6. 발생 제약 조건을 사용하는 간단한 복합 유형

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int"/>
    <element name="previousJobs" type="xsd:string:
             minOccurs="3" maxOccurs="7"/>
  </all>
</complexType>

minOccurs 를 사용하면 예 2.7. “minOccurs를 0으로 설정한 간단한 복합 유형” 에 표시된 대로 minOccurs 를 0으로 설정하여 age 필드를 선택적으로 만들 수도 있습니다. 이 경우 사용 기간 을 생략할 수 있으며 데이터는 계속 유효합니다.

예 2.7. minOccurs를 0으로 설정한 간단한 복합 유형

<complexType name="personalInfo">
  <choice>
    <element name="name" type="xsd:string"/>
    <element name="age" type="xsd:int" minOccurs="0"/>
  </choice>
</complexType>

2.5.1.4. 속성 정의

XML 문서에서 특성은 요소의 태그에 포함됩니다. 예를 들어 아래 코드의 complexType 요소에서 name 은 특성입니다. 복잡한 유형의 특성을 지정하려면 complexType 요소 정의에 특성 요소를 정의합니다. 특성 요소는 모든 , 시퀀스 또는 선택 요소 이후에만 나타날 수 있습니다.An attribute element can appear only after the all,sequence, or choice element. 각 복잡한 유형의 특성에 대해 하나의 특성 요소를 지정합니다. 모든 특성 요소는 complexType 요소의 직접 자식이어야 합니다.

예 2.8. 속성이 있는 복합 유형

<complexType name="personalInfo">
  <all>
    <element name="name" type="xsd:string"/>
    <element name="previousJobs" type="xsd:string"
             minOccurs="3" maxOccurs="7"/>
  </all>
  <attribute name="age" type="xsd:int" use="required" />
</complexType>

이전 코드에서 특성 요소는 personalInfo 복잡한 형식에 age 속성이 있음을 지정합니다.In the previous code, the attribute element specifies that the personalInfo complex type has an age attribute. attribute 요소에는 다음과 같은 속성이 있습니다.

  • name - 특성을 식별하는 문자열을 지정하는 필수 특성입니다.
  • type - 필드에 저장된 데이터의 유형을 지정합니다. 형식은 XML Schema 단순 유형 중 하나일 수 있습니다.
  • 이 특성 갖는 데 복잡한 유형이 필요한지 여부를 지정하는 선택적 특성입니다. 유효한 값은 필수 또는 선택적 입니다. 기본값은 속성이 선택 사항입니다.

특성 요소에서 특성 의 기본값을 지정할 수 있는 선택적 default 특성을 지정할 수 있습니다.

2.5.2. 배열 정의

2.5.2.1. 개요

Apache CXF는 계약에서 배열을 정의하는 두 가지 방법을 지원합니다. 첫 번째는 maxOccurs 특성에 값이 1보다 큰 단일 요소를 사용하여 복잡한 형식을 정의합니다. 두 번째는 SOAP 배열을 사용하는 것입니다. SOAP 배열은 다차원 배열을 쉽게 정의하고 스파스로 채워진 배열을 전송할 수 있는 기능과 같은 추가 기능을 제공합니다.

2.5.2.2. 복합 형식 배열

복합 형식 배열은 시퀀스 복잡한 유형의 특수한 경우입니다. 단일 요소로 복잡한 유형을 정의하고 maxOccurs 특성에 대한 값을 지정하기만 하면 됩니다. 예를 들어, 20개의 부동 소수점 숫자로 이루어진 배열을 정의하려면 예 2.9. “복잡한 유형 배열” 에 표시된 것과 유사한 복잡한 유형을 사용합니다.

예 2.9. 복잡한 유형 배열

<complexType name="personalInfo">
  <element name="averages" type="xsd:float" maxOccurs="20"/>
</complexType>

minOccurs 특성의 값을 지정할 수도 있습니다.You can also specify a value for the minOccurs attribute.

2.5.2.3. SOAP 배열

SOAP 배열은 wsdl:arrayType 요소를 사용하여 SOAP-ENC:Array 기본 형식에서 파생하여 정의됩니다. 이에 대한 구문은 예 2.10. “wsdl:arrayType을 사용하여 파생되는 SOAP 배열의 구문” 에 표시되어 있습니다. definitions 요소가 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 를 선언하는지 확인합니다.

예 2.10. wsdl:arrayType을 사용하여 파생되는 SOAP 배열의 구문

<complexType name="TypeName">
  <complexContent>
    <restriction base="SOAP-ENC:Array">
      <attribute ref="SOAP-ENC:arrayType"
                 wsdl:arrayType="ElementType<ArrayBounds>"/>
    </restriction>
  </complexContent>
</complexType>

TypeName 은 이 구문을 사용하여 새로 정의된 배열 유형의 이름을 지정합니다. elementType 은 배열의 요소 형식을 지정합니다. ArrayBounds 배열의 차원 수를 지정합니다. 단일 차원 배열을 지정하려면 [].2를 사용하여 2 차원 배열을 지정하려면 [][] 또는 [,] 를 사용합니다.

예를 들어 예 2.11. “SOAP 배열의 정의” 에 표시된 SOAP 배열인 SOAPStrings는 1차원 문자열 배열을 정의합니다. wsdl:arrayType 속성은 배열 요소, xsd:string 및 차원의 수를 지정합니다. [] 은 하나의 차원을 의미합니다.

예 2.11. SOAP 배열의 정의

<complexType name="SOAPStrings">
  <complexContent>
    <restriction base="SOAP-ENC:Array">
      <attribute ref="SOAP-ENC:arrayType"
                 wsdl:arrayType="xsd:string[]"/>
    </restriction>
  </complexContent>
</complexType>

SOAP 1.1 사양에 설명된 대로 간단한 요소를 사용하여 SOAP Array를 설명할 수도 있습니다. 이에 대한 구문은 예 2.12. “요소를 사용하여 파생되는 SOAP 배열의 구문” 에 표시되어 있습니다.

예 2.12. 요소를 사용하여 파생되는 SOAP 배열의 구문

<complexType name="TypeName">
  <complexContent>
    <restriction base="SOAP-ENC:Array">
      <sequence>
        <element name="ElementName" type="ElementType"
                 maxOccurs="unbounded"/>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

이 구문을 사용하는 경우 요소의 maxOccurs 특성은 항상 unbounded 로 설정해야 합니다.

2.5.3. 확장으로 유형 정의

대부분의 주요 코딩 언어와 마찬가지로 XML 스키마를 사용하면 다른 데이터 형식에서 일부 요소를 상속하는 데이터 형식을 만들 수 있습니다. 이를 확장 기능으로 유형을 정의라고 합니다. 예를 들어, planet 이라는 새 요소를 추가하여 예 2.4. “복잡한 유형” 에 정의된 personalInfo 구조를 확장하는anInfo라는 새 유형을 만들 수 있습니다.

확장으로 정의된 유형에는 네 가지 부분이 있습니다.

  1. 형식 이름은 complexType 요소의 name 특성으로 정의됩니다.
  2. complexContent 요소는 새 형식에 둘 이상의 요소를 갖도록 지정합니다.

    참고

    복잡한 형식에 새 특성만 추가하는 경우 간단한Content 요소를 사용할 수 있습니다.

  3. 기본 형식이라고 하는 새 형식을 파생 되는 형식은 확장 요소의 기본 특성에 지정됩니다.The type from which the new type is derived, called the base type, is specified in the base attribute of the extension element.
  4. 새 유형의 요소 및 특성은 일반 복잡한 유형의 경우와 동일하게 확장 요소에 정의됩니다.

예를 들어, 외계인Info예 2.13. “확장 기능으로 정의된 유형” 과 같이 정의됩니다.

예 2.13. 확장 기능으로 정의된 유형

<complexType name="alienInfo">
  <complexContent>
    <extension base="xsd1:personalInfo">
      <sequence>
        <element name="planet" type="xsd:string"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

2.5.4. 제한으로 유형 정의

2.5.4.1. 개요

XML 스키마를 사용하면 XML 스키마 단순 형식의 가능한 값을 제한하여 새 형식을 만들 수 있습니다.XML Schema allows you to create new types by restricting the possible values of an XML Schema simple type. 예를 들어 SSN은 정확히 9자로 구성된 간단한 유형 SSN 을 정의할 수 있습니다.For example, you can define a simple type, SSN , which is a string of exactly 9 characters. 단순 형식을 제한하여 정의한 새 형식은 simpleType 요소를 사용하여 정의됩니다.

제한으로 유형을 정의하려면 다음 세 가지 사항이 필요합니다.

  1. 새 형식의 이름은 simpleType 요소의 name 특성으로 지정됩니다.
  2. 기본 형식 이라고 하는 새 형식을 파생 되는 단순 형식은 제한 요소에 지정 됩니다.The simple type from which the new type is derived, called the base type, is specified in the restriction element. “기본 유형 지정” 을 참조하십시오.
  3. 기본 유형에 배치된 제한을 정의하는 facets 라는 규칙은 제한 요소의 자식으로 정의됩니다. “제한 정의” 을 참조하십시오.

2.5.4.2. 기본 유형 지정

기본 유형은 새 유형을 정의하도록 제한되는 유형입니다. 제한 요소를 사용하여 지정됩니다. restriction 요소는 simpleType 요소의 유일한 자식이며 기본 유형을 지정하는 하나의 속성 base 를 갖습니다. 기본 유형은 XML Schema 간단한 유형 중 하나일 수 있습니다.

예를 들어, xsd:int 의 값을 제한하여 새 유형을 정의하려면 예 2.14. “기본 유형으로 int 사용” 에 표시된 정의를 사용합니다.

예 2.14. 기본 유형으로 int 사용

<simpleType name="restrictedInt">
  <restriction base="xsd:int">
    ...
  </restriction>
</simpleType>

2.5.4.3. 제한 정의

기본 유형에 따라 제한 사항을 정의하는 규칙을 facets 라고 합니다. facet는 facet가 적용되는 방법을 정의하는 하나의 속성 값이 있는 요소입니다. 사용 가능한 facet 및 유효한 설정은 기본 유형에 따라 다릅니다. 예를 들어 xsd:string 은 다음을 포함하여 6개의 facet를 지원합니다.

  • 길이
  • minLength
  • maxLength
  • 패턴
  • whitespace
  • enumeration

각 facet 요소는 제한 요소의 자식입니다.

2.5.4.4. 예제

예 2.15. “SSN 단순 유형 설명” 는 소셜 보안 번호를 나타내는 간단한 유형의 SSN 의 예를 보여줍니다. 결과 유형은 xxx-xx-xxxx. <SSN>032-43-9876<SSN>은 이 유형의 요소에 유효한 값이지만 <SSN>032439876</SSN>은 그렇지 않습니다.

예 2.15. SSN 단순 유형 설명

<simpleType name="SSN">
  <restriction base="xsd:string">
    <pattern value="\d{3}-\d{2}-\d{4}"/>
  </restriction>
</simpleType>

2.5.5. 열거된 유형 정의

2.5.5.1. 개요

XML 스키마의 열거된 형식은 제한에 따라 정의의 특별한 사례입니다. 이러한 항목은 모든 XML 스키마 기본 형식에서 지원하는 열거 facet를 사용하여 설명합니다. 대부분의 최신 프로그래밍 언어에서 열거된 형식과 마찬가지로, 이 유형의 변수는 지정된 값 중 하나만 가질 수 있습니다.

2.5.5.2. XML 스키마에서 열거형 정의

열거형 정의의 구문은 예 2.16. “열거형 구문” 에 표시되어 있습니다.

예 2.16. 열거형 구문

<simpleType name="EnumName">
  <restriction base="EnumType">
    <enumeration value="Case1Value"/>
    <enumeration value="Case2Value"/>
    ...
    <enumeration value="CaseNValue"/>
  </restriction>
</simpleType>

열거형 형식의 이름 을 지정합니다.Specifies the name of the enumeration type. EnumType 은 case 값의 형식을 지정합니다. caseNValue . 여기서 N 은 열거의 각 특정 사례에 대한 값을 지정합니다. CaseNValue, where N is any number one or greater, specifies the value for each specific case of the enumeration. 열거된 형식은 임의의 수의 대/소문자 값을 가질 수 있지만 간단한 형식에서 파생되기 때문에 한 번에 하나의 케이스 값만 유효합니다.An enumerated type can have any number of case values, but because it is derived from a simple type, only one of the case values is valid at a time.

2.5.5.3. 예제

예를 들어 예 2.17. “widgetSize enumeration” 에 표시된 열거형 위젯Size에 정의된 요소가 포함된 XML 문서는 <wid getSize >big>big <widgetSize>가 포함된 경우 유효하지만 <widgetSize>big,mungo</widgetSize>가 포함된 경우 유효하지 않습니다.

예 2.17. widgetSize enumeration

<simpleType name="widgetSize">
  <restriction base="xsd:string">
    <enumeration value="big"/>
    <enumeration value="large"/>
    <enumeration value="mungo"/>
  </restriction>
</simpleType>