Java XML complexType 의 확장과 제한

2023. 1. 16. 17:26Java

프로젝트 내 complex03.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- complexType 의 확장(추가)과 제한(넓->좁)(넓은의미에서->좁은의미로)
      콤플렉스 타입은 다른 콤플렉스 타입을 확장 및 제한 할 수 있다.(상속의 개념)
      extends, 재사용성 기능도 포함되어 있다.
      
      확장: base속성에 명시된 타입, 즉, 콤플렉스 타입에 속성을 추가하거나, 엘리먼트를 
      추가하는 것을 의미. 기반이 되는 콤플렉스 타입에다가 속성을 추가한다던지 
      엘리먼트를 추가
      한다던지를 의미합니다.
      제한: base속성에 명시된 타입, 즉, 콤플렉스 타입에 속성값의 범위를 제한하거나,
      엘리먼트 일부를 제거하는 것을 의미
    -->
    <xs:element name="도서리스트" type="UserBooklist"/>

    <xs:complexType name="UserBooklist">
        <!--UserBooklist가 자식을 가질수있도록 컴플렉스타입으로,그러면시퀀스필요-->
        <xs:sequence>
            <!--<xs:element name="책" maxOccurs="unbounded" type="UserBook"/>-->
            <!-- sch_complex03.xml으로 가 보면 -->
            <xs:element name="책" maxOccurs="unbounded" type="UserBook2"/>
        </xs:sequence>
    </xs:complexType>
    
    
    
    <xs:complexType name="UserBook">
        <xs:sequence>
            <xs:element name="제목" type="xs:string"/>
            <xs:element name="가격" type="xs:int"/>
            <!--add element-->
            <xs:element name="저자" type="xs:string"/>
            <xs:element name="출판사" type="xs:string"/>
        </xs:sequence>
        <!--두가지속성더넣기-->
        <xs:attribute name="id" type="xs:ID"/>
        <xs:attribute name="분류" type="xs:string"/>
    </xs:complexType>
    
    <xs:complexType name="UserBook2">
        <xs:complexContent>
            <xs:restriction base="UserBook">
                <xs:sequence>
                    <xs:element name="제목" type="xs:string"/>
                    <!--가격에 대한 엘리먼트를 범위를 축소시켜보겠다-->
                    <!--새롭게 엘리먼트만들어서봐야한다-->
                    <!-- 가격 엘리먼트에 대한 제한 -->
                    <xs:element name="가격">
                        <!-- 데이타와속성을동시에 갖는다 그래서 -->
                        <xs:simpleType>
                            <!-- simpleType에 대한 restriction을 이용해서
                            밑에는 가격에 대한 제한이 일어났다 범위가 좁아졌다 예전의 int보다 -->
                            <xs:restriction base="xs:int">
                                <xs:minInclusive value="0"/>
                                <xs:maxInclusive value="100000"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    
                    <xs:element name="저자" type="xs:string"/>
                    <xs:element name="출판사" type="xs:string"/>
                    
                </xs:sequence>
                
                <!--sequence다음에는 속성이나온다-->
                <xs:attribute name="id" type="xs:ID"/>
                <!-- 분류 제한 -->
                <xs:attribute name="분류">
                    <!--제한을할땐여러개를못넣으니simpletype으로해야한다-->
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <!-- enumeration해당열거형,열거한거 중에 암거나 선택해도 된다 -->
                            <xs:enumeration value="컴퓨터"/>
                            <xs:enumeration value="소설"/>
                            <xs:enumeration value="역사"/>
                            <!-- 분류에 대한 제약을 3가지로 제한시켜버리다 -->
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
                <!--속성에대한제한도가능-->
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <!-- 컴플렉스 타입에서 자식이 생기면 그것은 complex content가 된다 -->
    <!-- 유저북이라는놈을확장해서적용해보자 확장하기위해 컴플렉스타입을만들어야한다 -->
    <!-- 컴플렉스 컨텐트의 확장 유저북베이스타입-->
    <!-- 위두줄은 UserBook이라는 엘리먼트에다가 새롭게 엘리먼트
                        2개를 추가시켰다는 의미다 -->
    <!--여기에 속성을 추가시키겠다면은 attribute다음에추가시키면된다-->
    <!--
    <xs:complexType name="UserBook2">
        
        <xs:complexContent>
            <xs:extension base="UserBook">
                <xs:sequence>
                    <xs:element name="저자" type="xs:string"/>
                    <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>
    -->
    
    <!--디자인탭가서 schema 인스턴스 하나 만들기 스키마에 오른쪽버튼눌러
    generate sample xml files 해놓고 파일이름접두어를 sch_complex03으로했다-->
    <!--
        해당타입은 컴플렉스타입으로 서로 참조하는 형태로 됐습니다
    -->
    
    <xs:complexType name="UserPrice">
        <!--동시에 가격을 갖고 있기 때문에 심플컨텐트로 선언해줘야 해요
        데이타와 속성을 동시에 갖으면 심플컨텐트를 사용한다.-->
        <xs:simpleContent>
            <xs:extension base="xs:int"><!--int가 데이타에 해당-->
                <!-- 바로 밑줄이 속성에 해당 -->
                <xs:attribute name="단위" type="xs:string" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    
    <!-- UserPrice 확장 (complexType을 확장하겠다는 의미) 그럼
    위의 가격이라는 엘리먼트로 가서 요놈UserPrice를참조하자는거죠 -->
    
    <!--요complexType도 데이타와 속성을 같이 갖게 되는거죠-->
    <!-- UserPrice는 컴플렉스타입인데 요놈을 확장하겠다는 거죠 
    요놈을기반으로확장하겠다 새로운 속성을 추가하겠다-->
    
    <!-- 여기선 attribute를 추가해주겠다 -->
    
    <!--
    <xs:complexType name="UserPrice2">
        <xs:simpleContent>
            <xs:extension base="UserPrice">
                
                <xs:attribute name="중고" type="xs:boolean" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    -->
    <xs:complexType name="UserPrice2">
        <xs:simpleContent>
            <xs:restriction base="UserPrice">
                <!-- xs:int가나와서 요 데이타에 대한 제한이 되겠다 -->
                <xs:minInclusive value="10000"/>
                <xs:maxInclusive value="100000"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

