XML SHEMA
opracowany przez W3C standard służący do definiowania struktury dokumentu XML. XML Schema uważane jest za następcę DTD, posiada bowiem znacznie większe możliwości.
XML Schema jest aplikacją XML, w odróżnieniu od DTD nie będącego częścią standardu XML. Dokumenty zawierające definicje XML Schema zapisuje się zwykle w plikach z rozszerzeniem .xsd (od XML Schema Definition).
XSD jest potężniejszym narzędziem niż DTD - zdefiniowano w nim kilkanaście podstawowych typów, których DTD w ogóle nie posiadał np.: xs:anyURI, xs:PositiveInteger, xs:date, możemy sami także nakładać na dowolne typy restrykcje(np.: zawężając ciągi znaków do długości 100 bajtów, ograniczając liczby xs:float do 100 etc.), XSD posiada także mechanizm wyrażeń regularnych.
Przykładowy schemat xml:
Napiszmy schemat XSD zawierający definicje takiego dokumentu:
<?xml version="1.0" encoding="ISO-8859-2"?>
<baza>
<osoba>
<imie>Łukasz</imie>
<imie>Jerzy</imie>
<imie>Izydor</imie>
<nazwisko>Nowak</nazwisko>
<data_ur>1950-03-07</data_ur>
<miejsce_ur>Warszawa</miejsce_ur>
<info>szlachcic</info>
</osoba>
</baza>
Dołączmy najpierw schemat do naszego dokumentu. Robi się to poprzez modyfikację głównego znacznika - w naszym przypadku baza:
<baza xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="baza.xsd">
Tworzymy więc plik o nazwie baza.xsd. Podobnie jak dla dokumentu XML w pierwszej linii wstawiamy:
Tak jak już było powiedziane wcześniej XSD jest w pełni strukturalny i bazuje także na znacznikach XML. Otwieramy więc główny znacznik naszego schematu:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
[tu zamieścimy nasze definicje, musimy pamiętać aby zamknąć ten tag,
najlepiej zrobić to od razu]
</xs:schema>
Zacznijmy od zdefiniowania naszego głównego elementu - <baza>:
<xs:element name="baza" type="baza-type"/>
Zadeklarowaliśmy więc element <baza>, który jest typu "baza-type". "Baza-type" wygląda następująco:
<xs:complexType name="baza-type">
<xs:sequence>
<xs:element name="osoba" type="osoba-type" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
"Baza-type" jest sekwencją nieograniczonej ilości wystąpień(unbounded) elementu <osoba> typu "osoba-type". (o sekwencjach będzie mowa jeszcze dalej, w innej części kursu)
Element <osoba> deklarujemy następująco:
<xs:element name="osoba" type="osoba-type"/>
A typ "osoba-type" jako sekwencję elementów: <imie>, <nazwisko>, <data_ur>, <miejsce_ur>, <info> tak:
<xs:complexType name="osoba-type">
<xs:element ref="imie" maxOccurs="unbounded"/>
<xs:element ref="nazwisko"/>
<xs:element ref="data_ur"/>
<xs:element ref="miejsce_ur"/>
<xs:element ref="info"/>
Zamiast tak jak poprzednio pisać <xs:element name="info" type="xs:string"> napisałem <xs:element ref="info"/> - czyli umieściłem referencje do elemntu <info>, który jest zadeklarowany w innej części schematu XSD.
Teraz wystarczy zdefiniować elementy: <imie>, <nazwisko>, <data_ur>, <miejsce_ur>, <info>. Znaczniki te są już zwykłymi prostymi typami(nie zawierają innych elementów), definiujemy je wprost:
<xs:element name="data_ur" type="xs:date"/>
<xs:element name="info" type="xs:string"/>
<xs:element name="miejsce_ur" type="xs:string"/>
<xs:element name="nazwisko" type="xs:string"/>
<xs:element name="imie" type="xs:string"/>
Dla porządku przedstawiam pełny schemat naszego dokumentu XSD:
<!-- deklaracja znaczników -->
<!-- definicje typów złożonych -->
XSD w przeciwieństwie do DTD posiada mnóstwo podstawowych typów, używa się ich np. tak:
typy łańcuchowe:
typ
opis
xs:string
łańcuch znaków
xs:normalizedString
łańcuch znaków bez tabulacji, nowych linii
xs:token
łańcuch znaków bez tabulacji, nowych linii oraz pustych spacji
xs:language
język według skrótów ISO np.: pl lub PL
xs:anyURI
typ do przechowywania URI włącznie ze znakami?, &, ~
xs:hexBinary
binaria(lub zwykły tekst) zakodowane szesnastkowo
xs:base64Binary
binaria(lub tekst) zakodowane systemu base_64
typy zmiennoprzecinkowe:
xs:float
liczba zmiennoprzecinkowa 12.1212, 10E-12
xs:double
liczba zmiennoprzecinkowa podwójne precyzji
typ stałoprzecinkowy:
xs:decimal
liczba w zapisie dziesiętnym, np.: -1212.12,+.1212, 12.0
typy całkowite:
xs:integer
liczba całkowita, np.: -121212, +000121212
xs:positiveInteger
nieujemna liczba całkowita
xs:negativeInteger
ujemna liczba całkowita
xs:byte
bajt, liczba 8 bitowa
xs:short
krótka liczba całkowita, 16 bitowa
xs:int
liczba całkowita, 32 bitowa
xs:long
długa liczba całkowita, 64 bitowa
xs:boolean
wartość logiczna 1(true) lub 0(false)
typy czasu i daty:
xs:dateTime
wyświetlanie daty i czasu w formacie: YYYY-MM-DDThh:mm:ss (po literze T podajemy czas) np.: 2003-07-03T23:12:00 Można także powyższą datę podać dla innej strefy jako np.: 2003-07-03T23:12:00 -02:00(czyli dwie godziny wcześniej)
xs:date
podanie samej daty jako YYYY-MM-DD
xs:time
podanie samej godziny jako hh:mm:ss
Talent