복합 타입 요소
복합 타입(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에서 가장 일반적으로 정의되는 요소 중의 하나가 바로 자식 요소만을 포함하는 요소입니다.
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>요소 순으로 자식 요소를 가져야 합니다.
텍스트만을 포함하는 요소
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>
임의의 요소 및 속성 사용
<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>