..

Search

38) 복합 타입 요소

복합 타입 요소


복합 타입(complex type) 요소

복합 타입(complex type) 요소란 자식 요소나 속성을 포함하는 요소를 의미합니다.

XSD에서 복합 타입 요소는 다음과 같이 구분할 수 있습니다.

 

1. 빈 요소

2. 자식 요소만을 포함하는 요소

3. 텍스트만을 포함하는 요소

4. 자식 요소와 텍스트를 모두 포함하는 요소

 

위에서 언급한 모든 복합 타입 요소는 속성을 포함할 수 있습니다.


빈 요소의 선언

XSD에서 빈 요소(empty element)란 자식 요소는 가지지 않고, 오직 속성만을 가지는 요소를 의미합니다.

빈 요소는 복합 타입 요소이므로, 반드시 하나 이상의 속성을 가지고 있어야 합니다.

 

XML 예제

<red redValue="139" />

 

위의 XML 예제는 XSD에서 아래처럼 선언됩니다.

XSD 예제

<xs:element name="red">

    <xs:complexType>

        <xs:complexContent>

            <xs:restriction base="xs:integer">

                <xs:attribute name="redValue" type="xs:positiveInteger"/>

            </xs:restriction>

        </xs:complexContent>

    </xs:complexType>

</xs:element>

 

하지만 보통은 <xs:complexContent>요소와 <xs:restriction>요소를 생략하고 다음과 같이 정의합니다.

XSD 예제

<xs:element name="red">

    <xs:complexType>

        <xs:attribute name="redValue" type="xs:positiveInteger"/>

    </xs:complexType>

</xs:element>

 

XSD에서 속성(attribute)은 자식 요소나 또 다른 속성을 포함할 수 없으므로, 언제나 단순 타입(simple type)입니다.

자식 요소만을 포함하는 요소

XSD에서 가장 일반적으로 정의되는 요소 중의 하나가 바로 자식 요소만을 포함하는 요소입니다.

XML 예제

<physical>

    <height>180</height>

    <waist>32</waist>

</physical>

 

위의 XML 예제는 XSD에서 아래처럼 선언됩니다.

XSD 예제

<xs:element name="physical">

    <xs:complexType>

        <xs:sequence>

            <xs:element name="height" type="xs:integer"/>

            <xs:element name="waist" type="xs:integer"/>

        </xs:sequence>

    </xs:complexType>

</xs:element>

 

위의 예제에서 sequence 지시자는 body 타입의 요소는 <height>요소와 <waist>요소 순으로 자식 요소를 가져야 합니다.

 

sequence 지시자는 자식 요소가 명시된 순서대로만 나타날 수 있다는 것을 명시하는 지시자입니다.

텍스트만을 포함하는 요소

XSD에서 텍스트만을 포함하는 요소는 <simpleContent>요소를 사용하여 선언합니다.

 

이때 <simpleContent>요소 안에는 <extension>요소나 <restriction>요소 중 하나가 반드시 선언되어야 합니다.

그래야만 <simpleContent>요소를 사용하여 기초가 되는 단순 타입 요소를 확장하거나 제한할 수 있기 때문입니다.

XML 예제

<currency country="kor">10000</currency>

 

위의 XML 예제는 XSD에서 아래처럼 선언됩니다.

XSD 예제

<xs:element name="currency">

    <xs:complexType>

        <xs:simpleContent>

            <xs:extension base="xs:integer">

                <xs:attribute name="country" type="xs:string" />

            </xs:extension>

        </xs:simpleContent>

    </xs:complexType>

</xs:element>


자식 요소와 텍스트를 모두 포함하는 요소

XSD에서는 자식 요소, 속성 그리고 텍스트까지 모두 포함한 복합 타입 요소를 선언할 수 있습니다.

XML 예제

<student>

    학생의 이름은 <name>홍길동</name>이고,

    성별은 <gender>남자</gender>이며,

    나이는 <age>15</age>살 입니다.

</student>

 

위의 XML 예제는 XSD에서 아래처럼 선언됩니다.

XSD 예제

<xs:element name="student">

    <xs:complexType mixed="true">

        <xs:sequence>

            <xs:element name="name" type="xs:string"/>

            <xs:element name="gender" type="xs:string"/>

            <xs:element name="age" type="xs:positiveInteger"/>

        </xs:sequence>

    </xs:complexType>

</xs:element>

 

위의 XML 예제에서 자식 요소들 사이에 나타나는 텍스트를 표현하기 위해서는 반드시 XSD에서 mixed 속성값을 true로 설정해야 합니다.

임의의 요소 및 속성 사용

<any>요소는 해당 XSD 파일에서 선언되지 않은 요소를 사용하여 XML 문서를 확장할 수 있게 해줍니다.

또한, <anyAttriute>요소는 해당 XSD 파일에서 선언되지 않은 속성을 사용하여 XML 문서를 확장할 수 있도록 도와줍니다.

 

이러한 <any>요소와 <anyAttribute>요소는 XML 문서의 확장성을 더욱 좋게 만들어 줍니다.

 

다음 예제에서 student.xsd를 만족하는 student 요소는 세 번째 요소로 어떤 요소가 나와도 되며, 또한 세 번째 요소가 나오지 않아도 됩니다.

student.xsd

<xs:element name="student">

    <xs:complexType>

        <xs:sequence>

            <xs:element name="name" type="xs:string"/>

            <xs:element name="gender" type="xs:string"/>

            <xs:any minOccurs="0"/>

        </xs:sequence>

    </xs:complexType>

</xs:element>

 

address.xsd

<xs:element name="address">

    <xs:complexType>

        <xs:sequence>

            <xs:element name="zipcode" type="xs:integer"/>

            <xs:element name="si" type="xs:string"/>

            <xs:element name="gu" type="xs:string"/>

            <xs:element name="street" type="xs:string"/>

        </xs:sequence>

    </xs:complexType>

</xs:element>

 

다음 XML 예제들은 모두 위에서 살펴본 student.xsd를 만족하는 XML 예제입니다.

student01.xml

<student>

    <name>길동</name>

    <gender>남자</gender>

</student>

 

student02.xml

<student>

    <name>길동</name>

    <gender>남자</gender>

    <address>

        <zipcode>12345</zipcode>

        <si>서울시</si>

        <gu>강남구</gu>

        <street>테헤란로</street>

    </address>

</student>


연습문제