Mark Up/XML XSD 복합 타입
  • 728x90
    반응형

    XSD 복합 타입




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


    Tip : 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>요소 순으로 자식 요소를 가져야 한다.


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


    Tip : 위의 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:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">


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


    </schema>


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


    xsd01_good.xml

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

    <physical>

    <height>180</height>

    <waist>72</waist>

    </physical>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd01_good.xml""../tcpsk/examples/media/xsd01.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


    xsd01_bad.xml

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

    <physical>

    <height>180</height>

    <footsize>275</footsize>

    </physical>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd01_bad.xml""../tcpsk/examples/media/xsd01.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


    결과 화면

    '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:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd02_good.xml""../tcpsk/examples/media/xsd02.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


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


    xsd02_bad.xml

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

    <physical>

        <height>180</height>

        <height>185</height>

    </physical>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd02_bad.xml""../tcpsk/examples/media/xsd02.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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



    choice 지시자



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

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

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


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


    xsd03

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

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd03_good.xml""../tcpsk/examples/media/xsd03.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


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


    xsd03_bad.xml

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

    <physical>

        <height>180</height>

        <waist>72</waist>

    </physical>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd03_bad.xml""../tcpsk/examples/media/xsd03.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


    위의 예제는 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:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     

    <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 문서이다.


    문법

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

    <customer>

        <name>홍길동</name>

        <age>15</age>

        <phoneNumber>0212345678</phoneNumber>

        <phoneNumber>01023456789</phoneNumber>

    </customer>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd04_good.xml""../tcpsk/examples/media/xsd04.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


    다음 예제는 위에서 작성한 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>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd04_bad.xml""../tcpsk/examples/media/xsd04.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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



    minOccurs 지시자



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


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


    xsd05.xsd

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

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd05_good.xml""../tcpsk/examples/media/xsd05.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


    xsd05_bad.xml

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

    <customer>

        <name>홍길동</name>

        <age>15</age>

        <phoneNumber>0212345678</phoneNumber>

    </customer>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd05_bad.xml""../tcpsk/examples/media/xsd05.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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



    출현 빈도 제한 해제



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

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

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


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


    xsd06.xsd

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

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

     

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd06_good.xml""../tcpsk/examples/media/xsd06.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


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


    xsd06_bad.xml

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

    <customer>

        <name>홍길동</name>

        <age>15</age>

    </customer>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.io.File;
    import java.io.IOException;
    import javax.xml.XMLConstants;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Schema;
    import org.xml.sax.SAXException;
     
    public class prog {
     
        public static void main(String[] args) {
            String valid = "적합한";
            try { 
                // XML 파일과 XSD 파일을 인수로 전달받아 해당 XML 파일이 XSD 스키마에 대하여 적합한지를 검사함.
                validate("../tcpsk/examples/media/xsd06_bad.xml""../tcpsk/examples/media/xsd06.xsd"); 
            } catch (IOException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            } catch (SAXException e) {
                valid = "적합하지 않은";
                System.out.println(e.getMessage());
            }
            System.out.println("이 문서는 전달받은 XSD 스키마에 " + valid + " XML 문서입니다.");
        }
     
        public static void validate(String xmlFile, String xsdFile) throws SAXException, IOException {
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(new File(xsdFile));    // XSD 스키마 생성함.
            StreamSource stream = new StreamSource(new File(xmlFile));    // XML 파일을 스트림으로 생성함.
     
            (schema.newValidator()).validate(stream);    // 생성된 스트림을 XSD 스키마로 검사함.
        }
    }
    cs


    위의 예제는 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 속성값을 사용하면 참조할 수 있다.


    다음 예제는 personIngo 라는 속성 그룹을 선언한 후, <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>





    728x90
    반응형

    'Mark Up > XML' 카테고리의 다른 글

    XSD 단순 타입  (0) 2018.11.12
    XML/XSD  (0) 2018.11.12
    XML/DTD  (0) 2018.11.09
    XML/XPath  (0) 2018.11.09
    XML 노드  (0) 2018.11.05
상단으로