Article Index

Úvod do XML Schema Definition

DTD lze využít bez problémů na definování struktury XML dokumentu, jeho možnosti omezit uživateli vkládat vybraná data je velmi slabý (pouze omezení typu enumeration), možnost definovat přesný počet značek je také omezený. Z tohoto důvodu bylo vytvořeno XMLSchema. Tento nástroj má velmi mocné nástroje pro přesnou definici toho, co může být v XML dokumentu obsaženo. Na druhou stranu, XMLSchema má velmi košatý zápis. V případě nevhodného zápisu může být výsledný definiční kód velmi nepřehledný.

Jednoduchá zpráva

Pokud začneme s jednoduchým zápisem, kde potřebujeme definovat prostou hierarchii, můžeme použít příklad z kapitoly DTD:

<zprava>
  <od>Michal</od>
  <komu>Jan</komu>
  <predmet>Přednáška</predmet>
  <text>Vem to dnes prosím za mne.</text>
</zprava>

Namespaces

Každý (téměř) z jazyků rodiny XML používá namespace - je to zjednodušeně řečeno odlišení jednotlivých jazyků, zejména užitečné v případě, že kombinujeme několik jazyků v jednom souboru. Taková možnost nastane napříkald u transformací, kde lze kombinovat XSL(T), XSL:FO, SV, HTML a další. Namespace označuje některé jazyky a na první pohled je tak zřejmé, s čím pracujeme. U XSD je každá značka uvozena "xs:".

Definice elementu

Základní strukturou XSD je element - definice jediné značky - další je pak úpravou možností, co v dané značce může být (datový typ, omezení, atribut) a jaké jsou možnosti (volitelnost, výběr z možností, ...).

<xs:element name="" type="" minOccurs="" maxOccurs="" />

U elementu je vždy povinné jméno "name" a datový typ "type". Další dvě volby uvedené v příkladu jsou volitelné - udávají minimální a maximální počet výskytu dané značky na daném místě v hierarchii. Pokud tyto dvě možnosti nejsou uvedené, pak je značka povinná a vyskytuje se přesně 1x. Pokud chceme umožnit neomezený výstyk značky, pak se do uvozovek vkládá hodnota "unbounded".

Úvodní deklarace

V úvodu byla jednoduchá ukázka definice posloupnosti 4 značek bez zanoření, atributů, možnosti výběru, omezení a dalších možností definičního nástroje XML Schema. Pokud vytváříme definici v XSD, musíme soubor XSD nalinkovat do XML:

<komunikace xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="komunikace.xsd">

V tomto případě bude definice v xsd vypadat následovně:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="zprava">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="od" type="xs:string"/>
      <xs:element name="komu" type="xs:string"/>
      <xs:element name="predmet" type="xs:string"/>
      <xs:element name="text" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
</xs:schema>

Jak je vidět, na rozdíl od DTD, kde je zápis hierarchie poměrně přehledný, XMLSchema potřebuje výrazně více značek pro definice. Zároveň je zde vidět další rozdíl, kdy každá značka má definovaný datový typ a je možné omezit počet výskutů značky (minimální a maximální počet).

Kořenová značka <zprava> má potomky - značky <od>, <komu>, <predmet> a <text>. Značka <zprava> je tak definována jako <xs:complexType> - komplexní typ - obsahuje další uzly. Máme tři druhy komplexních typů:

  • <xs:sequence> - posloupnost značek, musí se respektovat pořadí,
  • <xs:choice> - definujeme možnosti - značky, mezi kterými se vybírá,
  • <xs:all> - možnost libovolného obsahu potomků.

Sekvenci už jsme měli, jak vypadají zápisy zbývajících možností.

<xs:choice>

Zkusme dvě varianty pro jednoduchou zprávu o měření.

<mereni>
  <temp>10</temp>
</zmereni>

a

<mereni>
  <humidity>55</humidity>
</zmereni>

Pro jednoduchost zatím zanedbáme jednotky. XSD soubor by pak vypadal následovně:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="mereni">
    <xs:complexType>
     <xs:choice>
      <xs:element name="temp" type="xs:integer"/>
      <xs:element name="humidity" type="xs:integer"/>
     </xs:choice>
    </xs:complexType>
   </xs:element>
</xs:schema>

Máme tedy v <xs:choice> dvě značky, přitom v souboru bude vždy pouze jedna z nich. Nabízí se otázka, jak realizovat výběr různých skupin značek.

První možností je vnoření - tedy každá ze značek bude obsahovat další značkym, nebo zde bude odkaz na definici těchto značek, nebo zde bude odkaz na skupinu značek - vše si projdeme dále.