35장. 복합 유형 사용

초록

복잡한 형식은 여러 요소를 포함할 수 있으며 특성이 있을 수 있습니다. 유형 정의로 표시되는 데이터를 저장할 수 있는 Java 클래스에 매핑됩니다. 일반적으로 콘텐츠 모델의 요소와 속성을 나타내는 속성 세트가 있는 빈에 매핑됩니다.

35.1. 기본 Complex 유형 매핑

35.1.1. 개요

XML 스키마 복잡한 형식은 단순 형식보다 복잡한 정보를 포함하는 구문을 정의합니다. 가장 간단한 복잡한 유형은 특성을 사용하여 빈 요소를 정의합니다. 복잡한 더 복잡한 유형은 요소 컬렉션으로 구성됩니다.

기본적으로 XML 스키마 복잡한 유형은 XML 스키마 정의에 나열된 각 요소 및 특성을 나타내는 멤버 변수와 함께 Java 클래스에 매핑됩니다. 클래스에는 각 멤버 변수에 대해 setter 및 getter가 있습니다.

35.1.2. XML 스키마로 정의

XML 스키마 복합 유형은 complexType 요소를 사용하여 정의됩니다. complexType 요소는 데이터의 구조를 정의하는 데 사용되는 나머지 요소를 래핑합니다. 명명된 형식 정의의 부모 요소 또는 요소에 저장된 정보의 구조를 익명으로 정의하는 요소의 자식으로 나타날 수 있습니다.It can appear either as the parent element of a named type definition, or as the child of an element element anonymous defining the structure of the information stored in the element. complexType 요소를 사용하여 명명된 유형을 정의할 때 name 특성을 사용해야 합니다. name 속성은 유형을 참조할 수 있는 고유 식별자를 지정합니다.

하나 이상의 요소를 포함하는 복잡한 유형 정의에는 표 35.1. “Complex Type에서 How Elements Appear를 정의하는 데 필요한 요소” 에 설명된 하위 요소 중 하나가 있습니다. 이러한 요소는 형식의 인스턴스에 지정된 요소가 표시되는 방식을 결정합니다.

표 35.1. Complex Type에서 How Elements Appear를 정의하는 데 필요한 요소

요소설명

all

복잡한 형식의 일부로 정의된 모든 요소가 형식의 인스턴스에 표시되어야 합니다.All of the elements defined as part of the complex type must appear in an instance of the type. 그러나 그들은 어떤 순서로든 나타날 수 있습니다.

choice

복잡한 형식의 일부로 정의된 요소 중 하나만 형식의 인스턴스에 나타날 수 있습니다.Only one of the elements defined as part of the complex type can appear in an instance of the type.

순서

복잡한 형식의 일부로 정의된 모든 요소는 형식의 인스턴스에 표시되어야 하며 형식 정의에 지정된 순서로 표시되어야 합니다.All of the elements defined as part of the complex type must appear in an instance of the type, and they must also appear in the order specified in the type definition.

참고

복잡한 유형 정의가 특성만 사용하는 경우 표 35.1. “Complex Type에서 How Elements Appear를 정의하는 데 필요한 요소” 에 설명된 요소 중 하나가 필요하지 않습니다.

요소를 표시할 방법을 결정한 후 정의에 하나 이상의 요소 자식을 추가하여 요소를 정의합니다.After deciding how the elements will appear, you define the elements by adding one or more element children to the definition.

예 35.1. “XML Schema Complex Type” XML 스키마에서 복잡한 유형 정의를 보여줍니다.

예 35.1. XML Schema Complex Type

<complexType name="sequence">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="street" type="xsd:short" />
    <element name="city" type="xsd:string" />
    <element name="state" type="xsd:string" />
    <element name="zipCode" type="xsd:string" />
  </sequence>
</complexType>

35.1.3. Java로의 매핑

XML 스키마 복잡한 유형은 Java 클래스에 매핑됩니다. 복잡한 형식 정의의 각 요소는 Java 클래스의 멤버 변수에 매핑됩니다. getter 및 setter 메서드도 복잡한 유형의 각 요소에 대해 생성됩니다.

