**XML шема** (*XML schema*) претставува јазик за обезбедување и ограничување на структурата и содржината на елементите кои се содржат во самите XML документи, односно претставува мета-јазик за дефинирање на XML документи со кој се надминуваат недостатоците што ги носи DTD. Шемата ја користи истата синтакса за дефинирање на нов XML речник како и стандардните XML документи. Секој XML документ изграден врз основа на дефинирана шема се нарекува негова инстанца. Постојат предефинирани тагови за:

* елементи (глобални и локални)
* прости типови (вградени и изведени)
* комплексни типови
* атрибути (глобални и локални)
* ограничувања

Структурa на XML шема
---------------------

Структурата на XML шемата е слична со структурата на XML документите:

* елементите, типовите, атрибутите се дефинираат или со користење на пар од тагови (за старт и крај), или со користење на празни тагови
* одликите на елементите се дефинираат како атрибути на елементот

Секоја шема има еден *schema* (шема) елемент и множество на негови составни делови меѓу кои најзначајни се останати елементи, комплексните типови, простите типови и атрибути. Секој елемент во шемата има претставка која е асоцирана со именскиот простор на XML шемата дефиниран во рамки на заглавието на истата.
  

Како и кај DTD, програмерот во рамки на XML документот мора да ја наведува шемата која е создадена за тој документ за да важат правилата дефинирани во истата.
  

Кај XML Schema сè се гради почнувајќи од најниското ниво кон највисокото. Декларациите на високо ниво немаат смисла без знаењето за деклараците на самите податоци во шемата.

Податочни типови и нивни декларации во XML шема
-----------------------------------------------

Поради последното ќе започнеме од податочните типови и нивните декларации во XML Schema. Постојат два типа на податоци: прости и сложени.

### Прости податочни типови

Прости типови се оние кои се вградени во рамки на јазикот, како и оние кои се изведуваат од постоечки прости типови, но немаат структура (имаат таг за почеток и крај без дополнителни тагови помеѓу истите).

#### Вградени прости типови

Вградени прости типови во XML Schema се:

* string
* int
* decimal (1.33, 4.0, 4)
* float (12.3E, INF, NaN)
* Boolean (true, false, 1, 0)
* time (13:20:00.000)
* date (2001-10-24)
* ID
* IDREF
* и многу други

и при користење на овие типови задолжително се наведува претставката за именскиот простор на шемата.

#### Нови прости атомични типови

Нови прости атомични типови се дефинираат преку нивно изведување од постоечки атомични прости типови. Изведувањето на нови типови се прави со ограничување на опсегот на вредности на некој постоечки прост тип. За да се дефинира името на нов прост тип во шемата се користи елементот ***<xsd:simpleType name="simpleType\_name">***. За да се назначи дека новиот тип се гради врз постоечки (најчесто вграден тип) се користи елементот ***<xsd:restriction base="xsd:base\_type\_name">***. Кога станува збор за ограничувања на опсег на вредности за некој прост тип во XML Schema се дефинираат параметри *(facets)* за кои се задаваат "дозволени" вредности преку атрибутот value. Постојат следните параметри:

* **length**, **minLength**, **maxLength**, ограничувања на должина на стринг

```
<xsd:simpleType name="ulicaIme">  

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

      <xsd:minLength value="1"/>  

      <xsd:maxLength value="50"/>  

   </xsd:restriction>  

</xsd:simpleType>
```

* **pattern**, се користи во комбинација со регуларен израз кога сакаме да ограничиме стрингот да го задоволува наведениот израз

```
<xsd:simpleType name="streetName">  

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

      <xsd:pattern value="\d{1,10} \D{1,} [\D\.]{2,}$"/>  

   </xsd:restriction>  

</xsd:simpleType>
```

* **enumeration**, множество на вредности (слично на switch во C)

```
<xsd:simpleType name="ocenka">  

   <xsd:restriction base="xsd:integer">  

      <xsd:enumeration value="10"/>  

      <xsd:enumeration value="9"/>  

      <xsd:enumeration value="8"/>  

      <xsd:enumeration value="7"/>  

      <xsd:enumeration value="6"/>  

      <xsd:enumeration value="5"/>  

   </xsd:restriction>  

</xsd:simpleType>
```

* **maxInclusive**, **minInclusive**, дефинирање на долна и горна граница на затворен опсег за наброиви вредности (и границите влегуваат во опсегот)
* **maxExclusive**, **minExclusive**, дефинирање на долна и горна граница на отворен опсег за наброиви вредности (границите не влегуваат во опсегот)

