XML Schema i Altova XML Spy

Autor: Krzysztof Balicki - 2 rok MSUI

Wstęp

Dokument XML aby był poprawny strukturalnie powinien być wyposażony w formalny opis jego części składowych. Taki opis w dużej mierze pozwala na uzyskanie pełnej kontroli nad powstającymi w oparciu o niego, wypełnionymi treścią egzemplarzami dokumentu. Obecnie wzorce struktur, opisujące typy dokumentów możemy definiować na dwa sposoby: używając odziedziczonego po SGML (Standard Generalized Markup Language) mechanizmu określającego jako DTD (Document Type Definition) lub nowszego, rozszerzającego możliwości DTD zapisu XML Schema.

DTD

DTD udostępnia prosty sposób systematyzacji opisu budowy tekstu, ograniczający się do identyfikacji wzajemnego położenia części składowych dokumentu. Związki zawierania się i porządku występień elementów kodowane są przy pomocy wyrażeń regularnych, definiujących ich model zawartości (content model), który tworzą tekst oraz inne elementy.

DTD oferuje jedynie postawową kontrolę nad strukturą dokumentów, nie dając możliwości definiowania typów wykraczających poza model zawartości, ani rozszerzania definicji czy obsługi przestrzeni nazw. Ograniczenia DTD sprawiają, że w definicji typu dokumentu, zapisanej w tym języku, nie da się wyrazić wielu wymagań, jakie powinny spełniać zawartości elementów oraz wartości atrybutów, np. wymagania, aby zawartość elementu <ilosc> była dodatnią liczbą całkowitą. Kontrolę takich ograniczeń trzeba więc programować w kodzie aplikacji.

Niepotrzebną komplikację przetwarzania sprawia też fakt, że składnia DTD różni się wyraźnie od składni dokumentów XML. W razie potrzeby uzyskania większej ścisłości definicji, lakarstwem na wszystkie powyższe problemy okazuje się XML Schema.

Prosta definicja DTD opisująca dokument zawierający dane osób oraz ich pokrewieństwo (atrybuty typu ID i IDREF):