생성된 모든 Java 클래스는 @XmlType 주석으로 장식됩니다. 이름이 지정된 복잡한 유형의 매핑이 있는 경우 주석 이름은 complexType 요소의 name 속성 값으로 설정됩니다. 복잡한 유형이 요소 정의의 일부로 정의되면 @XmlType 주석의 name 속성 값은 요소 요소name 속성 값입니다.

참고

“인라인 유형을 사용하여 요소의 매핑” 에서 설명한 것처럼, 요소 정의의 일부로 정의된 복잡한 형식에 대해 생성되는 경우 생성된 클래스는 @XmlRootElement 주석으로 장식됩니다.

XML 스키마 복잡한 유형의 요소를 처리하는 방법을 나타내는 지침을 제공하기 위해 코드 생성기는 클래스 및 해당 멤버 변수를 장식하는 데 사용되는 주석을 변경합니다.

모든 복잡성 유형

모든 복잡한 유형은 all 요소를 사용하여 정의됩니다. 주석이 다음과 같이 표시됩니다.

  • @XmlType 주석의 propOrder 속성이 비어 있습니다.
  • 각 요소는 @XmlElement 주석으로 장식됩니다.
  • @XmlElement 주석의 필수 속성이 true 로 설정됩니다.

    예 35.2. “모든 복잡성 유형의 매핑” 두 개의 요소가 있는 모든 복잡한 유형의 매핑을 표시합니다.

    예 35.2. 모든 복잡성 유형의 매핑

    @XmlType(name = "all", propOrder = {
    
    })
    public class All {
        @XmlElement(required = true)
        protected BigDecimal amount;
        @XmlElement(required = true)
        protected String type;
    
        public BigDecimal getAmount() {
            return amount;
        }
    
        public void setAmount(BigDecimal value) {
            this.amount = value;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String value) {
            this.type = value;
        }
    }
선택 복잡성 유형

선택 가능한 복잡한 유형은 choice 요소를 사용하여 정의됩니다. 주석이 다음과 같이 표시됩니다.

  • @XmlType 주석의 propOrder 속성은 XML 스키마 정의에 표시되는 순서대로 요소의 이름을 나열합니다.
  • 멤버 변수에는 주석이 없습니다.

    예 35.3. “선택 복잡성 유형의 매핑” 두 개의 요소가 있는 선택 복잡한 유형의 매핑을 표시합니다.

    예 35.3. 선택 복잡성 유형의 매핑

    @XmlType(name = "choice", propOrder = {
        "address",
        "floater"
    })
    public class Choice {
    
        protected Sequence address;
        protected Float floater;
    
        public Sequence getAddress() {
            return address;
        }
    
        public void setAddress(Sequence value) {
            this.address = value;
        }
    
        public Float getFloater() {
            return floater;
        }
    
        public void setFloater(Float value) {
            this.floater = value;
        }
    
    }
시퀀스 복잡성 유형

시퀀스 복합 유형은 sequence 요소를 사용하여 정의됩니다. 다음과 같이 주석이 추가됩니다.

  • @XmlType 주석의 propOrder 속성은 XML 스키마 정의에 표시되는 순서대로 요소의 이름을 나열합니다.
  • 각 요소는 @XmlElement 주석으로 장식됩니다.
  • @XmlElement 주석의 필수 속성이 true 로 설정됩니다.

    예 35.4. “시퀀스 Complex 유형의 매핑” 예 35.1. “XML Schema Complex Type” 에 정의된 복잡한 유형의 매핑을 보여줍니다.

    예 35.4. 시퀀스 Complex 유형의 매핑

    @XmlType(name = "sequence", propOrder = {
        "name",
        "street",
        "city",
        "state",
        "zipCode"
    })
    public class Sequence {
    
        @XmlElement(required = true)
        protected String name;
        protected short street;
        @XmlElement(required = true)
        protected String city;
        @XmlElement(required = true)
        protected String state;
        @XmlElement(required = true)
        protected String zipCode;
    
        public String getName() {
            return name;
        }
    
        public void setName(String value) {
            this.name = value;
        }
    
        public short getStreet() {
            return street;
        }
    
        public void setStreet(short value) {
            this.street = value;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String value) {
            this.city = value;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String value) {
            this.state = value;
        }
    
        public String getZipCode() {
            return zipCode;
        }
    
        public void setZipCode(String value) {
            this.zipCode = value;
        }
    }