최신 웹 개발 튜토리얼
 

XSD 예


이 장에서는 XML 스키마를 작성하는 방법을 보여줍니다. 또한 스키마가 다른 방법으로 기록 될 수 있다는 것을 배우게됩니다.


XML 문서

의 호출이 XML 문서를 살펴 보자 "shiporder.xml" :

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

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

XML 문서는 상기 루트 요소로 구성 "shiporder" 라는 필수 속성 포함 "orderid" . "shiporder" : 요소는 세 가지 하위 요소 포함 "orderperson" , "shipto""item" . "item" 요소는 두 번 표시, 그리고 그것은 포함 "title" , 선택 "note" 소자, "quantity""price" 요소를.

라인은 위 : XMLNS : XSI = "http://www.w3.org/2001/XMLSchema-instance는"이 문서가 스키마에 대해 유효성을 검사해야하는 XML 파서를 알려줍니다. 선 : XSI는 : 스키마 상주 WHERE의 noNamespaceSchemaLocation는 = "shiporder.xsd은"지정 (here it is in the same folder as "shiporder.xml") .


XML 스키마 만들기

이제 우리는 위의 XML 문서에 대한 스키마를 만들려고합니다.

우리는 우리가 전화하는 새로운 파일을 열어 시작 "shiporder.xsd" . 스키마를 만들려면 우리는 단순히 XML 문서의 구조를 따라 우리가 그것을 찾아 각 요소를 정의 할 수 있습니다. 스키마를 정의 스키마 요소 : 우리는 XS 다음 표준 XML 선언으로 시작됩니다 :

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

우리가 사용하는 표준 스페이스 상기 스키마 (xs) 이 네임 스페이스와 연관된 상기 URI http://www.w3.org/2001/XMLSchema의 기준치를 가지고 스키마 언어 정의된다.

다음으로, 우리는 정의해야 "shiporder" 요소를. 이 요소는 속성을 가지고 있으며 따라서 우리는 복합 유형으로 고려, 다른 요소가 포함되어 있습니다. 의 자식 요소 "shiporder" 하위 요소의 정렬 순서를 정의 시퀀스 요소 : 요소는 XS로 둘러싸여 있습니다 :

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

그 다음 우리는 정의해야 "orderperson" (그것이 어떤 속성이나 다른 요소가 포함되어 있지 않기 때문에) 간단한 형식으로 요소를. 유형 (xs:string) 미리 정의 된 스키마 데이터 유형을 나타내는 XML 스키마와 관련된 네임 스페이스 접두사로 시작된다 :

<xs:element name="orderperson" type="xs:string"/>

: 다음, 우리는 복합 형의 두 가지 요소를 정의해야 "shipto""item" . 우리는 정의에 의해 시작 "shipto" 요소를 :

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

스키마로 우리는에 minOccurs이 속성은 maxOccurs와 가진 요소에 대해 가능한 사건의 수를 정의 할 수 있습니다. maxOccurs에가 발생 요소의 최대 개수를 지정에 minOccurs는 요소의 발생의 최소 개수를 지정한다. maxOccurs에와에 minOccurs 모두의 기본값은 1입니다!

이제 우리는 정의 할 수 있습니다 "item" 요소를. 이 요소는 내부에 여러 번 나타날 수있다 "shiporder" 요소입니다. 이것은 설정하여 지정 maxOccurs 의 속성 "item" 요소 "unbounded" 의 많은 발생이있을 수 있다는 것을 의미한다 "item" 저자 소원 등의 요소를. 알 수 있습니다 "note" 요소는 선택 사항입니다. 우리는 설정하여 지정한 minOccurs 제로에 속성 :

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

우리는 지금의 속성 선언 할 수있다 "shiporder" 요소를. 이것은 우리가 사용을 지정 필수 속성이기 때문에 = "이 필요합니다."

Note: 속성 선언은 항상 마지막에 와야합니다 :

<xs:attribute name="orderid" type="xs:string" use="required"/>

여기라는 스키마 파일의 전체 목록입니다 "shiporder.xsd" :

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

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

스키마를 나눈다

이전의 설계 방법은 매우 간단하지만, 판독 문서 복잡한 경우 유지하기 어려울 수있다.

다음 설계 방법은 모든 요소를 정의에 기초하여 제 특성을, 다음 사용하여 참조된다 ref 속성.

여기 스키마 파일의 새로운 디자인 ("shiporder.xsd") :

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

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

명명 된 형식을 사용하여

세 번째 설계 방법은 요소의 정의를 다시 우리를 가능하게하는, 클래스 또는 유형을 정의합니다. 이것은 simpleTypes 복합 유형 및 요소 명명 수행하고 통해 가리킬되는 type 요소의 속성.

여기 스키마 파일의 제 디자인 ("shiporder.xsd") :

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

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

제한 요소는 데이터 유형이 W3C XML 스키마 네임 스페이스의 데이터 유형에서 파생되어 있음을 나타냅니다. 그래서, 다음 단편 요소 또는 속성의 값은 문자열 값이어야한다는 의미

<xs:restriction base="xs:string">

제한 요소는 종종 소자에 제한을 적용하는 데 사용된다. 위의 스키마에서 다음 줄을 봐 :

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

이 요소 나 속성의 값이 문자열이어야합니다 나타냅니다, 그것은 행 정확히 6 자이어야하며, 그 문자는 0에서 9까지의 숫자 여야합니다.