[웹 서비스 개발] XML Schema - (3)

김광일·2024년 10월 10일

웹 서비스 개발

목록 보기
16/45
post-thumbnail

3. 값 집합에 대한 제한

[1] enumeration 제약 조건

  • 정의: 특정 요소가 가질 수 있는 값을 고정된 집합으로 정의합니다.

1) 예시:

(1) XML
<?xml version="1.0"?>
<car>
  Golf
</car>
(2) XSD
<xs:element name="car">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

[2] <xs:whiteSpace> 공백 처리

  • 정의: XML Schema에서 문자열에 포함된 공백 문자를 어떻게 처리할지를 정의하는 요소입니다.

1) 유형:

  1. preserve (보존): 입력된 문자열의 모든 공백을 원래 모습 그대로 유지합니다.
    • 예: " Golf "" Golf "
  2. replace (대체): 모든 공백을 단일 공백으로 변환합니다.
    • 예: " Golf \n Audi "" Golf Audi "
  3. collapse (축소): 연속된 공백을 하나의 공백으로 줄이고, 문자열의 앞뒤에 있는 공백은 제거합니다.
    • 예: " Golf ""Golf"

2) 예시:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="car">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:whiteSpace value="collapse" />
        <xs:enumeration value="Audi" />
        <xs:enumeration value="Golf" />
        <xs:enumeration value="BMW" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

[3] <xs:pattern> 패턴 제약 조건

  • 정의: XML Schema에서 특정 형식의 문자열 값을 정의하는 데 사용되며, 정규 표현식을 기반으로 입력값이 특정 패턴과 일치해야 함을 명시합니다. 이를 통해 데이터의 형식 및 내용에 대한 유효성 검사를 강화할 수 있습니다.

1) 예시:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="letter">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:whiteSpace value="collapse" />
        <xs:pattern value="[a-z]+" />
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

4. Complex Type

: Complex Element(복합요소)에는 다른 요소 및 또는 속성이 포함되어 있다.

[1] 예시

1) xml

<employee>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
</employee>

2) xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">

    <xs:element name="employee">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="firstname" type="xs:string" />
                <xs:element name="lastname" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>
  • complexType (복합 타입)
    : 하나 이상의 하위 요소나 속성을 포함하는 복잡한 XML 요소를 정의하는 데 사용된다.
    • 단순히 문자열이나 숫자처럼 단일 값을 가지는 것이 아니라, 여러 개의 하위 요소나 속성을 가진 복잡한 구조를 가질 수 있다.
  • sequence (순서)
    : 하위 요소들이 반드시 지정된 순서대로 나타나야 한다는 것을 정의한다.
    • 즉, sequence로 정의된 하위 요소들은 작성된 순서에 따라 XML 문서에 나타나야 유효하게 된다.

[2] xsd에서 element과 complexType분리시키기

1) before

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

  <xs:element name="employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" type="xs:string" />
        <xs:element name="lastname" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2) after

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

  <xs:element name="employee" type="personinfo" />
  <xs:complexType name="personinfo">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="lastname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
  • element에서는 type 속성을 사용하여 complexType과 연결하고, complexType에서는 name 속성을 사용하여 복잡한 구조를 정의한다.
  • 이렇게 분리하면 재사용성과 가독성이 증가하여 코드가 더 유지보수하기 쉬워진다.

[3] 확장 (Extension)

1) 예시

(1) XML
<?xml version="1.0"?>
<employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="./EmployeeSchemaExtension.xsd">
  <firstname>John</firstname>
  <lastname>Smith</lastname>
  <address>seoul</address>
  <city>seongbook</city>
  <country>korea</country>
</employee>
  • employee: 직원 정보를 담고 있는 루트 요소이다.
  • firstname: 직원의 이름을 나타내는 요소이다
  • lastname: 직원의 성을 나타내는 요소이다.
  • address: 직원의 주소를 나타내는 요소이다.
  • city: 직원이 거주하는 도시를 나타내는 요소이다.
  • country: 직원이 거주하는 국가를 나타내는 요소이다.