```
<xsd:simpleType name="starost">  

   <xsd:restriction base="xsd:integer">  

      <xsd:minInclusive value="0"/>  

      <xsd:maxExclusive value="150"/>  

   </xsd:restriction>  

</xsd:simpleType>
```

#### Листи и унии од прости типови

Освен атомични прости типови во XML Schema се дефинираат и листи и унии од прости типови. Листа од прости типови се дефинира преку користење на ***<xsd:list itemType="xsd:simpleType\_name">***, со што во XML документот таквиот тип ќе одговара на листа од вредности од типот simpleType\_name одделени со празно место.  

```
<xsd:simpleType name="listaOceni">  

   <xsd:list itemType="xsd:oceni"/>  

</xsd:simpleType>
```

За листите од прости типови може да се наведуваат ограничувањата: length, minLength, maxLength и enumeration.  

```
<xsd:simpleType name="lista_40_Oceni">  

   <xsd:restriction itemType="xsd:listaOceni">  

      <xsd:length value="40"/>  

   </xsd:restriction>  

</xsd:simpleType>
```

Унија од прости типови се дефинира преку користење на тагот **union**. Вредностите во рамки на XML документот кои одговараат на податочниот тип union може да бидат од било кој прост тип дефиниран во рамки на union тагот.  

```
<xsd:simpleType name="polozuva">  

   <xsd:union>  

      <xsd:simpleType>  

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

            <xsd:enumeration value="da"/>  

            <xsd:enumeration value="ne"/>  

         </xsd:restriction>  

      </xsd:simpleType>  

      <xsd:simpleType>  

         <xsd:restriction base="xsd:integer">  

            <xsd:maxInclusive value="1"/>  

            <xsd:minInclusive value="0"/>  

         </xsd:restriction>  

      </xsd:simpleType>  

   </xsd:union>  

</xsd:simpleType>
```

### Комплексни податочни типови

Комплексните типови се изведуваат со користење на други прости или комплексни типови и дополнително вклучуваат сложена податочна структура (вклучуваат дополнителни тагови помеѓу таговите за старт и крај, односно имаат стебловидна структура).
Комплексните типови содржат атрибути и елементи во својата структура. За да се дефинира името на нов комплексен тип во шемата се користи елементот ***<xsd:complexType name="complexType\_name">***. Во рамки на XML Schema постојат неколку начини за градење на структурата на комплексните елементи, кои имаат почетен и краен таг со следните имиња:

* **xsd:sequence**, се користи за наведување на точниот распоред на елементите

```
<xsd:complexType name="Adresa">  

   <xsd:sequence>  

      <xsd:element name="ime" type="xsd:string"/>  

      <xsd:element name="ulica" type="xsd:string"/>  

      <xsd:element name="grad" type="xsd:string"/>  

   </xsd:sequence>  

</xsd:complexType>
```

* **xsd:choice**, се користи за „ИСКИЛИ" избор

```
<xsd:complexType name="Student">  

   <xsd:sequence>  

      <xsd:choice>  

         <xsd:element name="celaAdresa" type="Adresa"/>  

         <xsd:element name="prostaAdresa" type="xsd:string"/>  

      </xsd:choice>  

      <xsd:element name="indeks" type="xsd:string"/>  

      <xsd:element name="godRag" type="xsd:date"/>  

   </xsd:sequence>  

</xsd:complexType>
```

* **xsd:all**, се користи да се наведе дека распоредот на елементите е небитен
* **xsd:group**, се користи за дефинирање, а подоцна и за наводирање на група од елементи

Ваквите тагови може произволно да се вгнездуваат во рамките на еден комплексен тип.
  

Кога станува за група од елементи во шемата на податоци може да се дефинираат именувани групи кои постојат надвор од дефиницијата на комплексниот тип. За дефинирање на група од елементи се користи ***<xsd:group name="group\_name">***, додека за дефинирање на група од атрибути се користи ***<xsd:attributeGroup name="attributeGroup\_name">***, и предноста од именувањето е дека групата од елементи дефинирана на ваков начин може да се користи на повеќе места во XML документот. Групите се наводираат со користење на ***<xsd:group ref="groupName">*** за групи од елементи или ***<xsd:attributeGroup ref="attributeGroupName">*** за групи од атрибути. Наводирање значи дека на местото каде што се наводира во рамки на XML документот се јавува целата структура дефинирана за групата која се наводира.  

