XML Schema Motywacja, struktura schematu, typy złożone Patryk Czarnik Instytut Informatyki UW XML i nowoczesne technologie zarzadzania treścia 2007/08 Dlaczego nie DTD? Zastosowania XML-a w elektronicznej wymianie danych: przeniesienie zadania sprawdzania poprawności z tworzonej aplikacji na narzędzie walidujace daje spore oszczędności, 60% tworzonego kodu dotyczy weryfikacji poprawności danych. Roger L. Costello, XML Schema Tutorial Cechy DTD: niemal brak kontroli nad tekstowa zawartościa elementów i wartościami atrybutów, bardzo ogólne metody definiowania częstości wystapień.
Porównanie DTD i XML Schema DTD pochodzacy z SGML specyficzna składnia 10 typów danych brak kontroli tekstowej zawartości elementów niewielka dla atrybutów modularność tylko na poziomie tekstu DTD (encje parametryczne) XML Schema zaprojektowany dla XML składnia XML 44 wbudowane typy proste zaawansowana kontrola tekstowej zawartości elementów i atrybutów modularność na poziomie pojęć abstrakcyjnych (własne typy zawartości, grupy, import) Status XML Schema 15 lutego 1999: Dokument W3C opisujacy wymagania. 2 maja 2001: XML Schema oficjalna rekomendacja W3C: XML Schema Part 0: Primer, XML Schema Part 1: Structures, XML Schema Part 2: Datatypes. Obecnie prace nad wersj a 1.1 XML Schema (status: working draft).
Prosty przykład schematu <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="osoba"> <xs:complextype> <xs:element name="imię" type="xs:string" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> <xs:attribute name="wiek" type="xs:positiveinteger" use="optional"/> </xs:schema> element główny schematu przestrzeń nazw XML Schema deklaracja elementu (globalna) deklaracja elementu (lokalna) określenie liczności elementów deklaracja atrybutu określenie (nie)obowiazkowości atrybutu Typy w XML Schema Elementy i atrybuty maja w schemacie określony typ zawartości. Typy zwn. zasięg definicji: nazwane, anonimowe. Typy zwn. pochodzenie: predefiniowane (przez standard), definiowane w schemacie. Typy zwn. zawartość: proste, złożone, o zawartości: pustej, prostej, elementowej (złożonej), mieszanej.
Typy nazwane i anonimowe Typy nazwane <xs:complextype name="osobatyp"> <xs:element name="imię" type="xs:string"/> </xs:sequence> <xs:element name="osoba" type="osobatyp"/> Typy anonimowe <xs:element name="osoba"> <xs:complextype> <xs:element name="imię" type="xs:string"/> </xs:sequence> Typy nazwane i anonimowe kiedy stosować? Typy nazwane ten sam typ stosowany dla wielu elementów / atrybutów, typ stanowi podstawę zawężeń / rozszerzeń, także w potencjalnych przyszłych rozszerzeniach schematu! Typy anonimowe typ występujacy tylko w jednym miejscu schematu, nie stanowiacy podstawy dla innego typu.
Deklaracje globalne i lokalne Deklaracje globalne <xs:element name="imię" type="xs:string"/> <xs:complextype name="osobatyp"> <xs:element ref="imię" maxoccurs="3"/> <xs:element ref="nazwisko"/> </xs:sequence> Deklaracje lokalne <xs:complextype name="osobatyp"> <xs:element name="imię" maxoccurs="3" type="xs:string"/> </xs:sequence> Deklaracje globalne i lokalne kiedy stosować? Deklaracje globalne element (atrybut) występujacy w wielu miejscach schematu z tym samym typem zawartości, także w potencjalnych przyszłych rozszerzeniach schematu! Deklaracje lokalne element (atrybut) tylko w jednym miejscu schematu, w różnych miejscach z różnym typem zawartości...
Deklaracje lokalne z różnym typem zawartości możliwość użycia tej samej nazwy dla różnych (semantycznie i strukturalnie) elementów i atrybutów, naturalne w przypadku atrybutów, mylace w przypadku elementów używać z rozsadkiem. Przykład <xs:element name="a"> <xs:complextype> <xs:element name="c" type="xs:positiveinteger"/> </xs:sequence> <xs:element name="b"> <xs:complextype> <xs:element name="c" type="xs:negativeinteger"/> </xs:sequence> <a><c>12</c></a> <b><c>-9</c></b> Typy złożone i proste Typ złożony <xs:complextype name="osobatyp"> <xs:element name="imię" type="xs:string"/> </xs:sequence> <xs:element name="osoba" type="osobatyp"/> Typ prosty <xs:simpletype name="plectyp"> <xs:restriction base="xs:string"> <xs:enumeration value="k"/> <xs:enumeration value="m"/> </xs:restriction> </xs:simpletype> <xs:attribute name="płeć" type="plectyp"/>
Typy proste i złożone kiedy używać? Typy złożone struktura (podelementy, atrybuty), odpowiednie dla elementów. Typy proste zawartość tekstowa, odpowiednie dla atrybutów i elementów, wiele typów predefiniowanych, możliwość definiowania własnych typów. Typy złożone rodzaje zawartości Zawartość elementowa: <osoba PESEL="12345678901"> <imię>jan</imię> <nazwisko>kowalski</nazwisko> </osoba> Zawartość pusta: <osoba PESEL="12345678901"/> Zawartość prosta: <masa jm="kg">10.55</masa> Zawartość mieszana: <treść>w <j>pascalu</j> przypisanie ma postać <kod>x := 5</kod>, natomiast w <j>c</j> <kod>x = 5</kod>.</treść>
Definiowanie zawartości elementowej Grupy deklaracji (model groups) sequence, choice, all. Zagnieżdżanie grup sequence i choice <xs:complextype name="osobatyp"> <xs:choice> <xs:element name="imię" type="xs:string"/> </xs:sequence> <xs:element name="pseudonim" type="xs:string"/> </xs:choice> Liczność wystapień Atrybuty minoccurs i maxoccurs. Dla podelementów oraz grup. Wartość unbounded dla maxoccurs. Domyślna liczność: dokładnie 1. Sztuczny przykład <xs:complextype name="dwieosobytyp"> <xs:choice minoccurs="2"> <xs:element name="imię" type="xs:string" minoccurs="0" maxoccurs="3"/> </xs:sequence> <xs:element name="pseudonim" type="xs:string"/> </xs:choice>
Modele (nie)deterministyczne Model niejednoznaczny: Nawet znajac cały dokument nie jesteśmy w stanie wskazać które deklaracje w schemacie odpowiadaja elementom w dokumencie. (a,a)* (a,a,a)* Model niedeterministyczny: Czytajac dokument od poczatku gdy pojawia się pewien znacznik otwierajacy nie jesteśmy w stanie wskazać która deklaracja w schemacie odpowiada bieżacemu elementowi w dokumencie (bez czytania dalej dokumentu). (a,a?,a?) (a,b)+,a? Modele definiowane w XML Schema musza być deterministyczne: Czytajac dowolny dokument od poczatku gdy pojawia się pewien znacznik otwierajacy jesteśmy w stanie wskazać która deklaracja w schemacie odpowiada bieżacemu elementowi w dokumencie (bez czytania dalej dokumentu). (a,(a,a?)?) Grupa all Wszystkie podelementy w dowolnej kolejności. maxoccurs podelementów <= 1. Brak udziału w zagnieżdżeniach. Przykład <xs:complextype name="daneosobowetyp"> <xs:all> <xs:element name="pesel" type="peseltyp"/> <xs:element name="dowód" type="dowódtyp"/> <xs:element name="paszport" type="paszporttyp" minoccurs="0"/> </xs:all>
Nazwane grupy elementów <xs:group name="współrzędne"> <xs:element name="x" type="xs:double"/> <xs:element name="y" type="xs:double"/> </xs:sequence> </xs:group> <xs:element name="punkt"> <xs:complextype> <xs:group ref="współrzędne"/> </xs:sequence> <xs:element name="koło"> <xs:complextype> <xs:group ref="współrzędne"/> <xs:element name="r" type="xs:double"/> </xs:sequence> Deklaracje atrybutów Deklaracje globalne i lokalne. W definicji typu złożonego za określeniem typu zawartości. Przykład <xs:attribute name="nr" type="positiveinteger"/> <xs:complextype name="osobatyp">... </xs:sequence> <xs:attribute name="pesel" type="peseltyp"/> <xs:attribute name="płeć"> <xs:simpletype>... </xs:simpletype> </xs:attribute> <xs:attribute ref="nr"/>
Obowiazkowość i wartości domyślne use required, optional, prohibited. default lub fixed wartość domyślna lub ustalona. Przykład <xs:complextype name="osobatyp">... </xs:sequence> <xs:attribute name="pesel" type="peseltyp" use="required"/> <xs:attribute name="płeć" default="k"> <xs:simpletype>... </xs:simpletype> </xs:attribute> <xs:attribute ref="nr" fixed="123"/> Nazwane grupy atrybutów <xs:attributegroup name="atrybuty-krawędzi"> <xs:attribute name="kolor-krawędzi" type="kolortyp"/> <xs:attribute name="grubość-krawędzi" type="xs:positiveinteger"/> </xs:attributegroup> <xs:attributegroup name="atrybuty-powierzchni"> <xs:attribute name="kolor-powierzchni" type="kolortyp"/> </xs:attributegroup> <xs:element name="koło"> <xs:complextype>... </xs:sequence> <xs:attributegroup ref="atrybuty-krawędzi"/> <xs:attributegroup ref="atrybuty-powierzchni"/> <xs:element name="odcinek"> <xs:complextype>... </xs:sequence> <xs:attributegroup ref="atrybuty-krawędzi"/>
Elementy czy atrtybuty? Przesłanki strukturalne Elementy konieczne gdy: liczność większa od 1, wewnętrzna struktura (podelemety), także w potencjalnych przyszłych rozszerzeniach schematu! Zalety atrybutów: zwięzłość zapisu, wartości domyślne, w DTD dostępne typy zawartości NMTOKEN, ID, IDREF (w XML Schema bez znaczenia). Elementy czy atrtybuty? Przesłanki semantyczne Informacje modelowane zwykle w elementach: zawartość (elementy semantyczne, np. nazwisko, nazwa leku, adres), struktura (np. rozdział, akapit, tytuł, lista), wyszukiwanie (np. termin do indeksu, glosariusza, a także elementy dedykowane), odesłania (np. hiperlinki, noty, przypisy). Informacje modelowane zwykle w atrybutach: metainformacje (np. jednostka miary, waluta, język, priorytet), identyfikatory wartości i odwołania do nich.
Typy złożone rodzaje zawartości Zawartość elementowa: <osoba PESEL="12345678901"> <imię>jan</imię> <nazwisko>kowalski</nazwisko> </osoba> Zawartość pusta: <osoba PESEL="12345678901"/> Zawartość prosta: <masa jm="kg">10.55</masa> Zawartość mieszana: <treść>w <j>pascalu</j> przypisanie ma postać <kod>x := 5</kod>, natomiast w <j>c</j> <kod>x = 5</kod>.</treść> Definiowanie zawartości pustej Schemat <xs:complextype name="osobatyp"> <xs:attribute name="pesel" type="peseltyp"/> Dokument <osoba PESEL="12345678901"/> <masa jm="kg">10.55</masa> <treść>w <j>pascalu</j> przypisanie ma postać <kod>x := 5</kod>, natomiast w <j>c</j> <kod>x = 5</kod>.</treść>
Definiowanie zawartości prostej Schemat <xs:complextype name="masatyp"> <xs:simplecontent> <xs:extension base="xs:decimal"> <xs:attribute name="jm" type="xs:string"/> </xs:extension> </xs:simplecontent> Dokument <masa jm="kg">10.55</masa> Definiowanie zawartości mieszanej (1) Ważna liczność i kolejność <xs:complextype name="zamówienietyp" mixed="true"> <xs:element ref="towar" maxoccurs="unbounded"/> <xs:element ref="adres" /> </xs:choice> Dokument <zamówienie> Zamawiam <towar>pączka</towar> i <towar>kawę</towar>. Proszę przysłać na <adres>banacha 2</adres>. </zamówienie>
Definiowanie zawartości mieszanej (2) Jak w DTD <xs:complextype name="tresctyp" mixed="true"> <xs:choice maxoccurs="unbounded"> <xs:element name="j" type="xs:string"/> <xs:element name="kod" type="xs:string"/> </xs:choice> Dokument <treść>w <j>pascalu</j> przypisanie ma postać <kod>x := 5</kod>, natomiast w <j>c</j> <kod>x = 5</kod>.</treść> ID i IDREF Typy atrybutów w DTD, dostępne także w XML Schema. ID: nazwa w sensie XML, żaden inny atrybut o typie ID nie może mieć tej samej wartości, IDREF: jakiś atrybut o typie ID w dokumencie musi mieć równa wartość. Ograniczenia: tylko nazwy (w szczególności nie numery), jedna przestrzeń identyfikatorów dla wszystkich elementów, tylko atrybuty.
Klucze i referencje Więzy integralności (identity constraints) w XML Schema: unique wartości w ramach określonego zakresu unikatowe, key wartości w ramach określonego zakresu unikatowe i niepuste, keyref odwołanie do wartości wskazanego klucza. Zalety w porównaniu z atrybutami typu ID / IDREF: dowolny typ zawartości (nie tylko nazwa), możliwych wiele niezależnych od siebie ograniczeń, odwołanie do konkretnego klucza, kombinacje wartości (krotki), kontrolowane zawartości elementów, nie tylko atrybutów. Klucze i referencje <xsd:element name="zamówienia-i-faktury" type="zamówieniafakturytyp"> <xsd:unique name="fakturaid"> <xsd:selector xpath="faktury/faktura"/> <xsd:field xpath="@nr"/> <xsd:field xpath="rok"/> </xsd:unique> <xsd:keyref name="zamówienieref" refer="zamówienieid"> <xsd:selector xpath="faktury/faktura/do-zamówienia"/> <xsd:field xpath="@nr"/> </xsd:keyref> <xsd:key name="zamówienieid"> <xsd:selector xpath="zamówienia/zamówienie"/> <xsd:field xpath="numer"/> </xsd:key> </xsd:element>