Kapitola 1. Schémata XML dat (DTD, XML Schema, Relax NG, Schematron...)

Obsah

Cíle a charakteristiky jazyků schémat
Cíle modelování XML dat
Přístupy k modelování XML dat
Kategorie jazyků schemat
Modelování pomocí gramatik
Modelování pomocí dědičnosti
Modelování pomocí vzorů
Funkcionální modelování
XML Schema
XML Schema - základní zdroje informací
XML Schema - motivace
XML Schema - hlavička definice schématu
XML Schema - přiřazení typu elementu s daným názvem
XML Schema - definice jednoduchého typu
XML Schema - definice jednoduchého typu - příklad 1
XML Schema - definice jednoduchého typu - příklad 2
XML Schema - jednoduché typy - "union"
XML Schema - jednoduché typy - seznam hodnot
XML Schema - definice složeného typu
XML Schema - definice složeného typu - skupiny
XML Schema - definice složeného typu - skupiny atributů
XML Schema - použití skupin
XML Schema - kompozitor "sequence"
XML Schema - kompozitor "choice"
XML Schema - kompozitor "all"
XML Schema - jednoduchý obsah elementu
XML Schema - smíšený obsah elementu
XML Schema - další možnosti
XML Schema - anotace schémat
XML Schema - znovupoužití definice schématu
XML Schema - abstraktní a konečné typy
XML Schema - jmenné prostory
XML Schema - nespecifikované elementy a atributy
XML Schema - odkaz na definici schématu
Relax NG
Relax NG - motivace
Relax NG - základní zdroje informací
Jazyky schémat používající vzory
Schematron
Examplotron
Ostatní jazyky schémat
DSD 2.0
Vyjadřovací síla těchto modelů, jejich nedostatky
Nástroje na validaci XML dat modelovaných podle těchto standardů

Cíle a charakteristiky jazyků schémat

Cíle modelování XML dat

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(!)

Přístupy k modelování XML dat

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

Kategorie jazyků schemat

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

Modelování pomocí gramatik

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.

Modelování pomocí dědičnosti

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“).

Modelování pomocí vzorů

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.

Funkcionální modelování

Funkcionální modelování

XML Schema

XML Schema - základní zdroje informací

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

XML Schema - motivace

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

XML Schema - hlavička definice schématu

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
   .../...
</xs:schema> 

XML Schema - přiřazení typu elementu s daným názvem

<xs:element name="element_name">
   ... definice typu - je přímo zde - tzv. "local" nebo daná odkazem - tzv. "global"
</xs:element>

XML Schema - definice jednoduchého typu

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

XML Schema - definice jednoduchého typu - příklad 1

Restrikce délky obsahu

<xs:simpleType name="nameType">
   <xs:restriction base="xs:string">
      <xs:maxLength value="32"/>
   </xs:restriction>
</xs:simpleType> 

XML Schema - definice jednoduchého typu - příklad 2

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> 

XML Schema - jednoduché typy - "union"

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> 

XML Schema - jednoduché typy - seznam hodnot

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> 

XML Schema - definice složeného typu

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

XML Schema - definice složeného typu - skupiny

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>

XML Schema - definice složeného typu - skupiny atributů

Skupina atributů:

<xs:attributeGroup name="AttributesGroupName">
   <xs:attribute ... use="required"/> 
   ...
</xs:attributeGroup>

Může být uvedena povinnost výskytu (use=required)

XML Schema - použití skupin

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> 

XML Schema - kompozitor "sequence"

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>

XML Schema - kompozitor "choice"

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> 

XML Schema - kompozitor "all"

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> 

XML Schema - jednoduchý obsah elementu

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>  

XML Schema - smíšený obsah elementu

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> 

XML Schema - další možnosti

Možnost specifikace integritních omezení:hodnota je jedinečná - xs:uniquehodnota je klíčem - xs:keyhodnota je odkazem na klíč - xs:keyref

XML Schema - anotace schémat

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> 

XML Schema - znovupoužití definice schématu

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> 

XML Schema - abstraktní a konečné typy

abstract - nelze instanciovat, pouze jako zákad k odvozování dědičností

final - nelze rozšiřovat/odvozovat dědičností

XML Schema - jmenné prostory

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> 

XML Schema - nespecifikované elementy a atributy

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

XML Schema - odkaz na definici schématu

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

Relax NG

Relax NG - motivace

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

  • Dále viz http://www.xml.com/lpt/a/2002/01/23/relaxng.html

Relax NG - základní zdroje informací

Vznikl z RELAXu při skupině OASIS-OPEN:

Jazyky schémat používající vzory

Ostatní jazyky schémat

DSD 2.0

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

Vyjadřovací síla těchto modelů, jejich nedostatky

viz http://www.xml.com/lpt/a/2001/12/12/schemacompare.html

Nástroje na validaci XML dat modelovaných podle těchto standardů

Nástroje na validaci XML dat modelovaných podle těchto standardů