요점 및 보강 자료 1. 스키마란 - XML 문서의 구조와 엘리먼트, 속성들의 관계를 정의하여 다양한 자료형을 사용할 수 있도록 정의된 문서 구조
2. 스키마 구조의 장점 - xml 문법을 따른다.
- 풍부한 데이터형을 제공한다.
- 데이터의 제약 조건을 세밀하게 정의한다.
3. DTD 구조와 스키마 구조의 간단한 차이점 DTD | 스키마 | XML 1.0에서 제정 | XML 2.0에서 제정 | 익스플로러 4.0부터 도입 | 익스플로러 5.0부터 도입 | 확장자 DTD | 확장자 XSD | 데이터타입을 지원하는 기능이 부족 | 풍부한 데이터 타입을 지원 | 엘리먼트, 속성 등의 지원 기능이 미흡 | 엘리먼트, 속성 등의 지원 기능이 가능 | 데이터의 정렬이 어려움 | 데이터의 정렬이 가능 |
4. XSD 문서의 기본 형식 5. 이름 공간(namespace) 6. XSD와 XML 문서 연결하기 7. 엘리먼트 정의 - <complexType> 태그
- 하위 엘리먼트를 포함하거나 속성이 있는 엘리먼트를 선언 (복잡한 구조)
- <simpleType>태그
- 속성이나 하위 엘리먼트를 포함하지 않는 엘리먼트 (간단한 구조)
- <sequence> 태그
<도서목록> <도서> <분류>컴퓨터</분류> <제목>XML</제목> <출판사>정보</출판사> <저자>박준서, 최배근</저자> </도서> </도서목록> | <?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE 도서목록[ <!ELEMENT 도서목록 (도서) > <!ELEMENT 도서 (분류,제목,출판사,저자) > <!ELEMENT 분류 (#PCDATA) > <!ELEMENT 제목 (#PCDATA) > <!ELEMENT 출판사 (#PCDATA) <!ELEMENT 저자 (#PCDATA) > ]> |
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록04.xsd"> <도서> <분류>컴퓨터</분류> <제목>XML</제목> <출판사>정보</출판사> <저자>박준서, 최배근</저자> </도서> </도서목록> |
<?xml version="1.0" encoding="EUC-KR"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="도서목록"> <xsd:complexType> ☞ 도서목록 엘리먼트는 하위 엘리먼트를 포함 <xsd:sequence> ☞ 자식 엘리먼트들이 정의한 순서대로 반드시 정의 도서엘리먼트와 하위 엘리먼트는 생략 불가능 <xsd:element name="도서"> <xsd:complexType> <xsd:sequence> <xsd:element name="분류" type="xsd:string" /> <xsd:element name="제목" type="xsd:string" /> <xsd:element name="출판사" type="xsd:string" /> <xsd:element name="저자" type="xsd:string" /> ☞ 분류,제목,출판사,저자태그는 문자형 생략 불가능
</xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> |
<?xml version="1.0" encoding="euc-kr" ?> <members> <member> <name>홍길동</name> <phone_no>031-111-2323</phone_no> </member> <member> <name>김유신</name> <phone_no>02-111-1234</phone_no> </member> </members> |
<?xml version="1.0" encoding="euc-kr" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="members"> <xsd:complexType> <xsd:sequence> <xsd:element name="member" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phone_no" type="xsd:string" minOccurs="1" maxOccurs="2"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> |
<?xml version="1.0" encoding="euc-kr" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 루트요소 선언 --> <xsd:element name="members"> <xsd:complexType> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="1" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- memberType 선언 --> <xsd:complexType name="memberType"> <xsd:sequence> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phone_no" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> |
- <minOccurs> 태그
- 엘리먼트의 최소 반복 횟수를 정의
- 생략시 기본값 = 1
- 0으로 정의시 : 엘리먼트는 생략
- 1로 정의시 : 반드시 엘리먼트 1번 정의
- <maxOccurs> 태그
- 엘리먼트의 최대 반복 횟수를 정의
- 생략시 기본값 = 1
- 1로 정의시 : 무조건 한번만 정의
- unbound로 정의시 반복 횟수에 제한 받지 않고 사용
- 도서목록14.xml
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록13.xsd"> <도서> <분류>컴퓨터</분류> <제목>XML</제목> <출판사>정보</출판사> <저자>박준서</저자> <저자>최배근</저자> </도서> <도서> <분류>컴퓨터</분류> <저자>박준서</저자> </도서> </도서목록> |
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" minOccurs="1" maxOccurs="unbounded"> <complexType> <sequence> <element name="분류" type="string" minOccurs="1" maxOccurs="1" /> <element name="제목" type="string" minOccurs="0" maxOccurs="1" /> ☞ 제목 엘리먼트를 정의하지 않거나 한번 정의 (?) <element name="출판사" type="string" minOccurs="0" maxOccurs="unbounded" /> ☞ 출판사 엘리먼트를 정의하지 않거나 여러번 정의 (*) <element name="저자" type="string" minOccurs="1" maxOccurs="2" /> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> |
- <choice> 태그
- dtd에서의 |기호와 같은 역할
- 여러 가지 엘리먼트 중에서 한 개만을 정의
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE 도서목록[ ]> |
- 도서목록10.xml
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록09.xsd"> <도서> <제목>XML</제목> </도서> </도서목록> |
- 도서목록09.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서"> <complexType> <choice> ☞ 분류,제목,출판사,저자 엘리먼트 중에서 한 개를 선택해서 정의
<element name="분류" type="string" /> <element name="제목" type="string" /> <element name="출판사" type="string" /> <element name="저자" type="string" /> </choice> </complexType> </element> </sequence> </complexType> </element> </schema> |
- member2.xml : <member>의 자식 요소로 <name>과 <phone_no> 두 개의 요소를 가지거나
<lname>, <fname>, <phone_no> 세 개의 요소를 가질 수 있는 예 <?xml version="1.0" encoding="EUC-KR"?> <members> <member> <name>홍길동</name> <phone_no>031-111-2323</phone_no> </member> <member> <lname>김</lname> <fname>유신</fname> <phone_no>031-111-2323</phone_no> </member> </members> |
- member2.xsd
<?xml version="1.0" encoding="euc-kr" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 루트요소 선언 --> <xsd:element name="members"> <xsd:complexType> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="1" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- memberType 선언 --> <xsd:complexType name="memberType"> <xsd:choice> <xsd:sequence> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phone_no" type="xsd:string" /> </xsd:sequence> <xsd:sequence> <xsd:element name="lname" type="xsd:string" /> <xsd:element name="fname" type="xsd:string" /> <xsd:element name="phone_no" type="xsd:string" /> </xsd:sequence> </xsd:choice> </xsd:complexType> </xsd:schema> |
- <all> 태그
- 엘리먼트의 순서를 생각하지 않을 때 사용
- all 태그를 사용할 경우 복잡성을 줄이기 위한 제약사항
- 내부의 요소들은 반복이 1회까지로 제한
- choice 태그 안에서 사용할 수 없는 등 다른 복합자와 함께 사용될 때 제약이 존재
- 도서목록12.xml
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록11.xsd"> <도서> <제목>XML</제목> <분류>컴퓨터</분류> <저자>박준서</저자> <출판사>정보</출판사> </도서> </도서목록> |
- 도서목록11.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서"> <complexType> <all> ☞ 분류,제목,출판사,저자 엘리먼트는 순서를 생각하지 않는다.
<element name="분류" type="string" /> <element name="제목" type="string" /> <element name="출판사" type="string" /> <element name="저자" type="string" /> </all> </complexType> </element> </sequence> </complexType> </element> </schema> |
<?xml version="1.0" encoding="EUC-KR"?> <members> <member> <name>홍길동</name> <phone_no>031-111-2323</phone_no> </member> </members> |
- member2-1.xsd
<?xml version="1.0" encoding="euc-kr" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 루트요소 선언 --> <xsd:element name="members"> <xsd:complexType> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="1" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- memberType 선언 --> <xsd:complexType name="memberType"> <xsd:all> <xsd:element name="name" type="xsd:string" /> <xsd:element name="phone_no" type="xsd:string" /> </xsd:all> </xsd:complexType> </xsd:schema> |
- <default> 태그
- 엘리먼트의 값이 정의되지 않으면 default로 정의된 값을 할당
- <fixed> 태그
- 엘리먼트에 정의되는 값이 생략 또는
- fixed로 정의된 값이 엘리먼트의 값으로 정의
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록15.xsd"> <도서> <분류></분류> <제목>XML</제목> </도서> </도서목록> |
- 도서목록15.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" minOccurs="1" maxOccurs="unbounded"> <complexType> <sequence> <element name="분류" type="string" default="컴퓨터" /> <element name="제목" type="string" fixed="XML" /> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> |
- <group> 태그
- 엘리먼트의 반복을 쉽게 정의
- 반복되는 엘리먼트의 그룹을 <group>태그로 묶은 후 XSD에서 필요할 때 가져와서 사용
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록17.xsd"> <도서> <분류>컴퓨터</분류> <제목>XML</제목> <출판사>정보</출판사> <저자>박준서</저자> </도서> </도서목록> |
- 도서목록17.xsd
<?xml version="1.0" encoding="EUC-KR" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:group name="myItem"> <xsd:sequence> <xsd:element name="분류" type="xsd:string" /> <xsd:element name="제목" type="xsd:string" /> <xsd:element name="출판사" type="xsd:string" /> <xsd:element name="저자" type="xsd:string" /> </xsd:sequence> </xsd:group>
<xsd:element name="도서목록"> <xsd:complexType> <xsd:sequence> <xsd:element name="도서"> <xsd:complexType> <xsd:sequence> <xsd:group ref="myItem" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>
</xsd:schema> |
8. 어트리뷰트 정의 - <simpleType>태그
- <enumeration>태그
- 여러 개의 정의된 값 중에서 하나의 속성만을 선택
- <length>태그
- <minLength>태그
- 어트리뷰트 데이터에 있는 문자의 최소 개수를 정의
- <maxLength>태그
- 어트리뷰터 데이터에 있는 문자의 최대 개수를 정의
- <minInclusive>태그
- <maxInclusive>태그
분류 속성은 "컴퓨터","소설","만화"라는 값중에 하나의 값만 가짐 <?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록27.xsd"> <도서 분류="컴퓨터" 제목="XML" /> <도서 분류="소설" 제목="비와그리움" /> </도서목록> |
- 도서목록27.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" maxOccurs="unbounded"> <complexType> <attribute name="분류"> <simpleType> <restriction base="string"> <enumeration value="컴퓨터" /> <enumeration value="소설" /> <enumeration value="만화" /> </restriction> </simpleType> </attribute> <attribute name="제목" type="string" /> </complexType> </element> </sequence> </complexType> </element> </schema> |
분류 속성 값의 길이는 3개, 제목 속성 값의 길이는 최소 1개 최대 6개이다. <?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록29.xsd"> <도서 분류="컴퓨터" 제목="XML" /> <도서 분류="소설1" 제목="비와그리움" /> </도서목록> |
- 도서목록29.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" maxOccurs="unbounded"> <complexType> <attribute name="분류"> <simpleType> <restriction base="string"> <length value="3" /> </restriction> </simpleType> </attribute> <attribute name="제목"> <simpleType> <restriction base="string"> <minLength value="1" /> <maxLength value="6" /> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> </element> </schema> |
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록31.xsd"> <도서 수량="10" /> </도서목록> |
- 도서목록31.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" maxOccurs="unbounded"> <complexType> <attribute name="수량"> <simpleType> <restriction base="integer"> <minInclusive value="0" /> <maxInclusive value="10" /> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> </element> </schema> |
- 도서목록34.xml : 도서의 자식태그인 분류 태그는 컴퓨터, 소설, 만화라는 값중에 하나의 값만 가진다.
<?xml version="1.0" encoding="EUC-KR"?> <도서목록 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="도서목록33.xsd"> <도서> <분류>컴퓨터</분류> </도서> <도서> <분류>소설</분류> </도서> </도서목록> |
- 도서목록33.xsd
<?xml version="1.0" encoding="EUC-KR"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="도서목록"> <complexType> <sequence> <element name="도서" maxOccurs="unbounded"> <complexType> <sequence> <element name="분류"> <simpleType> <restriction base="string"> <enumeration value="컴퓨터" /> <enumeration value="소설" /> <enumeration value="만화" /> </restriction> </simpleType> </element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> |
|