Table of Contents
Cílem je poskytnout abstraktní model dat v příslušném značkování tak, abychom:
mohli validovat, zda dokumenty jsou syntakticky korektní, zda odpovídají schématu
následně mohli dokumenty (data) zpracovávat jako silně typované:
hodnoty textových uzlů pak interpretovány jako hodnoty primitivních datových typů (int, float, boolean...), nebo vestavěných neprimitivních typů - řetězec, datum
elementy interpretovány jako hodnoty uživatelských objektových typů, např. element person jako objekt třídy Person.
používat informace o struktuře validních dokumentů např. při vyhledávání:
víme-li např., že element from se vyskytuje jen jako dceřinný v elementu message, můžeme a priori rozhodnout, že výsledek XPath dotazu /address/from bude nad validními dokumenty vždy prázdný
totéž např. pro dokumenty, kde známe pořadí výskytu dceřinných elementů za sebou - pak můžeme např. predikovat obsah XPath osy following-sibling.
používat je při vizualizaci, formátování, editaci(!)
XML 1.0, 1.0 SE, 2.0 standardy definují metajazyky, tj.:
neříkají ni o konkrétním značkování
ale sděluje, jaká obecná omezení pro konstrukci značkování platí (např. správné vnoření elementů)
definuje DTD jako základní formální jazyk definice struktury dokumentu
ale nevylučuje existenci dalších takových jazyků
Popis příslušného značkování, tj. návod, které dokumenty v daném značkování chápeme jako platné (validní), nazýváme schématem příslušného značkovacího jazyka.
(Meta)jazyk, v němž je schéma zapsáno, nazveme jazykem schémat.
Neplést schéma a jazyk schématu v tomto širokém smyslu s XML Schema (což je speciální případ jazyka schémat, případně jeho instance).
Podle základního výrazového prostředku, kterým definujeme “správnou” strukturu dokumentů, rozlišujeme jazyky schémat založené na:
gramatikách
objektovém přístupu, skládání, dědičnosti
vzorech
Typická situace:
značkování je bezkontextovým jazykem definovaným gramatikou
typickým představitelem je gramatika zapsaná v DTD (s jistým non-CF omezeními, jako je např. vazba ID-IDREF)
jazyky XML Schema i Relax NG převzaly částečně tento přístup - kombinují gramatiku s možností dědičnosti
Typickým představitelem je XML DTD.
Hlavní charakteristiky:
jednou vytvořené schéma či jeho část je možné pojmenovat a znovu použít
beze změny
při znovupoužití je možné pozměnit jeho vlastnosti (např. zpřísnit některá omezení), obvykle ale tak, že je zachováno pravidlo, že instance podtřídy může vždy nahradit instanci nadtřídy (má aspoň její vlastnosti)
Typickými představiteli jsou XML Schema a Relax NG (čteme jako “relaxing”).
Schéma tohoto typu říká, jaké vzory se mohou/musejí/nesmějí v dokumentu nacházet.
nejméně používaná schémata, ale v mnohých situacích nenahraditelná
vhodná pro XML data dokumentové (tj. velmi heterogenní, mnohotvaré) povahy - značkované texty
Používáme tam, kde je prostředky (CF) gramatiky určité omezení (constraint) těžko popsatelný - např. složité kontextové závislosti. To by se jinak muselo např. “dovalidovat” externím nástrojem.
prostředkem popisu vzorů je určitý “vnořený” jazyk - např. stromové regulární výrazy, výrazy jazyka XPath...
Typickým představitelem je Schematron a Examplotron.
Specifikace XML Schema - http://www.w3.org/XML/Schema
Tutoriál Using W3C XML Schema: http://www.xml.com/pub/a/2000/11/29/schemas/part1.html - stručný
XML Schema Tutorial - http://www.w3schools.com/schema/default.asp - obsáhlejší
vynikající komplexní tutoriál na http://www.xfront.com
Dát silnější prostředek pro specifikaci modelu XML dat než je DTD; mít možnost:
Oddělit koncept typu (např. typu elementu) od jeho výskytu (instance, např. elementu s určitým názvem) - to DTD neumí
Poskytnout bohatší škálu primitivních datových typů
Umožnit použití jmenných prostorů
Umožnit jemnější specifikaci modelu obsahu (elementů)
Umožnit odvozování nových typů (dědičností)
Umožnit modularizaci a znovupoužitelnost schémat
Zapisovat schéma v XML
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> .../... </xs:schema>
<xs:element name="element_name"> ... definice typu - je přímo zde - tzv. "local" nebo daná odkazem - tzv. "global" </xs:element>
Neobsahuje dceřinné elementy, lze použít jako typ obsahu elementu nebo atributu
Lze definovat restrikcí z existujícího typu
<xs:simpleType name="TypeName"> <xs:restriction base="BaseTypeName"> ... </xs:restriction> </xs:simpleType>
Restrikce délky obsahu
<xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="32"/> </xs:restriction> </xs:simpleType>
Restrikce obsahu regulárním výrazem
<xs:simpleType name="isbnType"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{10}"/> </xs:restriction> </xs:simpleType>
Zhruba odpovídá konceptu "union" v C
Výsledkem je jednoduchý typ
Lze spojovat bázový typ a výčet hodnot
Příklad:
<xs:simpleType name="isbnType"> <xs:union> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{10}"/> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="TBD"/> <xs:enumeration value="NA"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
Lze definovat typ jako seznam hodnot oddělených bílými znaky
Dalším odvozením lze omezit počet prvků seznamu
Příklad
<xs:simpleType name="isbnTypes"> <xs:list itemType="isbnType"/> </xs:simpleType> <xs:simpleType name="isbnTypes10"> <xs:restriction base="isbnTypes"> <xs:minLength value="1"/> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType>
<xs:complexType name="TypeName"> <xs:sequence> <xs:element ...> ... <xs:attribute ...> </xs:sequence> </xs:complexType>
Místo sekvence lze použít <xs:choice> a <xs:all>
při definici složeného typu lze použít skupiny (group)
Skupina elementů:
<xs:group name="GroupName"> <xs:sequence> <xs:element ... /> ... </xs:sequence> </xs:group>
Místo sekvence lze použít <xs:choice> a <xs:all>
Skupina atributů:
<xs:attributeGroup name="AttributesGroupName"> <xs:attribute ... use="required"/> ... </xs:attributeGroup>
Může být uvedena povinnost výskytu (use=required)
Příklad použití skupin elementů a atributů
<xs:complexType name="bookType"> <xs:sequence> <xs:group ref="mainBookElements"/> <xs:element name="character" type="characterType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attributeGroup ref="bookAttributes"/> </xs:complexType>
Předepisuje výskyt dceřinných elementů v určitém pořadí
<xs:element name="element_name"> <xs:complexType> <xs:sequence> .../... </xs:sequence> .../... </xs:complexType> </xs:element>
sequence označuje model obsahu připouštějící výskyt dané posloupnosti (sekvence) dceřinných elementů
xs je prefix vázaný na NS s URL http://www.w3.org/2001/XMLSchema
Místo <xs:sequence> lze použít <xs:choice> nebo <xs:all>
Předepisuje výskyt jednoho z dceřinných elementů nebo skupin elementů
<xs:element name="element_name"> <xs:complexType> <xs:choice> .../... </xs:choice> .../... </xs:complexType> </xs:element>
Předepisuje výskyt dceřinných elementů bez určeného pořadí
Smí být jen na nejvyšší úrovni definice obsahu
Dceřinné elementy nesmí mít kardinalitu větší než 1
Příklad:
<xs:complexType name="bookType"> <xs:all> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:element name="character" type="characterType" minOccurs="0" maxOccurs="unbounded"/> </xs:all> <xs:attribute name="isbn" type="isbnType" use="required"/> </xs:complexType>
Příklad:
<xs:element name="book"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="isbn" type="isbnType"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
Nelze validovat textový obsah (textové dceřinné uzly)
Lze validovat dceřinné elementy
Příklad:
<xs:element name="book"> <xs:complexType mixed="true"> <xs:all> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> </xs:all> <xs:attribute name="isbn" type="xs:string"/> </xs:complexType> </xs:element>
Možnost specifikace integritních omezení:hodnota je jedinečná - xs:uniquehodnota je klíčem - xs:keyhodnota je odkazem na klíč - xs:keyref
Anotace je (lidsky čitelná) poznámka-komentář ke schématu
Může též obsahovat informace pro zpracování - viz příklad - xs:appinfo
Další obsah není předepsán (omezen) - viz příklad - bind, class
Příklad
<xs:annotation> <xs:documentation xml:lang="en">Top level element.</xs:documentation> <xs:documentation xml:lang="fr">Element racine.</xs:documentation> <xs:appinfo source="http://example.com/foo/"> <bind xmlns="http://example.com/bar/"> <class name="Book"/> </bind> </xs:appinfo> </xs:annotation>
Přímo:
<xs:include schemaLocation="character.xsd"/>
S předefinováním:
<xs:redefine schemaLocation="character12.xsd"> <xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="40"/> </xs:restriction> </xs:simpleType> </xs:redefine>
abstract - nelze instanciovat, pouze jako zákad k odvozování dědičností
final - nelze rozšiřovat/odvozovat dědičností
Příklad
<xs:schema targetNamespace="http://example.org/ns/books/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:bk="http://example.org/ns/books/" elementFormDefault="qualified" attributeFormDefault="unqualified"> .../... </xs:schema>
Umožní připustit i něco, co předem neznáme
Příklad
<xs:complexType name="descType" mixed="true"> <xs:sequence> <xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>
Pro atributy - xs:anyAttribute
<book isbn="0836217462" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:library.xsd">
<book isbn="0836217462" xmlns="http://example.org/ns/books/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="file:library.xsd">
XML Schema:
Je (zbytečně) složité (specifikace má přes 200 stran)
Může vést v jistých situacích k nejednoznačnostem.
Snaží se o pokrytí všech aplikačních oblastí (dokumentové i databázové použití XML a všechno mezi tím).
Obtížně (úplně) implementovatelné.
Vznikl z RELAXu při skupině OASIS-OPEN:
Vznikl na Univerzitě v Aarhusu, DK
Podobně jako RELAX NG je jednodušší než XML Schema
viz http://www.brics.dk/~amoeller/XML/
Spíše akademický charakter, skutečnými soupeři zůstávají XML Schema a RELAX NG