Deklaracja typu dokumentu (DTD) ------------------------------- Standard XML określa dwa rodzaje poprawności: 1. *well-formed*, tzn. dokument jest dobrze sformułowany w sensie poprawnego zapisu znaczników czyli, m.in. a. Znaczniki 'otwierające', 'zamykające' i 'puste' są poprawne strukturalnie b. Znaczniki są poprawnie zagnieżdżone c. Dokument posiada dokładnie jeden znacznik główny ('root') + Do sprawdzania poprawności na poziomie *well-formed* używaliśmy komendy + .................... $ xmllint nazwa.xml .................... 2. *valid* tzn. dokument jest zgodny z deklaracją typu dokumentu (DTD) w tym celu dokument musi, m.in. a. Zawierać deklarację typu b. Wszystkie 'znaczniki' (elementy), ich 'zawartość' oraz 'atrybuty' są zgodne z zadeklarowanym typem dokumentu. + Do sprawdzania poprawności na poziomie *valid* używamy komendy + .................... $ xmllint --valid nazwa.xml .................... Deklaracje wewnętrzne i zewnętrzne ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Deklaracja typu dokumentu występuje po deklaracji dokumentu XMLowego ``, a przed elementem korzenia dokumentu i może mieć postać 1. deklaracji wewnętrznej (osadzonej w dokumencie) : + [xml] xxxxxxxxxx xxxxxxxxxx 2. deklaracji zewnętrznej określonej, albo przez adres URI, albo nazwę (w systemowym katalogu typów dokumentów) i adres URI: + [xml] xxxxxxxxxx xxxxxxxxxx Przykład: Okno ,,Ustawienia panelu'' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ W dalszym ciągu omówimy języki deklaracji typu dokumentów DTD i link:http://www.w3.org/TR/xmlschema-0/[XML Schema] na przykładzie okna link:javascript:window.open(\'window1.xul',\'foo',\'chrome,width=400,height=200')[Ustawienia panelu] zapisanego w języku link:http://www.xulplanet.com/[XUL (XML User Interface Language)]. Okno wygląda następująco: image:window1.png["window1.xul", link="javascript:window.open(\'window1.xul',\'foo',\'chrome,width=400,height=200')"] i jest opisane plikiem link:window1.xul[]: htmlize::window1.xul[] Następnie sformułujemy typ dokumentu DTD dla window1.xul (okrojony język XUL): htmlize::window1.dtd[] Następnie sformułujemy typ dokumentu XML Schema dla window1.xul (okrojony język XUL): htmlize::window1.xsd[] Poprawność tego schematu można sprawdzić komendą (wymaga usunięcia atrybutu `xmlns` elementu `window` z pliku `windows1.xul`): ..... $ xmllint --schema window1.xsd window1.xul ..... * link:http://www.w3.org/TR/xmlschema-0/#simpleTypesTable[Tabela wbudowanych typów prostych] Poza konstrukcjami występującymi w powyższym przykładzie w zadaniu mogą też przydać się ograniczenie zakresu liczb: // [xml] // ^^^^^^^ // // // // // // // // ^^^^^^^ [xml] xxxxxxxxxx xxxxxxxxxx oraz typ łańcuchowy zadany wyrażeniem regularnym: [xml] xxxxxxxxxx xxxxxxxxxx Zadanie do oddania: Zamówienie na książki, CD i DVD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Napisać przykładowy dokument XMLowy `zad1.xml`, deklarację typu DTD `zad1.dtd` oraz deklarację typu XML Schema `zad1.xsd`. Dokument powinien mieć następującą strukturę (typ): -------------------- Zamówienie (nr zamówienia: wymagany) { Adres Dostarczenia (termin dostrczenia, tzn. data) { Nazwa, Ulica, Kod pocztowy, Miasto, [Kraj FIXED Polska]; } Adres Dostarczenia faktury { Jak wyżej albo tylko jeden element -- adres email; } Artykuły { // od 1--100 Artykuł (ilość: 1--100: opcjonalny, domyślnie 1; unikalny identyfikator: wymagany) { // dokładnie jedno z: // książka, muzyczna płyta CD albo filmowa płyta DVD Książka { Tytuł, Autor, Nazwa wydawnictwa, Rok wydania, Numer wydania, Numer ISBN; } CD { Nazwa albumu, Wykonawca, Wydawca, Rok wydania, Opcjonalny czas trwania; } DVD { Tytuł, Reżyser, Wytwórca/Dystrybutor, Rok premiery, Opcjonalny czas trwania; } } } } -------------------- gdzie `()` oznacza atrybuty dozwolone dla danego elementu elementu, zaś `{}` zagnieżdżone elementy. Przykładowy dokument `zad1.xml` powinien zawierać: co najmniej po jednej książce, CD i DVD (mile widziane rzeczywiste dane). Proszę zwrócić uwagę na *typy danych atrybutów i elementów*, np. w formacie który na to zezwala proszę odpowiednio zdefiniować: Kod pocztowy, Numer ISBN (np. "ISBN 83-01-12641-8") oraz typy lub zakresy liczbowe. Rozwiązania proszę *w ciągu tygodnia* (przed następnymi zajęciami) wysłać na adres `lukpank-at-o2.pl` z tytułem `[xml-wtorek] zad1` z trzema załącznikami (`zad1.xml`, `zad1.dtd` i `zad1.xsd`). Przed wysłaniem Proszę upewnić się, że przykładowy dokument jest poprawny w myśl obu definicji, tzn. komendy .................... $ xmllint --valid zad1.xml $ xmllint --schema zad1.xsd zad1.xml .................... wykonują się bez błędu. Po wysłaniu rozwiązania powinni państwo otrzymać automatyczną odpowiedź, że zadanie zostało przyjęte i jest poprawne (lub nie) wedle powyższych komend (automatyczna odpowiedź nie będzie działała (nie przyjdzie) przed czwartkiem). //////////////////// Local Variables: coding: utf-8 ispell-local-dictionary: "polish" End: LocalWords: DTD well formed xmllint xml valid URI ISBN lukpank pl schema ////////////////////