본문 바로가기
XML

XML XSD complex type

by FraisGout 2020. 7. 3.

복합 타입(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>

 

XSD 지시자(indicator)

XSD 지시자를 사용하면 XML 문서에서 요소들이 구성되는 방식을 설정할 수 있습니다.

 

XSD에서 사용할 수 있는 지시자는 다음과 같습니다.

 

 

 

1. 순서 지시자 : sequence, all, choice

 

2. 출현 빈도 지시자 : maxOccurs, minOccurs

 

3. 그룹 지시자 : group, attributeGroup

 

순서 지시자

순서 지시자는 요소들이 나타나는 순서를 정의할 때 사용합니다.

 

XSD에서 사용할 수 있는 순서 지시자는 다음과 같습니다.

 

 

 

1. sequence

 

2. all

 

3. choice

 

sequence 지시자

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

 

 

 

다음 XSD 예제의 <physical>요소는 자식 요소를 <height>요소와 <waist>요소 순으로 가져야만 합니다.

 

xsd01.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<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>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd01.xsd에 적합한 XML 문서입니다.

 

xsd01_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<height>180</height>

 

<waist>72</waist>

 

</physical>

 

 

다음 예제는 위에서 작성한 xsd01.xsd에 적합하지 않은 XML 문서입니다.

 

xsd01_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<height>180</height>

 

<footsize>275</footsize>

 

</physical>

 

위 예제의 결과 화면을 살펴보면 다음과 같은 메시지를 확인할 수 있습니다.

 

결과 화면

'footsize' 요소로 시작하는 부적합한 콘텐츠가 발견되었습니다. '{waist}' 중 하나가 필요합니다.

 

 

 

, xsd01.xsd에서 정의한 대로 두 번째 자식 요소로 <waist>요소를 가지지 않고, 대신 <footsize>요소를 가지므로 부적합합니다.

 

all 지시자

all 지시자는 자식 요소가 어떤 순서로 나오든지 단 한 번씩만 나올 수 있다는 것을 명시합니다.

 

따라서 all 지시자를 사용할 때는 출현 빈도 지시자인 minOccurs 지시자는 0 또는 1, maxOccurs 지시자는 1로만 명시할 수 있습니다.

 

 

 

다음 XSD 예제의 <physical>요소는 <height>요소와 <waist>요소를 순서에 상관없이 하나씩만 자식 요소로 가질 수 있습니다.

 

xsd02.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<xs:element name="physical">

 

<xs:complexType>

 

<xs:all>

 

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

 

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

 

</xs:all>

 

</xs:complexType>

 

</xs:element>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd02.xsd에 적합한 XML 문서입니다.

 

xsd02_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<waist>72</waist>

 

<height>180</height>

 

</physical>

 

위의 예제처럼 all 지시자는 명시된 자식 요소가 등장하는 순서에 상관없이 단 한 번씩만 가질 수 있습니다.

 

 

 

다음 예제는 위에서 작성한 xsd02.xsd에 적합하지 않은 XML 문서입니다.

 

xsd02_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<height>180</height>

 

<height>185</height>

 

</physical>

 

위의 예제는 xsd02.xsd에서 정의한 대로 자식 요소로 <height>요소와 <waist>요소를 하나씩 가지지 않고, <height>요소만을 두 번 가지므로 부적합합니다.

 

choice 지시자

choice 지시자는 복합 타입 요소가 포함할 수 있는 자식 요소의 선택 집합을 명시합니다.

 

복합 타입 요소는 이렇게 선언된 선택 집합 내에서 단 하나의 자식 요소만을 가질 수 있습니다.

 

, 선택 집합은 다른 선택 집합이나 다른 시퀀스 안에 포함될 수 있습니다.

 

 

 

다음 예제의 <physical>요소는 <height>요소와 <waist>요소 둘 중 하나만을 자식 요소로 가질 수 있습니다.

 

xsd03.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<xs:element name="physical">

 

<xs:complexType>

 

<xs:choice>

 

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

 

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

 

</xs:choice>

 

</xs:complexType>

 

</xs:element>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd03.xsd에 적합한 XML 문서입니다.

 

xsd03_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<height>180</height>

 

</physical>

 

위의 예제처럼 choice 지시자는 명시된 자식 요소 중에서 단 하나만을 자식 요소로 가져야 합니다.

 

 

 

다음 예제는 위에서 작성한 xsd03.xsd에 적합하지 않은 XML 문서입니다.

 

xsd03_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<physical>

 

<height>180</height>

 

<waist>72</waist>

 

</physical>

 

위의 예제는 xsd03.xsd에서 정의한 대로 자식 요소로 <height>요소와 <waist>요소 중 단 하나만을 가지지 않고, <height>요소와 <waist>요소를 모두 가지므로 부적합합니다.

 

출현 빈도 지시자

출현 빈도 지시자는 해당 요소를 자식 요소로 얼마나 가질 수 있는지를 정의할 때 사용합니다.

 

모든 순서 지시자나 그룹 지시자에서 출현 빈도 지시자의 기본값은 모두 1입니다.

 

 

 

1. maxOccurs

 

2. minOccurs

 

maxOccurs 지시자

maxOccurs 지시자는 해당 요소를 자식 요소로 가질 수 있는 최댓값을 명시합니다.

 

 

 

다음 예제의 <customer>요소는 자식 요소로 <phoneNumber>요소를 최소 1개에서 최대 2개까지 가질 수 있습니다.

 

xsd04.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<xs:element name="customer">

 

<xs:complexType>

 

<xs:sequence>

 

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

 

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

 

<xs:element name="phoneNumber" type="xs:integer" maxOccurs="2"/>

 

</xs:sequence>

 

</xs:complexType>

 

</xs:element>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd04.xsd에 적합한 XML 문서입니다.

 

xsd04_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

<phoneNumber>0212345678</phoneNumber>

 

<phoneNumber>01023456789</phoneNumber>

 

</customer>

 

다음 예제는 위에서 작성한 xsd04.xsd에 적합하지 않은 XML 문서입니다.

 

xsd04_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

<phoneNumber>0212345678</phoneNumber>

 

<phoneNumber>03123456789</phoneNumber>

 

<phoneNumber>01023456789</phoneNumber>

 

</customer>

 

위의 예제는 xsd04.xsd에서 정의한 대로 자식 요소로 <phoneNumber>요소를 최대 2개까지만 가질 수 있는데, 3개를 가지므로 부적합합니다.

 

minOccurs 지시자

minOccurs 지시자는 해당 요소를 자식 요소로 가질 수 있는 최솟값을 명시합니다.

 

 

 

다음 예제의 <customer>요소는 자식 요소로 <phoneNumber>요소를 최소 2개부터 최대 3개까지 가질 수 있습니다.

 

xsd05.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<xs:element name="customer">

 

<xs:complexType>

 

<xs:sequence>

 

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

 

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

 

<xs:element name="phoneNumber" type="xs:integer" minOccurs="2" maxOccurs="3"/>

 

</xs:sequence>

 

</xs:complexType>

 

</xs:element>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd05.xsd에 적합한 XML 문서입니다.

 

xsd05_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

<phoneNumber>0212345678</phoneNumber>

 

<phoneNumber>01023456789</phoneNumber>

 

</customer>

 

다음 예제는 위에서 작성한 xsd05.xsd에 적합하지 않은 XML 문서입니다.

 

xsd05_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

<phoneNumber>0212345678</phoneNumber>

 

</customer>

 

위의 예제는 xsd05.xsd에서 정의한 대로 자식 요소로 <phoneNumber>요소를 최소 2개 이상 가져야 하는데, 1개만 가지므로 부적합합니다.

 

출현 빈도 제한 해제

출현 빈도 지시자인 maxOccurs 지시자와 minOccurs 지시자의 기본값은 1입니다.

 

, 출현 빈도 지시자를 따로 명시하지 않고 생략하면, 해당 요소를 반드시 1번만 가져야 합니다.

 

이때 해당 요소를 자식 요소로 가질 수 있는 횟수에 제한을 두고 싶지 않으면, 출현 빈도 지시자의 값을 unbounded로 설정하면 됩니다.

 

 

 

다음 예제의 <customer>요소는 자식 요소로 <phoneNumber>요소를 최소 1개에서 최대 몇 개까지고 가질 수 있습니다.

 

xsd06.xsd

<?xml version="1.0" encoding="UTF-8"?>

 

 

 

 

 

<xs:element name="customer">

 

<xs:complexType>

 

<xs:sequence>

 

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

 

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

 

<xs:element name="phoneNumber" type="xs:integer" maxOccurs="unbounded"/>

 

</xs:sequence>

 

</xs:complexType>

 

</xs:element>

 

 

 

</xs:schema>

 

 

 

다음 예제는 위에서 작성한 xsd06.xsd에 적합한 XML 문서입니다.

 

xsd06_good.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

<phoneNumber>0212345678</phoneNumber>

 

<phoneNumber>03123456789</phoneNumber>

 

<phoneNumber>01023456789</phoneNumber>

 

</customer>

 

다음 예제는 위에서 작성한 xsd06.xsd에 적합하지 않은 XML 문서입니다.

 

xsd06_bad.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<customer>

 

<name>홍길동</name>

 

<age>15</age>

 

</customer>

 

위의 예제는 xsd06.xsd에서 정의한 대로 자식 요소로 <phoneNumber>요소를 최소 1개부터 몇 개까지고 가질 수 있지만, 1개도 가지지 않으므로 부적합합니다.

 

그룹 지시자

그룹 지시자는 요소들 간의 연관성을 명시할 때 사용합니다.

 

 

 

1. group

 

2. attributeGroup

 

group 지시자

group 지시자는 연관된 요소들을 하나의 그룹으로 묶어줍니다.

 

 

 

순서 지시자(sequence, all, choice)는 반드시 group 지시자 내부에 명시되어야 합니다.

 

이렇게 정의된 그룹은 ref 속성에 해당 그룹의 name 속성값을 사용하면 참조할 수 있습니다.

 

 

 

다음 예제는 bodyInfo라는 그룹을 선언한 후, <physical>요소를 선언할 때 해당 그룹을 참조하는 예제입니다.

 

XSD 예제

<xs:group name="bodyInfo">

 

<xs:sequence>

 

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

 

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

 

</xs:sequence>

 

</xs:group>

 

 

 

<xs:element name="physical">

 

<xs:complexType>

 

<xs:sequence>

 

<xs:group ref="bodyInfo"/>

 

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

 

</xs:sequence>

 

</xs:complexType>

 

</xs:element>

 

attributeGroup 지시자

attributeGroup 지시자는 연관된 속성들을 하나의 속성 그룹으로 묶어줍니다.

 

이렇게 정의된 속성 그룹은 ref 속성에 해당 그룹의 name 속성값을 사용하면 참조할 수 있습니다.

 

 

 

다음 예제는 personInfo라는 속성 그룹을 선언한 후, <person>요소를 선언할 때 해당 속성 그룹을 참조하는 예제입니다.

 

XSD 예제

<xs:attributeGroup name="personInfo">

 

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

 

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

 

</xs:attributeGroup>

 

 

 

<xs:element name="person">

 

<xs:complexType>

 

<xs:attributeGroup ref="personInfo"/>

 

</xs:complexType>

 

</xs:element>

'XML' 카테고리의 다른 글

XML XSD simple type  (0) 2020.07.03
XML XSD  (0) 2020.07.03
XML DTD  (0) 2020.07.03
XML XPath  (0) 2020.07.03
XML DOM  (0) 2020.07.03

댓글