Java XML - xsd에서 다형성
2023. 1. 18. 12:40ㆍJava
프로젝트 내 complex04.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<!-- elementFormDefault가 unqualified 이면 사용자가 접두어를 지정한다
qaulified 이면 현재 xs 접두어를 디폴트로 쓴다. qualified 는 한정하는 것이다. xml은 database의 대안으로써의 용도로도 사용되는 프로그래밍 언어이기도 하다. -->
<!-- 콤플렉스 타입의 다형성(polymorphism)
확장과 제한. 새로컴플렉스 타입을 지정하면 되지 굳이 왜 이렇게 하는거냐하면 다형성을
쓰기 위해서이다.
동일한 종류지만 여러가지의 개별형태를 가지고 있는 것을 의미
책이라는 타입에 제목,저자,가격도 있지만 또다른 타입으로 출판사,중고품 이 있는지 없는지에
대한 타입으로 정리할 수 있겠죠. 같은 타입이지만 여러가지로 정의할 수 있다가 다형성
같은 코드를 갖다가 다시 재사용. 그마만큼 코드가 간편해 진다는 거에요
xml schema 에서는 엘레먼트에 대한 다양성과 컴플렉스에 대한 다형성도 지원한다
<B엘리먼트 type="A 콤플렉스 타입"/>
A라는 컴플렉스 타입을 기반으로 해서 A-2 A-3 A-4 같은 여러가지 형태의 타입을 가질 수가
있다는 거죠 A 콤플렉스 타입 뿐만 아니라 여러 형태의 타입을 확장하거나 제한할 수 있다.
XML 문서 작성시에 여러가지 콤플렉스 타입의문서를 명시해서 사용할 수 있다.
B엘리먼트는 XML 문서작성시 A콤플렉스 타입의 확장과 제한을 이용해서
여러종류의 타입으로 사용할 수 있는데 이러한 것을 다형성이라 한다.
-->
<!-- ROOT ELEMENT 선언 -->
<xs:element name="도서리스트" type="bookList"/>
<xs:complexType name="bookList">
<xs:sequence>
<xs:element name="책" maxOccurs="unbounded" type="userBook"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="userBook">
<xs:sequence>
<xs:element name="제목" type="xs:string"/>
<xs:element name="저자" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- 새로운 콤플렉스 타입을 선언할게요 여러개 자식엘레먼트 포함하는타입 -->
<xs:complexType name="userBook2">
<xs:complexContent>
<xs:extension base="userBook">
<xs:sequence>
<xs:element name="가격" type="xs:int"/>
<xs:element name="출판사" type="xs:string"/>
</xs:sequence>
<!-- 속성 추가 -->
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="분류" type="xs:string"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- 이번엔 제한을 하기 이전것은 확장임 -->
<xs:complexType name="userBook3">
<xs:complexContent>
<xs:restriction base="userBook2"><!-- userBook일때는 제목이랑저자만있어도 돼지만
userBook2일때는 가격 출판사를 추가해줘야 한다 -->
<!-- 순서가있기때문에 시퀀스로 출력해주셔야해요 -->
<xs:sequence>
<!-- 유저북의 기존에 있는것에 제한을 두는거니깐 기존것을 기본적으로 필요 -->
<xs:element name="제목" type="xs:string"/>
<xs:element name="저자" type="xs:string"/>
<!-- base가 유저북2로 바꼈으므로 가격출판사도 써준댜
어차피 유저북2도 유저북을 기반으로 만들어진거라서 함께 들어가게 추가한다
가격에 제한을 두고 싶다면 제한이므로 기본적으로
제한할때는 심플타입 엘리먼트 이용 -->
<!--<xs:element name="가격" type="xs:int"> restriction에서 인트타입으로 제한하므로 필요가없다 -->
<xs:element name="가격">
<xs:simpleType>
<xs:restriction base="xs:int">
<!-- facet element 이용 -->
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100000"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="출판사" type="xs:string"/>
</xs:sequence>
<!-- 그리고 어트리퓨트 부분도 포함돼야 해요 -->
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="분류">
<xs:simpleType>
<xs:restriction base="xs:string">
<!-- 열거형으로 제한을 두겠다
유저북이라는 타입이 세 종류로 유저북 유저북2와
유저북3 라는 타입으로 활용할수있도록 설정됐다.
왜이렇게 확장,제한을 두느냐 다형성원리적용하기위해서
디자인탭에서 스키마 오른쪽버튼 누르기
generate sample xml files
file name prefix에서
instance 대신 sch_complex04 이름을
줘서 인스턴스 생성 한다 -->
<xs:enumeration value="소설"/>
<xs:enumeration value="역사"/>
<xs:enumeration value="컴퓨터"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<!-- 모델 그룹과 속성 그룹
제한 시 코드의 복잡성을 줄이도록 그룹으로 사용해서 해결한다
model group
모델 그룹 : 중복되는 엘리먼트들의 선언들을 모아 하나의 그룹을 만들어서
그러한 그룹들을 사용하는 그 그룹의 이름을 참조하는 형태로 이용한다면 훨씬
간단하게 코드양을 줄일수있고 편하다는거죠 중복되는 엘리먼트 선언들을 모아 만듦
속성 그룹 : 중복된 속성들을 모아서 만든 그룹 attribute group
정의의 재사용으로 인해 스키마 문서 내용이 짧아지고 구조가 단순해 져 가독성이
좋아지고 읽기가 편해진다훨씬 더 유지보수하기 편리
모델 그룹 : 순서와 반복 횟수가 지정된 엘리먼트들의 그룹이다. 순서와 반복횟수를
엘리먼트에 지정할 수 있다. 엘리먼트에 대해서 순서를 정할 수있고 반복 횟수정할수있다.
글로벌 위치에서 선언.참조위해서는 글로벌로. 컴플렉스 타입 정의시 참조.
속성 그룹 : 속성 선언들을 모아놓은 그룹
글로벌 위치에서 정의됨.요것도 참조형식으로 타입을 참조하면 된다.
컴플렉스 타입 정의시 참조된다.
-->
프로젝트 내 sch_complex041.xml
<?xml version="1.0" encoding="UTF-8"?>
<도서리스트 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/D:/javaddazua/test2/complex04.xsd">
<책>
<제목>자바</제목>
<저자>김말똥</저자>
</책>
<!-- 같은유저북 타입이지만 여러가지 형태로 사용 할 수 있다
책의 타입을 태그안에 지정할 수 있는데 이때는 접두어 xsi가 필요하다
현재 complex04.xsd를 기반으로 하므로 접두어 xsi가 붙고 그거에 대한
타입 지정을 하자라는 거죠 같은 책이라는 엘리먼트인데 유저북2타입이 가능하다는
겁니다 id속성값도 넣어줄수있고 분류도 쓸수있습니다.
xsd 문서를 보고 참조해서 쓴다 -->
<책 id="b1" 분류="교과서" xsi:type="userBook2">
<제목>수학</제목>
<저자>홍길동</저자>
<가격>1000</가격>
<출판사>동아출판사</출판사>
</책>
<!-- 하나의 문서에서 책이라는 엘리먼트를 세가지 형태로 표현이 가능...이것이 다형성 -->
<책 id="b2" 분류="역사" xsi:type="userBook3">
<제목>조선왕조실록</제목>
<저자>홍길수</저자>
<가격>10000</가격>
<출판사>으뜸출판사</출판사>
</책>
</도서리스트>
Valitation 하면 Eclipse IDE에 Validation successful 이라고 하단에 뜬다.
'Java' 카테고리의 다른 글
Java XML - xsd import element (0) | 2023.01.18 |
---|---|
Java XML - xsd include element (0) | 2023.01.18 |
Java XML - xsd targetNamespace (0) | 2023.01.18 |
Java XML - xsd attributeFormDefault (0) | 2023.01.18 |
Java XML - xsd에서 notation element (0) | 2023.01.18 |