XML Schema
Motywacja, struktura schematu, typy zło˙zone
Patryk Czarnik
Instytut Informatyki UW
XML i nowoczesne technologie zarz ˛
adzania tre´sci ˛
a –
2007/08
Dlaczego nie DTD?
I
Zastosowania XML-a w elektronicznej wymianie danych:
I
przeniesienie zadania sprawdzania poprawno´sci z
tworzonej aplikacji na narz ˛edzie waliduj ˛
ace daje spore
oszcz ˛edno´sci,
I
60% tworzonego kodu dotyczy weryfikacji poprawno´sci
danych.
Roger L. Costello, XML Schema Tutorial
I
Cechy DTD:
I
niemal brak kontroli nad tekstow ˛
a zawarto´sci ˛
a elementów
i warto´sciami atrybutów,
I
bardzo ogólne metody definiowania cz ˛esto´sci wyst ˛
apie ´n.
Porównanie DTD i XML Schema
DTD
I
pochodz ˛
acy z SGML
I
specyficzna składnia
I
10 typów danych
I
brak kontroli tekstowej
zawarto´sci elementów
niewielka dla atrybutów
I
modularno´s´c tylko na
poziomie tekstu DTD
(encje parametryczne)
XML Schema
I
zaprojektowany dla XML
I
składnia XML
I
44 wbudowane typy proste
I
zaawansowana kontrola
tekstowej zawarto´sci
elementów i atrybutów
I
modularno´s´c na poziomie
poj ˛e´c abstrakcyjnych
(własne typy zawarto´sci,
grupy, import)
Status XML Schema
I
15 lutego 1999: Dokument W3C opisuj ˛
acy wymagania.
I
2 maja 2001: XML Schema oficjaln ˛
a rekomendacj ˛
a W3C:
I
XML Schema Part 0: Primer,
I
XML Schema Part 1: Structures,
I
XML Schema Part 2: Datatypes.
I
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:sequence>
<xs:element name="imi˛
e" type="xs:string"
minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
<xs:attribute name="wiek" type="xs:positiveInteger"
use="optional"/>
</xs:complexType>
</xs:element>
</
xs:schema
>
I
element główny schematu
I
przestrze ´n nazw XML Schema
I
deklaracja elementu (globalna)
I
deklaracja elementu (lokalna)
I
okre´slenie liczno´sci elementów
I
deklaracja atrybutu
I
okre´slenie (nie)obowi ˛
azkowo´sci atrybutu
Typy w XML Schema
I
Elementy i atrybuty maj ˛
a w schemacie okre´slony
typ
zawarto ´sci.
I
Typy zwn. zasi ˛eg definicji:
I
nazwane,
I
anonimowe.
I
Typy zwn. pochodzenie:
I
predefiniowane (przez standard),
I
definiowane w schemacie.
I
Typy zwn. zawarto´s´c:
I
proste,
I
zło˙zone, o zawarto´sci:
I
pustej,
I
prostej,
I
elementowej (zło˙zonej),
I
mieszanej.
Typy nazwane i anonimowe
Typy nazwane
<xs:complexType name="OsobaTyp">
<xs:sequence>
<xs:element name="imi˛
e" type="xs:string"/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="osoba"
type="OsobaTyp"
/>
Typy anonimowe
<xs:element name="osoba">
<xs:complexType>
<xs:sequence>
<xs:element name="imi˛
e" type="xs:string"/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Typy nazwane i anonimowe – kiedy stosowa´c?
Typy nazwane
I
ten sam typ stosowany dla wielu elementów / atrybutów,
I
typ stanowi podstaw ˛e zaw ˛e˙ze ´n / rozszerze ´n,
I
tak˙ze w potencjalnych przyszłych rozszerzeniach
schematu!
Typy anonimowe
I
typ wyst ˛epuj ˛
acy tylko w jednym miejscu schematu,
I
nie stanowi ˛
acy podstawy dla innego typu.
Deklaracje globalne i lokalne
Deklaracje globalne
<
xs:element
name="
imi˛
e
" type="xs:string"/>
<
xs:element
name="
nazwisko
" type="xs:string"/>
<xs:complexType name="OsobaTyp">
<xs:sequence>
<xs:element
ref
="
imi˛
e
" maxOccurs="3"/>
<xs:element
ref
="
nazwisko
"/>
</xs:sequence> </xs:complexType>
</xs:element>
Deklaracje lokalne
<xs:complexType name="OsobaTyp">
<xs:sequence>
<
xs:element name
="
imi˛
e
" maxOccurs="3" type="xs:string"/>
<
xs:element name
="
nazwisko
" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Deklaracje globalne i lokalne – kiedy stosowa´c?
Deklaracje globalne
I
element (atrybut) wyst ˛epuj ˛
acy w wielu miejscach schematu
z tym samym typem zawarto´sci,
I
tak˙ze w potencjalnych przyszłych rozszerzeniach
schematu!
Deklaracje lokalne
I
element (atrybut) tylko w jednym miejscu schematu,
I
w ró˙znych miejscach z ró˙znym typem zawarto´sci. . .
Deklaracje lokalne z ró˙znym typem zawarto´sci
I
mo˙zliwo´s´c u˙zycia tej samej nazwy dla ró˙znych
(semantycznie i strukturalnie) elementów i atrybutów,
I
naturalne w przypadku atrybutów,
I
myl ˛
ace w przypadku elementów – u˙zywa´c z rozs ˛
adkiem.
Przykład
<xs:element name="a">
<xs:complexType> <xs:sequence>
<xs:element name="c" type="xs:positiveInteger"/>
</xs:sequence> </xs:complexType>
</xs:element>
<xs:element name="b">
<xs:complexType> <xs:sequence>
<xs:element name="c" type="xs:negativeInteger"/>
</xs:sequence> </xs:complexType>
</xs:element>
<a><c>12</c></a>
<b><c>-9</c></b>
Typy zło˙zone i proste
Typ zło˙zony
<xs:
complexType
name="OsobaTyp">
<xs:sequence>
<xs:element name="imi˛
e" type="xs:string"/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
</xs:
complexType
>
<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:element name="nazwisko" type="
xs:string
"/>
<xs:attribute name="płe´
c" type="
PlecTyp
"/>
Typy proste i zło˙zone – kiedy u˙zywa´c?
Typy zło˙zone
I
struktura (podelementy, atrybuty),
I
odpowiednie dla elementów.
Typy proste
I
zawarto´s´c tekstowa,
I
odpowiednie dla atrybutów i elementów,
I
wiele typów predefiniowanych,
I
mo˙zliwo´s´c definiowania własnych typów.
Typy zło˙zone – rodzaje zawarto´sci
I
Zawarto´s´c elementowa:
<osoba PESEL="12345678901">
<imi˛
e>Jan</imi˛
e>
<nazwisko>Kowalski</nazwisko>
</osoba>
I
Zawarto´s´c pusta:
<osoba PESEL="12345678901"/>
I
Zawarto´s´c prosta:
<masa jm="kg">10.55</masa>
I
Zawarto´s´c mieszana:
<tre´
s´
c>W <j>Pascalu</j> przypisanie ma posta´
c <kod>x := 5</kod>,
natomiast w <j>C</j> <kod>x = 5</kod>.</tre´
s´
c>
Definiowanie zawarto´sci elementowej
Grupy deklaracji (model groups)
I
sequence,
I
choice,
I
all.
Zagnie˙zd˙zanie grup sequence i choice
<xs:complexType name="OsobaTyp">
<xs:choice>
<xs:sequence>
<xs:element name="imi˛
e" type="xs:string"/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
<xs:element name="pseudonim" type="xs:string"/>
</xs:choice>
</xs:complexType>
Liczno´s´c wyst ˛
apie ´n
I
Atrybuty minOccurs i maxOccurs.
I
Dla podelementów oraz grup.
I
Warto´s´c unbounded dla maxOccurs.
I
Domy´slna liczno´s´c: dokładnie
1.
Sztuczny przykład
<xs:complexType name="DwieOsobyTyp">
<xs:choice
minOccurs="2"
>
<xs:sequence>
<xs:element name="imi˛
e" type="xs:string"
minOccurs="0" maxOccurs="3"
/>
<xs:element name="nazwisko" type="xs:string"/>
</xs:sequence>
<xs:element name="pseudonim" type="xs:string"/>
</xs:choice>
</xs:complexType>
Modele (nie)deterministyczne
I
Model niejednoznaczny:
Nawet znaj ˛
ac cały dokument nie jeste´smy w stanie wskaza´c które deklaracje
w schemacie odpowiadaj ˛
a elementom w dokumencie.
(a,a)*|(a,a,a)*
I
Model niedeterministyczny:
Czytaj ˛
ac dokument od pocz ˛
atku gdy pojawia si ˛e pewien znacznik otwieraj ˛
acy
nie jeste´smy w stanie wskaza´c która deklaracja w schemacie odpowiada
bie˙z ˛
acemu elementowi w dokumencie (bez czytania dalej dokumentu).
(a,a?,a?)
(a,b)+,a?
I
Modele definiowane w XML Schema musz ˛
a by´c
deterministyczne:
Czytaj ˛
ac dowolny dokument od pocz ˛
atku gdy pojawia si ˛e pewien znacznik
otwieraj ˛
acy jeste´smy w stanie wskaza´c która deklaracja w schemacie odpowiada
bie˙z ˛
acemu elementowi w dokumencie (bez czytania dalej dokumentu).
(a,(a,a?)?)
Grupa all
I
Wszystkie podelementy w dowolnej kolejno´sci.
I
maxOccurs
podelementów <= 1.
I
Brak udziału w zagnie˙zd˙zeniach.
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>
</xs:complexType>
Nazwane grupy elementów
<xs:
group name="współrz˛
edne"
>
<xs:sequence>
<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:sequence>
<xs:
group ref="współrz˛
edne"
/>
</xs:sequence> </xs:complexType>
</xs:element>
<xs:element name="koło">
<xs:complexType> <xs:sequence>
<xs:
group ref="współrz˛
edne"
/>
<xs:element name="r" type="xs:double"/>
</xs:sequence> </xs:complexType>
</xs:element>
Deklaracje atrybutów
I
Deklaracje globalne i lokalne.
I
W definicji typu zło˙zonego za okre´sleniem typu zawarto´sci.
Przykład
<xs:attribute name="nr" type="positiveInteger"/>
<xs:complexType name="OsobaTyp">
<xs:sequence> ... </xs:sequence>
<xs:attribute name="pesel" type="PeselTyp"/>
<xs:attribute name="płe´
c">
<xs:simpleType> ... </xs:simpleType>
</xs:attribute>
<xs:attribute ref="nr"/>
</xs:complexType>
Obowi ˛
azkowo´s´c i warto´sci domy´slne
I
use – required, optional, prohibited.
I
default lub fixed – warto´s´c domy´slna lub ustalona.
Przykład
<xs:complexType name="OsobaTyp">
<xs:sequence> ... </xs:sequence>
<xs:attribute name="pesel" type="PeselTyp"
use="required"
/>
<xs:attribute name="płe´
c"
default="k"
>
<xs:simpleType> ... </xs:simpleType>
</xs:attribute>
<xs:attribute ref="nr"
fixed="123"
/>
</xs:complexType>
Nazwane grupy atrybutów
<
xs:attributeGroup name="atrybuty-kraw˛
edzi
">
<xs:attribute name="kolor-kraw˛
edzi" type="KolorTyp"/>
<xs:attribute name="grubo´
s´
c-kraw˛
edzi" 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:sequence>
<xs:
attributeGroup ref="atrybuty-kraw˛
edzi"
/>
<xs:
attributeGroup ref="atrybuty-powierzchni
"/>
</xs:complexType>
</xs:element>
<xs:element name="odcinek">
<xs:complexType> <xs:sequence> ... </xs:sequence>
<xs:
attributeGroup ref="atrybuty-kraw˛
edzi"
/>
</xs:complexType>
</xs:element>
Elementy czy atrtybuty?
Przesłanki strukturalne
I
Elementy konieczne gdy:
I
liczno´s´c wi ˛eksza od 1,
I
wewn ˛etrzna struktura (podelemety),
I
tak˙ze w potencjalnych przyszłych rozszerzeniach
schematu!
I
Zalety atrybutów:
I
zwi ˛ezło´s´c zapisu,
I
warto´sci domy´slne,
I
w DTD dost ˛epne typy zawarto´sci NMTOKEN, ID, IDREF
(w XML Schema bez znaczenia).
Elementy czy atrtybuty?
Przesłanki semantyczne
I
Informacje modelowane zwykle w elementach:
I
zawarto´s´c (elementy semantyczne, np. nazwisko, nazwa
leku, adres),
I
struktura (np. rozdział, akapit, tytuł, lista),
I
wyszukiwanie (np. termin do indeksu, glosariusza, a tak˙ze
elementy dedykowane),
I
odesłania (np. hiperlinki, noty, przypisy).
I
Informacje modelowane zwykle w atrybutach:
I
metainformacje (np. jednostka miary, waluta, j ˛ezyk,
priorytet),
I
identyfikatory warto´sci i odwołania do nich.
Typy zło˙zone – rodzaje zawarto´sci
I
Zawarto´s´c elementowa:
<osoba PESEL="12345678901">
<imi˛
e>Jan</imi˛
e>
<nazwisko>Kowalski</nazwisko>
</osoba>
I
Zawarto´s´c pusta:
<osoba PESEL="12345678901"/>
I
Zawarto´s´c prosta:
<masa jm="kg">10.55</masa>
I
Zawarto´s´c mieszana:
<tre´
s´
c>W <j>Pascalu</j> przypisanie ma posta´
c <kod>x := 5</kod>,
natomiast w <j>C</j> <kod>x = 5</kod>.</tre´
s´
c>
Definiowanie zawarto´sci pustej
Schemat
<xs:complexType name="OsobaTyp">
<xs:attribute name="PESEL" type="PESELTyp"/>
</xs:complexType>
Dokument
<osoba PESEL="12345678901"/>
<masa jm="kg">10.55</masa>
<tre´
s´
c>W <j>Pascalu</j> przypisanie ma posta´
c <kod>x := 5</kod>,
natomiast w <j>C</j> <kod>x = 5</kod>.</tre´
s´
c>
Definiowanie zawarto´sci prostej
Schemat
<xs:complexType name="MasaTyp">
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="jm" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
Dokument
<masa jm="kg">10.55</masa>
Definiowanie zawarto´sci mieszanej (1)
Wa˙zna liczno´s´c i kolejno´s´c
<xs:complexType name="ZamówienieTyp"
mixed="true"
>
<xs:sequence>
<xs:element ref="towar" maxOccurs="unbounded"/>
<xs:element ref="adres" />
</xs:choice>
</xs:complexType>
Dokument
<zamówienie>
Zamawiam <towar>p ˛
aczka</towar> i <towar>kaw˛
e</towar>.
Prosz˛
e przysła´
c na <adres>Banacha 2</adres>.
</zamówienie>
Definiowanie zawarto´sci 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>
</xs:complexType>
Dokument
<tre´
s´
c>W <j>Pascalu</j> przypisanie ma posta´
c <kod>x := 5</kod>,
natomiast w <j>C</j> <kod>x = 5</kod>.</tre´
s´
c>
ID i IDREF
I
Typy atrybutów w DTD, dost ˛epne tak˙ze w XML Schema.
I
ID:
I
nazwa w sensie XML,
I
˙zaden inny atrybut o typie ID nie mo˙ze mie´c tej samej
warto´sci,
I
IDREF:
I
jaki´s atrybut o typie ID w dokumencie musi mie´c równ ˛
a
warto´s´c.
I
Ograniczenia:
I
tylko nazwy (w szczególno´sci nie numery),
I
jedna przestrze ´n identyfikatorów dla wszystkich elementów,
I
tylko atrybuty.
Klucze i referencje
I
Wi ˛ezy integralno´sci (identity constraints) w XML Schema:
I
unique – warto´sci w ramach okre´slonego zakresu
unikatowe,
I
key – warto´sci w ramach okre´slonego zakresu unikatowe
i niepuste,
I
keyref – odwołanie do warto´sci wskazanego klucza.
I
Zalety w porównaniu z atrybutami typu ID / IDREF:
I
dowolny typ zawarto´sci (nie tylko nazwa),
I
mo˙zliwych wiele niezale˙znych od siebie ogranicze ´n,
I
odwołanie do konkretnego klucza,
I
kombinacje warto´sci (krotki),
I
kontrolowane zawarto´sci 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>