(2) XSD
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="employee" type="fullpersoninfo" />

  <xs:complexType name="personinfo">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="lastname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="fullpersoninfo">
    <xs:complexContent>
      <xs:extension base="personinfo">
        <xs:sequence>
          <xs:element name="address" type="xs:string" />
          <xs:element name="city" type="xs:string" />
          <xs:element name="country" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>
  • fullpersoninfo: personinfo를 기반으로 하여 확장된 복합 데이터 유형이다. 이 타입은 직원의 전체 정보를 포함한다.
  • personinfo: 직원의 기본 정보를 포함하는 복합 데이터 유형이다. 이름과 성을 나타내는 요소로 구성되어 있다.
  • complexContent: 복합 타입의 확장이나 제한을 정의할 때 사용되는 요소로, fullpersoninfo 내에서 사용되어 personinfo를 기반으로 하는 확장 내용을 정의한다.
  • extension: 기존의 복합 타입(여기서는 personinfo)을 확장하여 추가 요소(주소, 도시, 국가)를 포함하는 데 사용된다.

[4] Complex Empty Elements

: XML 스키마에서 자식 요소가 없거나 내용이 없는 요소를 정의하는 방식. 이러한 요소는 일반적으로 속성(attribute)만을 가질 수 있다.

1) 예시

(1) XML
<?xml version="1.0"?>
<product
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="./ElementWAttributeSchema.xsd"
    prodid="1345" />
(2) XSD
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="product" type="prodtype" />
  
  <xs:complexType name="prodtype">
    <xs:attribute name="prodid" type="xs:positiveInteger" />
  </xs:complexType>
</xs:schema>

[5] Complex Types with Mixed Content

: Textelement를 함께 사용할 때, complexTypemixed 속성을 true로 설정하여 혼합된 콘텐츠를 표현할 수 있다.

1) 예시

(1) XML
<?xml version="1.0" encoding="UTF-8"?>
<letter
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="./Mixed.xsd">
    Dear Mr. <name>John Smith</name>, Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
(2) XSD
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="letter">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="orderid" type="xs:string" />
        <xs:element name="shipdate" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

0. 번외

첫 번째

: value도 있고, attribute도 있을 때

<tv frame = "color">tv1</tv>
<xs:element name="tv">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="frame" type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

두 번째

: value는 없는 empty element이지만, attribute가 있을 때

<phone company="apple" />
<xs:element name="phone">
    <xs:complexType>
        <xs:attribute name="company"
            type="xs:string" />
    </xs:complexType>
</xs:element>

세 번째

: element 안에 여러 개의 element를 가질 때

  <message>
      <sender>jerry</sender>
      <receiver>tom</receiver>
      <date>2024-02-28</date>
  </message>
<xs:element name="message">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="sender" type="xs:string" />
            <xs:element name="receiver" type="xs:string" />
            <xs:element name="date" type="xs:date" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

네 번째

: sender, receiver를 분리시켜서 재사용할 때

<xs:element name="message">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="personGroup">
                <xs:sequence>
                    <xs:element name="date" type="xs:date" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

<xs:complexType name="personGroup">
    <xs:sequence>
        <xs:element name="sender" type="xs:string" />
        <xs:element name="receiver" type="xs:string" />
    </xs:sequence>
</xs:complexType>

다섯 번째

: 네 번째 예시에서 sender, receiver에 send_time attribute가 필요할 때

<message>
    <sender send_time="2024-10-01">jerry</sender>
    <receiver send_time="2024-10-02">tom</receiver>
    <date>2024-02-28</date>
</message>

<xs:element name="message">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="personGroup">
                <xs:sequence>
                    <xs:element name="date" type="xs:date" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

<xs:complexType name="personGroup">
    <xs:sequence>
        <xs:element name="sender" type="send_time" />
        <xs:element name="receiver" type="send_time" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="send_time">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="send_time" type="xs:date" />
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
``
profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글