프로젝트 내 sch_complex031.xml

<?xml version="1.0" encoding="UTF-8"?>
<도서리스트 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="file:/D:/javaddazua/test/complex03.xsd">
    <책 id="b1" 분류="소설"><!--분류="수필"오류-->
        <제목>
            삼국지
        </제목>
        <가격>10000</가격>
        <!--유저프라이스2에는 단위가없다. 유저프라이스1에 단위가 있다-->
        <!--<가격 단위="달러">10000</가격>--><!-- 여기서 속성은 단위이고, 내용이나데이타
            는 10000 이 된다.이런형태를 심플컨텐트라고 한다. 이러한엘리먼트에대해서
        확장이었고, 확장은 속성을 추가한다는정도이다. -->
        <!--
        <가격 중고="true" 단위="원">10000</가격>
        -->
        <저자>김말똥</저자>
        <출판사>강남출판사</출판사><!--이런게 컴플렉스컨텐트에 대한 확장이다 컴플렉스 컨텐트와 심플컨텐트는 서로대비된다 -->
    </책>
    <!--
    <책>
        <제목>
            Java basic
        </제목>
        <가격 중고="false" 단위="원">20000</가격>
    </책>
    -->
</도서리스트>

 

'Java' 카테고리의 다른 글

Java XML nillable  (0) 2023.01.16
Java XML global 속성 선언과 local 속성 선언  (0) 2023.01.16
Java XML simpleContent  (0) 2023.01.16
Java XML <xsd:complexType>  (0) 2023.01.16
Java XML 외부 일반 unparsed entity  (0) 2023.01.16