Isang Halimbawa ng XSD

Ito ang paglilitaw ng kung paano magpasulat ng isang XML Schema. Mababatid mo rin ang iba't ibang pamamaraan sa pagpagsulat ng schema.

Dokumentong XML

Hilingin natin ang dokumentong XML na may pangalang "shiporder.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</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>

Ang dokumentong XML na ito ay may pangunahing elemento na "shiporder", na naglalaman ng katangian na may pangalang "orderid". Ang elemento na "shiporder" ay naglalaman ng tatlong iba't ibang sub-elemento: "orderperson", "shipto" at "item". Ang elemento na "item" ay lumitaw dalawang beses, na mayroon sa kanya ang "title", isang opsyonal na "note" elemento, isang "quantity" at isang "price" elemento.

Ang ganitong linya xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance", ay nagsasabi sa parser ng XML na pagtibayin ang dokumento ayon sa isang schema. Ang linya na ito: xsi:noNamespaceSchemaLocation="shiporder.xsd" ay nagtutukoy sa lokasyon ng schema (dito, ito ay nasa parehong folder na ang "shiporder.xml").

Lumikha ng isang XML Schema

Ngayon, kailangan namin lumikha ng schema para sa itaas na dokumentong XML.

Maaari kaming magsimula sa pagbubuksan ng isang bagong file, at ipangalan ito na "shiporder.xsd". Upang lumikha ng schema, kailangan lang naming sunud-sunod na sundin ang istraktura ng dokumentong XML, at idedefinir ang bawat elemento na nakita namin. Sa unang pagkakataon, nagsisimula kami sa pagdefinir ng standard na deklarasyon ng XML:

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

Sa itaas na schema, gumamit kami ng standard na namespace (xs), na kaugnay ng URI ng Schema language definition, na may standard na halaga na http://www.w3.org/2001/XMLSchema.

Kasunod na, kailangan namin idedefinir ang "shiporder" elemento. Ang elemento na ito ay may attribute, na naglalaman ng iba pang elemento, kaya tinuturing namin ito bilang komposidong uri. Ang mga anak ng "shiporder" elemento ay napapalibutan ng elemento na xs:sequence, na nagbibigay ng kaugnayan sa pagkakasunod-sunod ng mga anak:

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

Pagkatapos, kailangan namin idedefinir ang "orderperson" elemento bilang simple uri (ito ay dahil hindi ito naglalaman ng anumang attribute o iba pang elemento). Ang prefix ng uri (xs:string) ay pinagmumulan ng prefix ng namespace, na kaugnay ng XML schema na nagbibigay ng predefinidong uri ng data type na XML schema:

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

Kasunod na, kailangan kong idedefinir ang dalawang elemento bilang komposidong uri: "shipto" at "item". Magsisimula kami sa pagdefinir ng "shipto" elemento:

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

Sa pamamagitan ng schema, namin ay makakapagbigay ng kahulugan sa bilang ng pagkakakaroon ng isang elemento. Ang maxOccurs ay nagbibigay ng pinakamataas na bilang ng pagkakaroon ng isang elemento, habang ang minOccurs ay nagbibigay ng pinakamababang bilang ng pagkakaroon ng isang elemento. Ang default na halaga ng maxOccurs at minOccurs ay 1!

Ngayon, namin ay makakadefinir ang "item" elemento. Ang elemento na ito ay maaaring lumitaw nang maraming beses sa loob ng "shiporder" elemento. Ito ay ginawa sa pamamagitan ng pagtatakda ng halaga ng attribute na maxOccurs ng "item" elemento bilang "unbounded", kaya ang "item" elemento ay maaaring lumitaw nang anumang bilang na pinaghahanap ng tagapaglikha. Mangyaring paniwalaan, ang "note" elemento ay opisyal na elemento. Kaming napagtakda ang halaga ng attribute na minOccurs ng elemento na ito bilang 0:

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

Ngayon, maaari naming ideklara ang attribute ng elemento na "shiporder" na ito ay dapat ay isang mahalagang attribute, kaya tinuturing namin na use="required".

Komento:Ang pagdeklara ng attribute na ito ay dapat ilagay sa huli:

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

Ito ay ang listahan ng dokumento ng file na may pangalang "shiporder.xsd" na schema file:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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>

Hatiin ang Schema

Ang dating pamamaraan ng disenyo ay napakadali, ngunit napakahirap na basahin at mainhimain kapag ang dokumento ay napakalaking komplikasyon.

Ang paglalarawan ng pamamaraan na ito ay nakabase sa paglalarawan ng lahat ng mga elemento at attribute muna, pagkatapos ay gamitin ang attribute na ref upang sumangguni sa kanila.

Ito ay dinisenyo gamit ang bagong pamamaraan ang file ng schema:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 简易元素的定义 -->
<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"/>
<!-- Paglalarawan ng attribute -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- Kompleks na elemento na paglalarawan -->
<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>

Gamit ang tinukoy na uri (Named Types)

Ang ikatlong paraan ng disenyo ay nagtatalaga ng klase o uri, na nagbibigay sa amin ng kakayahan na magsalita ng kahulugan ng mga elemento. Ang paraan nito ay: unang pangalanan ang madali at kompleks na elemento, pagkatapos ay i-point ang mga ito sa pamamagitan ng attribute na type ng elemento.

Ito ay isang schema na dinisenyo gamit ang ikatlong paraan ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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>

Ang elemento ng restriction ay nagpapakita na ang uri ng datos ay mula sa uri ng namespace ng W3C XML Schema. Kaya, ang mga sumusunod na bahagi ay nangangahulugan na ang halaga ng elemento o attribute ay dapat na uri ng string:

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

Ang elemento ng restriction ay kalimitang ginagamit upang magbigay ng mga limitasyon sa elemento. Tingnan ang mga bunga ng itaas na schema:

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

Ang kodigo na ito ay nagtutukoy na ang halaga ng elemento o atributo ay dapat na string, at dapat na magiging magkakasunod-sunod na anim na character, at ang mga character na ito ay dapat na numero 0-9.