Zaawansowana składnia XML XML Schema
Zaawansowana składnia XML Komentarz: <!-- komentarz --> Instrukcja przetwarzania: <?target processing-instruction-body?> Sekcja CDATA: <![CDATA[dowolny <tekst " nieprzetwarzany & przez [ parser]]> Odwołania do znaków: ¡ ¡ kody zgodne ze standardem ISO/IEC 10646.
Unicode Światowy standard kodowania narodowych znaków przy pomocy dwubajtowych par: podzbiór ISO/IEC 10646. Odmiany: UTF-7, UTF-8 (pierwsze 128 - ASCII), UTF-16. Obowiązkowy standard dla dokumentów XML: każde narzędzie XML-owe musi wspierać przynajmniej UTF-8.
Sekcje warunkowe Włączanie i wyłączanie fragmentów DTD: <![INCLUDE[ <!ELEMENT biogr (imie, nazwisko, data-ur, data-sm, opis)> ]]> <![IGNORE[ <!ELEMENT biogr (imienazw, data-ur, data-sm, opis)> ]]>
Sekcje warunkowe + encje parametryczne Zewnętrzny podzbiór DTD: <!ENTITY % ver1 "IGNORE"> <!ENTITY % ver2 "INCLUDE"> <![%ver2;[ <!ELEMENT biogr (imie, nazwisko, data-ur, data-sm, opis)> ]]> <![%ver1;[ <!ELEMENT biogr (imienazw, data-ur, data-sm, opis)> ]]> Dokument zgodny z wersją 1: <!DOCTYPE book SYSTEM "book.dtd" [ <!ENTITY % ver1 "INCLUDE"> <!ENTITY % ver2 "IGNORE"> ] <book> ... <imienazw>Szymon Zioło</imienazw> ... </book>
Dlaczego DTD nie wystarcza? Zastosowania w integracji aplikacji – struktury danych: przeniesienie zadania sprawdzania poprawności z tworzonej aplikacji na narzędzie walidujące daje spore oszczędności. 60% tworzonego kodu dotyczy weryfikacji poprawności danych. Roger L. Costello, XML Schema Tutorial Cechy DTD: jedynie podstawowa kontrola nad strukturą dokumentów, bardzo ogólne metody definiowania częstości wystąpień, mało "obiektowe", nierozszerzalne modele struktury. Taką kontrolę poprawności możemy oczywiście zaimplementować sami w kodzie naszej aplikacji (ewentualnie parametryzując aplikację przy pomocy atrybutów #FIXED), jest to jednak dość pracochłonne. Dobrze byłoby zrzucić walidację na parser XML. Standard XML Schema pozwala na definiowanie struktur dokumentów z dużo bardziej niż w DTD zaawansowaną kontrolą zawartości.
DTD – XML Schema Wywodzi się z SGML-a Zaprojektowany na potrzeby XML-a Specyficzna składnia Składnia XML 10 typów danych 41+ typów danych Brak kontroli tekstowej zawartości elementów Zaawansowana kontrola tekstowej zawartości elementów Typowy mieszany model zawartości Możliwość definiowania własnych typów danych.
Status XML Schema 15 lutego 1999: Dokument W3C opisujący wymagania stawiane przed nowym formatem: mechanizmy tworzenia struktury, typy proste, reguły przetwarzania. 2 maja 2001: XML Schema staje się oficjalną rekomendacją W3C: XML Schema Part 0: Primer, XML Schema Part 1: Structures, XML Schema Part 2: Datatypes. Obecnie: trwają prace nad wymaganiami do wersji 1.1 XML Schema. Przestrzeń nazw XML Schema: http://www.w3.org/2001/XMLSchema
Definiowanie elementów i atrybutów <xsd:element name="osoba"> <xsd:complexType> <xsd:sequence> <xsd:element name="imie" type="xsd:string"/> <xsd:element name="nazwisko" type="xsd:string"/> <xsd:element name="plec" type="xsd:string"/> <xsd:element name="wiek" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID"/> <xsd:attribute name="NIP" type="xsd:string"/> </xsd:complexType> </xsd:element>
Określanie typu elementu/atrybutu Atrybut type: <xsd:element name="imie" type="xsd:string"/> Podelement complexType lub simpleType: <xsd:element name="osoba"> <xsd:complexType> ... </xsd:complexType> </xsd:element>
Typy w XML Schema Wbudowane typy proste: string, boolean, integer, float, dateTime, ID, IDREF, CDATA, ... Typy proste definiują zbiory wartości atomowych (tzn. bez wewnętrznej struktury XML). Są nimi wszystkie typy wbudowane (np. liczba, napis, wartość logiczna), jak również typy stworzone na ich bazie (o tym później). Używa się ich do określania dopuszczalnych wartości atrybutów i zawartości elementów. Niektóre typy proste (ID, IDREF, CDATA) są zastrzeżone tylko dla atrybutów.
Typy w XML Schema Możliwość definiowania typów złożonych: sequence, choice, group, all. Kontrola użycia podelementów: minOccurs, maxOccurs. Kontrola użycia atrybutów: atrybut use o dopuszczalnych wartościach: required, optional lub prohibited. sequence - sekwencja wystąpień podelementów. chioce – alternatywa podelementów. group – grupowanie podelementów (nawiasy). all – wszystkie elementy muszą wystąpić, ale w dowolnej kolejności (konstrukcja dostępna w SGML DTD w postaci operatora &, lecz wycofana w XML DTD dla uproszczenia przetwarzania). Atrybuty minOccurs i maxOccurs określają liczby wystąpień elementów. Mogą one przyjmować wartości całkowite oraz specjalną wartość unbounded (nieograniczona liczba wystąpień).
Kontrola użycia elementów i atrybutów <xsd:element name="osoba"> <xsd:complexType> <xsd:sequence> <xsd:element name="imie" type="xsd:string" minOccurs="1" maxOccurs="2"/> <xsd:element name="nazwisko" type="xsd:string"/> <xsd:element name="plec" type="xsd:string"/> <xsd:element name="wiek" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID" use="required"/> <xsd:attribute name="NIP" type="xsd:string"/> </xsd:complexType> </xsd:element>
Typy w XML Schema Tworzenie własnych typów prostych przy pomocy aspektów (facets): minInclusive, maxInclusive, minExclusive, maxExclusive, pattern, enumeration, list, union, length, minLength, maxLength. <xsd:element name="wiek"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="120"/> </xsd:restriction> </xsd:simpleType> </xsd:element> minInclusive, maxInclusive, minExclusive, maxExclusive – zawężają zakres dozwolonych wartości liczbowych. pattern – wzorzec wartości zgodny z podanym wyrażeniem regularnym. enumeration – typ wyliczeniowy. list – lista wartości typu prostego. length, minLength, maxLength – opowiednio wymagana, minimalna lub maksymalna długość napisu lub listy.
Przykłady Lista wartości: Wyrażenia regularne: <xsd:simpleType name="LotteryNumbers"> <xsd:restriction> <xsd:simpleType> <xsd:list itemType="OneToNinetyNine"> </xsd:simpleType> <xsd:length value="6"/> </xsd:restriction> </xsd:simpleType> Wyrażenia regularne: <xsd:attribute name="NIP"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-\d{3}-\d{2}-\d{2}"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute>
Typ złożony, ale prosty <xsd:element name="roślina"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="gatunek" type="xsd:string" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
Model mieszany w XML Schema Możliwość kontroli ilości i kolejności podelementów: <xsd:element name="zeznanie"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="poszkodowany" type="xsd:string"/> <xsd:element name="data" type="xsd:string"/> <xsd:element name="godzina" type="xsd:string" maxOccurs="2"/> </xsd:sequence> </xsd:complexType> </xsd:element> Model mieszany w DTD nie pozwala na ograniczenie ilości ani kolejności podelementów występujących w tekście. W XML Schema typ o modelu mieszanym definiuje się identycznie jak każdy inny typ.
Rozszerzanie typów <xsd:complexType name="Publikacja"> <xsd:sequence> <xsd:element name="Tytuł" type="xsd:string"/> <xsd:element name="Autor" type="xsd:string"/> <xsd:element name="RokPubl" type="xsd:year"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Książka"> <xsd:complexContent> <xsd:extension base="Publikacja"> <xsd:sequence> <xsd:element name="ISBN" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType>
Deklaracja elementu a typ zawartości Oddzielenie deklaracji elementu od typu zawartości: typy anonimowe: <xsd:element name="osoby"> <xsd:complexType>...</xsd:complexType> </xsd:element> typy nazwane: <xsd:element name="osoba" type="osoba"/> ... <xsd:complexType name="osoba"> ... </xsd:complexType> W DTD deklaracja elementu definiuje jednocześnie typ jego zawartości. Jeśli chcemy przypisać ten sam model zawartości kilku elementom, to musimy wielokrotnie przepisać definicję modelu (ewentualnie upraszczając sobie życie przy pomocy encji parametrycznych). XML Schema oferuje byt pośredni – typ zawartości który definiujemy, nadając mu nazwę, a następnie przypisujemy do dowolnie wielu elementów/atrybutów. Dla uproszczenia, możemy zdefiniować typ bezpośrednio w deklaracji elementu (jak w DTD) i wtedy będzie to typ anonimowy.
Deklaracje lokalne i globalne <xsd:element name="Książka"> <xsd:complexType> <xsd:sequence> <xsd:element name="Autor" type="xsd:string"/> ... <xsd:element ref="ISBN"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="ISBN"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{2}-\d{3}"/> </xsd:restriction> </xsd:simpleType> </xsd:element>
Dokąd zmierzamy? Trendy w zastosowaniach technologii XML: coraz więcej zastosowań związanych z integracją aplikacji i wymianą dokumentów, rosnące potrzeby walidacji struktur XML. Odpowiedź: XML Schema: bardzo młody standard, czeka nas jeszcze wiele pracy, czy doczekamy się darmowych narzędzi? Czy XML Schema wyprze DTD? wieloletnie doświadczenie z SGML-owymi DTD, dostępność dobrych DTD, wygoda, przyzwyczajenie.