Document Type Definition
DTD (Document Type Definition) je stariji način određivanja pravila strukture XML dokumenta. U zaglavlju XML dokumenta navodi se oznaka DTDa prema pravilima kojeg je dokument formatiran. Za vrijeme kreiranja XML dokumenta, kreator koristi DTD kako bi formirao XML dokument prema odgovarajućim pravilima. Svaki korisnik tog XML dokumenta koristeći odgovarajući DTD zna na ispravan način interpretirati sadržaj XML dokumenta. Također primjenom pravila iz DTDa osoba koja kreira novi XML dokument može provjeriti da li ga je na ispravan način formirala.
DTD formatiranje[uredi]
DTD formatiranje se odvija na sljedeći način:
- definira se skup elemenata
- definira se sadržaj svakog elementa
- definiraju se atributi elemenata
- definiraju se entiteti koji će se koristiti u dokumentu
Sintaksa DTDa[uredi]
XML blokovi sadržaja[uredi]
Sa stajališta DTDa svaki XML document sastoji se od od sljedećih tipova blokova sadržaja:
- Elementi su osnovni blokovi XML dokumenta. Elementi mogu sadržavati druge elemente, sadržaj ili biti prazni.
- Atributi sadrže dodatne informacije o elementima. Navode se unutar početne oznake elementa.
- Entiteti su varijable koje definiraju često korišteni tekst. Postoje i reference na entitete. Jedna od najpoznatijih i najčešće korištenih je referenca na znak praznine .
- PCDATA predstavlja tekst koji će parsirati XML parser. XML oznake na koje parser naiđe tretirati će kao posebne XML oznake i interpretirati ih na odgovarajući način.
- CDATA predstavlja tekst koji XML parser neće parsirati. XML oznake na koje parser naiđe tretirati će kao običan tekst i neće ih interpretirati kao XML oznake.
DTD elementi[uredi]
Deklaracija svakog DTD elementa započinje oznakom <!ELEMENT i završava znakom >. Sastoji se od naziva elementa i opisa modela. Četiri su tipa sadržaja:
- podaci su sadržaj najniže razine i unutar njega se navodi krajnji sadržaj. Model toga sadržaja označava se s #PCDATA.
DTD | XML |
---|---|
<!ELEMENT ime (#PCDATA)> <!ELEMENT prezime (#PCDATA)> |
<ime>Pero</ime> <prezime>Perić</prezime> |
- elementi sadrže elemente podređene razine. Model toga sadržaja sastoji se od niza podređenih elemenata razdvojenih zarezima. Redoslijed niza je važan;
DTD | XML |
---|---|
<!ELEMENT osoba (ime, prezime?)> | <osoba> <ime>Pero</ime> <prezime>Perić</prezime> |
- prazni elementi ne sadrži niti podatke niti elemente. Model tog sadržaja označava se s EMPTY.
DTD | XML |
---|---|
<!ELEMENT br EMPTY> | <br /> |
- miješani sadržaj sastoji se od podataka i elemenata podređene razine. Model se sastoji od niza podređenih elemenata i od oznake #PCDATA.
Kardinalnost elemenata[uredi]
Prilikom označavanja elemenata moguće je odrediti njihovu kardinalnost (broj pojavljivanja) na sljedeći način:
- 0 ili 1 element označava se znakom "?". Npr <!ELEMENT Osoba (Ime, Prezime?)> označava da element "Osoba" mora imati 1 podređeni element "Ime", a može (ali ne mora) imati podređeni element "Prezime;
- 0 ili više elemenata označava se znakom "*". Npr. <!ELEMENT KontaktPodaci (Telefon*, Email*)> označava da element "KontaktPodaci" može imati više podređenih elemenata "Telefon" i "Email";
- 1 ili više elemenata označava se znakom "+". Npr. <!ELEMENT Student (UpisanaGodina+)> označava da element "Student" može imati jednu ili više upisanih godina na fakultetu;
- alternative su razdvojene iznakom "|" i određuju da element mora sadržavati jedan od podelemenata iz liste. Npr. <!ELEMENT NačinPlaćanja(Gotovina | KreditnaKartica | Ček)> Označava da se plaćanje mora izvršiti gotovinom, kreditnom karticom ili čekom. Sukladno tome podređeni element mora biti jednog od navedenih tipova.
DTD atributi[uredi]
Atributi u DTDu deklariraju se unutar ATTLIST deklaracije. Tip atributa može biti različit ovisno o sadržaju:
- atributi čija vrijednost je niz znakova su tipa CDATA
- atributi čija vrijednost mora biti jedna iz navedenog niza su tipa (vrijednost1|vrijednost2|..)
- atributi čija vrijednost je jedinstvena oznaka su tipa ID
- atributi čija vrijednost je jedinstvena oznaka nekog drugog elementa su tipa IDREF
- atributi čija vrijednost je lista drugih jedinstvenih oznaka su tipa IDREFS
- atributi čija vrijednost je ispravan XML naziv su tipa NMTOKEN
- atributi čija vrijednost je lista ispravnih XML naziva su tipa NMTOKENS
- atributi čija vrijednost je entitet su tipa ENTITY
- atributi čija vrijednost je lista entiteta su tipa ENTITIES
- atributi čija vrijednost je naziv notacije su tipa NOTATION
- atributi čija vrijednost je predefinirana XML vrijednost su tipa xml:
Vrijednost atributa može biti:
- ako u dokumentu nije zadana vrijednost, onda se podrazumijeva fiksno zadana vrijednost
- #REQUIRED označava da vrijednost atributa mora biti navedena
- #IMPLIED označava da je vrijednost atributa opcionalna i ne mora biti uključena
- #FIXED označava da je vrijednost atributa fiksno određena
DTD entiteti[uredi]
DTD entiteti definiraju prečace do određenih vrijednosti. Određeni enetiteti standardno su zadani unutar XMLa. To su npr.
- znak "manje od (<) - <
- znak "veće od" (>) - >
- razmak -
- navodnik (") - "
Druga vrsta entiteta su oni koje sami deklarirate unutar DTD dokumenta i koristite unutar XML dokumenta. Prilikom obrade (parsiranja) XML dokumenta DTD entitet će se pretvoriti u vezanu vrijednost. Entiteti se deklariraju unutar ENTITY deklaracije.
DTD | XML prije parsiranja | XML nakon parsiranja |
---|---|---|
<!ENTITY imeAutora "Pero Perić"> | <autor> &imeAutora; </autor> |
<autor> Pero Perić </autor> |
Deklariranje DTD modela[uredi]
Deklariranje modela započinje korjenskim elementom. Nakon toga deklaracija se nastavlja s elementima neposredne niže razine. Postupak se ponavlja sve dok se ne dođe do elemenata najniže razine, a to su oni koji su izravno vezani uz podatke i označeni s oznakom #PCDATA.
Povezivanje DTDa s XMLom[uredi]
Povezivanje vanjske DTD datoteke s XMLom provodi se navođenjem DOCTYPE definicije unutar XML dokumenta.
<!DOCTYPE root-element SYSTEM "filename">
Primjer korištenja[uredi]
XML dokument[uredi]
Dokument studenti.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Studenti SYSTEM "studenti.dtd" > <Studenti> <Osoba id="s201"> <Ime>Pero</Ime> <Prezime>Perić</Prezime> </Osoba> <Studij>Računarstvo</Studij> <Adresa> <Ulica>U gradu</Ulica> <Broj>247</Broj> <Grad>Zagreb</Grad> </Adresa> <KontaktPodaci> <Telefon>01-111-777</Telefon> <Telefon vrsta="Mobilni">098-111-1778</Telefon> <Email>pperic@zg.tel.hr</Email> <KorisnickoIme>pperic</KorisnickoIme> </KontaktPodaci> </Studenti>
DTD dokument[uredi]
Dokument studenti.dtd
<!ELEMENT Studenti (Osoba, Studij?, Adresa?, KontaktPodaci?)> <!ELEMENT Osoba (Ime, Prezime?)> <!ELEMENT Ime (#PCDATA)> <!ELEMENT Prezime (#PCDATA)> <!ELEMENT Studij (#PCDATA)> <!ELEMENT Adresa (Ulica?, Broj?, Grad?)> <!ELEMENT Ulica (#PCDATA)> <!ELEMENT Broj (#PCDATA)> <!ELEMENT Grad (#PCDATA)> <!ELEMENT KontaktPodaci (Telefon*, Email+, KorisnickoIme+)> <!ELEMENT KorisnickoIme (#PCDATA)> <!ELEMENT Telefon (#PCDATA)> <!ELEMENT Email (#PCDATA)> <!ATTLIST Osoba id ID #REQUIRED> <!ATTLIST Telefon vrsta (Fiksni|Mobilni) #IMPLIED>
Prednosti i nedostaci DTDa[uredi]
Osnovni nedostatak DTDa je što sintaksna pravila kreiranja DTD dokumenta nisu usklađena s pravilima formiranja XML dokumenta. Zbog toga program koji interpretira XML dokumente mora znati parsirati pravila oba jezika. To znatno komplicira izgradnju takvih programa. Također i ljudi koji kreiraju DTD dokument moraju pored sintaksnih pravila XML dokumenata savladati i sintaksna pravila za formiranje DTD dokumenata.
DTDom se ne mogu precizno definirati pravila koja XML dokument treba zadovoljavati (npr. kardinalnost se može opisati samo na nivou "niti jedan", "jedan" ili "više elemenata", nije moguće precizno opisivanje tipa podataka (numerički znakovni,...)).
S druge strane, DTD je vrlo raširen i njegova sintaksa je dosta jednostavna za korištenje što krajnjim korisnicima pojednostavljuje rad.