<!ELEMENT osoby (osoba)*>
<!ELEMENT osoba (imie, nazwisko, plec, wiek, pokrewienstwo*)>
<!ATTLIST osoba id ID #REQUIRED
NIP CDATA #IMPLIED>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT nazwisko (#PCDATA)>
<!ELEMENT plec (#PCDATA)>
<!ELEMENT wiek (#PCDATA)>
<!ELEMENT pokrewienstwo EMPTY>
<!ATTLIST pokrewienstwo rodzaj (syn|corka|ojciec|matka|brat|siostra) #IMPLIED
z-kim IDREF required>

Główne ograniczenie polega na niemożności określenia wymaganej zawartości tekstowej elementów, gdyż słowo #PCDATA (oznaczające dowolny tekst) jest praktycznie jedynym, jakim można się posłużyć. Ograniczenie to nie sprawia większych kłopotów podczas modelowania tekstów. Jednak podczas modelowania komunikatów o ścisłej strukturze stanowi poważny problem.

XML Schema

XML Schema rozszerza funkcjonalność dostępną w DTD, zachowując jednocześnie wszystkie cechy DTD (z tego powodu możliwa jest automatyczna konwersja DTD do nowego formatu). Rozszerzenie to polega przede wszystkim na wprowadzeniu możliwości określania typów zawartości elementów i wartości atrybutów, zarówno poprzez wskazanie typów predefiniowanych, jak i użycie własnych typów, zdefiniowanych na bazie typów predefiniowanych. Proces weryfikacji poprawności musi więc być w stanie sprawdzić choćby zgodność zawartości elementu z zakresem dozwolonych wartości - jeśli taka będzie nasza intencja na etapie projektowania struktury.

Do definicji typu dokumentu w formacie XML Schema wykorzystywana jest standardowa składnia XML-a. Dla uniknięcia konfliktów nazw, składniki definicji należą do przestrzeni nazw XML Schema, wyróżnianej zwykle prefiksem xsd. Cała definicja zawarta jest w elemencie głównym xsd:schema, zaś odpowiednikami deklaracji elementów i atrybutów z DTD są elementy xsd:element i xsd:attribute.

XML Schema wprowadza możliwość definicji dwóch rodzajów typów zawartości - prostych (simple types) oraz złożonych (complex types). 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. Używa sie ich do określania dopuszczalnych wartości atrybutów i zawartości elementów.

Oto przykład deklaracji elementu o zawartości typu prostego:

<xsd:element name="pojecie" type="xsd:string"/>

Najczęściej stosowane typy wbudowane to:

string - ciąg znaków,
boolean - wartość logiczna (true, false lub 1 i0),
integer - liczba całkowita z przedziału -126789 - 126789,
float - liczba rzeczywista (dopuszcza także wartości: -INF, INF i NaN),
dateTime - data i czas (postaci 2001-06-01T12:30).

Typy złożone są natomiast definicjami modeli zawartości, rozszerzonymi o związki z definiowanym elementem atrybuty. Odpowiadają więc one wyrazeniom regularnym stosowanym w DTD. Sekwencja wystąpień elementów identyfikowana jest w definicji typu elementem xsd:sequence, alternatywa - element xsd:choice, zaś grupowanie - xsd:group. Do określania liczby wystąpień elementów używane są atrybuty minOccurs i maxOccurs, przyjmujące wartości całkowite, oraz wartości unbound, oznaczająca nieograniczoną liczbę wystąpień. Kontrola użycia atrybutów realizowana jest przy pomocy atrybutu use o dopuszczalnych wartościach: required, optional oraz prohibited.

Oto porównanie definicji zapisanej w XML Schema, która odpowiada przedstawionej wcześniej DTD. Na razie nie będą w niej wykorzystane pewne specyficzne możliwości XML Schema, na początku ważne jest, aby obie definicje miały taką samą siłę wyrazu:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.empolis.pl" xmlns="http://www.empolis.pl">
<xsd:element name="osoby">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="osoba" type="osoba"
minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="osoba">
<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:element ref="pokrewienstwo"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID"/>
<xsd:attribute name="NIP" type="xsd:string"/>
</xsd:complexType>

<xsd:element name="pokrewienstwo">
<xsd:complexType>
<xsd:attribute name="rodzaj" use="optional">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="syn"/>
<xsd:enumeration value="corka"/>
<xsd:enumeration value="ojciec"/>
...
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="z-kim" type="xsd:IDREF" use="required"/>
</xsd:complexType>

</xsd:schema>

Przykład ilustruje kilka typowych metod definiowania zawartości elementów, stosowanych w XML Schema: definiowanie typów nazwanych i odwoływania się do nich w deklaracjach elementów, umieszczanie definicji typów anonimowych bezpośrednio w deklaracji elementów, deklarowanie elementów poza strukturą, w której są wykorzystywane (dla zwiększenia czytelności) i odwoływania się do nich za pomocą atrybutu ref.

Przykład jest również prezentacją sposobu wykorzystania aspektów (ang. facets) do modyfikowania typów. Aspekty minOccurs, maxOccurs określają minimalną i maksymalną dopuszczalną liczbę powtórzeń elementów, natomiast enumeration pozwala na tworzenie typów wyliczeniowych.

Przykład określenia zakresu dopuszczalnych wartości elementu wiek:

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

Element plec powinien dopuszczać tylko dwa określenia, można więc zdefiniować jego zawartość za pomocą typu wyliczeniowego:

<xsd:element name="plec">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="K"/>
<xsd:enumeration value="M"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

Numery NIP mają określoną strukturę, można za pomocą wyrażenia regularnego określić dopuszczalne wartości NIP:

<xsd:element name="NIP">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-\d{3}-\d{3}-\d{2}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

Altova XML Spy

Firma Altova powstała w 1992 roku, biura firmy mieszczą sie w Beverly (USA, stan Massachusetts) i w Wiedniu (Austria). Strona firmy Altova to: www.altova.com, z której można ściągnąć program instalacyjny XML Spy. XML Spy występuje w dwóch wersjach: Enterprise i Home. Enterprise jest wersją trial 30 dniową, Home jest bezpłatne. Aby można było korzystać z programu należy się zarejestrować.

Microsoft Windows jest główną platformą dla XML Spy 2005 i System Operacyjny Windows jest rekomendowany przez Altova. XML Spy 2005 i inne produkty Altova są kompatybilne z Windows NT, Windows 2000, Windows XP, Windows Server 2003.
XML Spy 2005 poprawnie działał na MacOS X dzięki użyciu Virtual PC 6 (produkt Microsoftu) oraz na RedHat Linux 8.0 dzięki Wine 20030115.

Prezentacja programu w działaniu

Inne narzędzia:
XSV (XML Schema Validator)
Herces