XML шема (XML schema) претставува јазик за обезбедување и ограничување на структурата и содржината на елементите кои се содржат во самите XML документи, односно претставува мета-јазик за дефинирање на XML документи со кој се надминуваат недостатоците што ги носи DTD. Шемата ја користи истата синтакса за дефинирање на нов XML речник како и стандардните XML документи. Секој XML документ изграден врз основа на дефинирана шема се нарекува негова инстанца. Постојат предефинирани тагови за:
Структурата на XML шемата е слична со структурата на XML документите:
Секоја шема има еден schema (шема) елемент и множество на негови составни делови меѓу кои најзначајни се останати елементи, комплексните типови, простите типови и атрибути. Секој елемент во шемата има претставка која е асоцирана со именскиот простор на XML шемата дефиниран во рамки на заглавието на истата.
Како и кај DTD, програмерот во рамки на XML документот мора да ја наведува шемата која е создадена за тој документ за да важат правилата дефинирани во истата.
Кај XML Schema сè се гради почнувајќи од најниското ниво кон највисокото. Декларациите на високо ниво немаат смисла без знаењето за деклараците на самите податоци во шемата.
Поради последното ќе започнеме од податочните типови и нивните декларации во XML Schema. Постојат два типа на податоци: прости и сложени.
Прости типови се оние кои се вградени во рамки на јазикот, како и оние кои се изведуваат од постоечки прости типови, но немаат структура (имаат таг за почеток и крај без дополнителни тагови помеѓу истите).
Вградени прости типови во XML Schema се:
и при користење на овие типови задолжително се наведува претставката за именскиот простор на шемата.
Нови прости атомични типови се дефинираат преку нивно изведување од постоечки атомични прости типови. Изведувањето на нови типови се прави со ограничување на опсегот на вредности на некој постоечки прост тип. За да се дефинира името на нов прост тип во шемата се користи елементот <xsd:simpleType name=”simpleType_name”>. За да се назначи дека новиот тип се гради врз постоечки (најчесто вграден тип) се користи елементот <xsd:restriction base=”xsd:base_type_name”>. Кога станува збор за ограничувања на опсег на вредности за некој прост тип во XML Schema се дефинираат параметри (facets) за кои се задаваат "дозволени" вредности преку атрибутот value. Постојат следните параметри:
<xsd:simpleType name=“ulicaIme”>
<xsd:restriction base=“xsd:string”>
<xsd:minLength value=”1”/>
<xsd:maxLength value=”50”/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name=“streetName”>
<xsd:restriction base=“xsd:string”>
<xsd:pattern value=”\d{1,10} \D{1,} [\D\.]{2,}$”/>
</xsd:restriction>
</xsd:simpleType>
<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>
<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: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: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: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 шемата може да има различни атрибути:
За декларација на атрибути во рамки на шемата се користи <xsd:attribute name=”value” type=”value” ...> тагот. Тагот attribute може да биде вгнезден во рамки на element таг и на таков начин дефинираме атрибут за елементот во кој е вгнезден. Атрибути може да се дефинираат во рамки на структурата на некој комплексен тип или група, дополнително може да се создаде група од атрибути на ист начин како што се создаде група од елементи (опишано погоре). Еден attribute таг од XML шемата може да има различни атрибути:
<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”/>