```
<xsd:group name="celosnaAdresa">  

   <xsd:sequence>  

      <xsd:element name="HomeAddress" type="Adresа"/>  

      <xsd:element name="PostalAddress" type="Adresа"/>  

   </xsd:sequence>  

</xsd:group>
```

```
<xsd:complexType name="Student">  

   <xsd:sequence>  

      <xsd:choice>  

         <xsd:element name="obicnaAdresa" type="Adresa"/>  

         <xsd:group ref="celosnaAdresa"/>  

      </xsd:choice>  

      <xsd:element name="indeks" type="xsd:string"/>  

      <xsd:element name="godRag" type="xsd:date"/>  

   </xsd:sequence>  

<xsd:complexType/>
```

#### Декларација на елементи

За декларација на елементи во рамки на шемата се користи ***<xsd:element name="value" type="value" ...>*** тагот. Елементите се делат на глобални и локални. Глобалните елементи (и атрибути) се создаваат преку декларации кои се јавуваат како деца на шема елементот. Глобалните елементи може да се јават како коренови елементи на XML документот кој се создава врз основа на дефинираната шема, може да бидат наводирани од други елементи, но самите не смеат да содржат наводи и не смее да има структурни ограничувања. Секоја шема мора да содржи минимум еден глобален елемент. Локалните елементи (и атрибути) се јавуваат во рамки на дефинициите на комплексните типови. Еден *element* таг од XML шемата може да има различни атрибути:

* **name**, го дефинира името на тагот во конкретната шема
* **minOccurs**, минимален број појавувања (важи и за групи)
* **maxOccurs**, максимален број појавувања (важи и за групи)
* **type**, го дефинира податочниот тип на елементот
	+ типот на елементот може да биде дефиниран и во вгнезден таг како simple или complex
* **default**, ја дефинира подразбираната вредност за елементот доколку за истиот не се наведе ништо во рамки на XML документот (пр. <element> </element>)
* **ref**, наместо да се декларира нов елемент може да се користи постоечки преку наводирање со овој атрибут, елементот кој се наводира мора да биде глобален.

#### Декларација на атрибути

За декларација на атрибути во рамки на шемата се користи ***<xsd:attribute name="value" type="value" ...>*** тагот. Тагот *attribute* може да биде вгнезден во рамки на *element* таг и на таков начин дефинираме атрибут за елементот во кој е вгнезден. Атрибути може да се дефинираат во рамки на структурата на некој комплексен тип или група, дополнително може да се создаде група од атрибути на ист начин како што се создаде група од елементи (опишано погоре). Еден *attribute* таг од XML шемата може да има различни атрибути:

* **name**, го дефинира името на атрибутот во конкретната шема
* **use**, го дефинира присуството на атрибутот во рамки на елементот и може да биде
	+ *required*, задолжително мора да се внесе во XML документот
	+ *optional*, атрибутот е опционален (ова е подразбирана вредност за use)
* **default**, ако е дефиниран овој дел вредноста која е доделена се задава како вредност за атрибутот во рамки на XML документот (атрибут со зададена default вредност мора да се дефинира како optional)
* **type**, го дефинира типот на атрибутот
	+ атрибутот може да биде само прост тип на податок (некој од вградените или изведените прости типови со ограничувања над вградените)

```
<xsd:complexType name="ClassType">  

   <xsd:sequence>  

      <xsd:element name="title" type="xsd:string"/>  

      <xsd:element ref="comment" minOccurs="0"/>  

      <xsd:element name="lecturer" maxOccurs="3" type="xsd:string"/>  

      <xsd:element name="auditor" minOccurs="0" type="xsd:string"/>  

      <xsd:element name="student" minOccurs="0" maxOccurs ="unbounded">  

         <xsd:complexType>  

            <xsd:sequence>  

               <xsd:element name="IndeksBr" type="xsd:integer"/>  

               <xsd:element name="ImePrezime" type="xsd:string"/>  

               <xsd:element name="DataRaganje" type="xsd:date"/>  

            </xsd:sequence>  

            <xsd:attribute name="studentId" type="xsd:ID"/>  

         </xsd:complexType>  

      </xsd:element>  

   </xsd:sequence>  

   <xsd:attribute name="no_of_stds" type="xsd:int" use="required"/>  

</xsd:complexType>  

<xsd:element name="class" type="ClassType"/>  

<xsd:element name="comment" type="xsd:string"/>
```

Користена литература
--------------------

* проф. д-р Владимир Трајковиќ: „Експертни Системи", скрипта. ФЕИТ, УКИМ, Скопје, 2010.