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