XML Schema – Tutorial cz. 1: Wprowadzenie do elementów schema, complexType i element

Przykładowy, prosty plik XML o nazwie ksiazka.xml definiujący książkę wraz z jej tytułem oraz dowolną liczbą autorów. Każy autor skłądający się z nazwy (imion i nazwiska) oraz z daty urodzenia.

<?xml version="1.0" encoding="UTF-8"?>
 
<ksiazka>
    <tytul>Fajna Książka</tytul>
    <autor>
        <nazwa>Marcin Sprzedawca</name>
        <data_urodzenia>1950-10-04</data_urodzenia>
    </autor>
    <autor>
        <nazwa>Ryszard Klient</name>
        <data_urodzenia>1966-08-22</data_urodzenia>
    </autor>
</ksiazka>

Teraz rozpoczynamy pisanie XML Schema w postaci pliku o nazwie ksiazka.xsd. Rozszerzenie *.xsd pochodzi od XML Schema Definition. Najpierw utworzymy pusty korzeń (pojedynczy, najbardziej zewnętrzny znacznik XML), który następnie wypełnimy zawartością. Przy okazji tworzenia korzenia, definiujemy przestrzeń nazw (namespace) o nazwiexs zawierającą właśnie elementy XML Schema. Przestrzeń nazw to przedrostek oddzielony dwukropkiem od atrybutu xmlns (XML NameSpace) przy tagach XML, który umożliwia rozpoznanie tagów, które miałyby takie same nazwy. Przestrzeń nazw ma zasięg lokalny, czyli obowiązuje tylko wewnątrz tagu, w którym ją definiujemy. W zasięgu globalnym, czyli w oficjalnym internetowym świecie, poszczególne przestrzenie nazw są rozpoznawane za pomocą identyfikatora, który wygląda jak adres URL i który zapisujemy jako wartość przestrzeni nazw. Pokazuje to przykład poniżej.

<?xml version="1.0" encoding="UTF-8"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>

Teraz definiujemy nasz element ksiazka. Jest on typu complexType, gdyż zawiera inne elementy. Listę tych elementów umieszczamy w elemencie sequence. Jak widać poniżęj, korzystamy już ze zdefiniowanej przed chwilą przestrzeni nazw.

<?xml version="1.0" encoding="UTF-8"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ksiazka">
        <xs:complexType>
            <xs:sequence>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Element ksiazka składa się m.in. z elementu tytul, który jest prostym łańcuchem znaków.

<?xml version="1.0" encoding="UTF-8"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ksiazka">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="tytul" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Teraz dodajemy szkielet dla elementu autor, który również jest typu complexType. W odróżnienie od ksiazka definiujemy minimalną i maksymalną liczbę wystąpień. W przypadku braku tych parametrów, przyjmowane są domyślne wartości równe 1. W poniższym przykładzie, wartość unbounded oznacza nieskończoność.

<?xml version="1.0" encoding="UTF-8"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ksiazka">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="tytul" type="xs:string"/>
                <xs:element name="autor" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Następnie, w sposób analogiczny do poprzedniego, definiujemy elementy składowe elementu autor. Składowy element name jest łańcuchem znaków, natomiast element data_urodzenia jest datą.

<?xml version="1.0" encoding="UTF-8"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="ksiazka">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="tytul" type="xs:string"/>
                <xs:element name="autor" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="nazwa" type="xs:string"/>
                            <xs:element name="data_urodzenia" type="xs:date"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>