XML este un metalimbaj, adica un limbaj care permite descrierea altor limbaje. Din acest punct de vedere este importanta cunoasterea modalitatilor de descriere a acestor limbaje. Un limbaj de marcare care are la baza standardul XML poate fi definit prin intermediul unui DTD sau a unui scheme XML.
DTD Document Type Definition este un limbaj folosit pentru descrierea si validarea documentelor XML, care este definit in specificatiile standardului XML. Cu toate acestea, limbajul DTD nu detine o sintaxa de tip XML. Limbajul XML mosteneste definitia tipului de document din SGML (Standard Generalized Markup Language).
Un document XML este bine format, daca respecta anumite reguli de sintaxa.
Un document XML este valid, daca in plus specifica o definitie a tipului de document si se conformeaza acesteia.
Utilizand sintaxe non XML, un DTD defineste structura sau modelul de continut al unui document XML valid. Mai exact, un DTD defineste elemente, atribute, entitati si notatii, si poate contine comentarii, dar si structuri proprii, numite entitati parametru. O definitie a tipului de document stabileste un set de reguli cu privire la structura unui document XML.
Declaratia tipului de document reprezinta un marcaj special care poate fi inclus in prologul unui document XML pentru a specifica o definitie a tipului de document. Declaratia tipului de document, numita uneori si declaratie DOCTYPE, specifica procesorului XML unde poate fi gasit un DTD specific. O declaratie a tipului de document stabileste legatura dintre un document XML si DTD-ul corespunzator. A nu se face confuzie intre declaratia tipului de document si definitia tipului de document.
Declaratia tipului de document poate contine:
• un set intern de declaratii (DTD intern);
• numele si locatia unui document extern ce contine declaratii (DTD extern);
• un DTD intern, plus o referinta la un DTD extern.
Un DTD intern este in intregime continut in prologul unui document XML si se utilizeaza cu precadere in cazul in care acesta este simplu si nu trebuie inclus intr-un numar mare de documente XML.
Daca un DTD este declarat in interiorul unui document XML, acesta trebuie inclus prin intermediul unei declaratii a tipului de document ce prezinta urmatoarea sintaxa:
<!DOCTYPE element_radacina [ declaratii_elemente declaratii_liste_atribute declaratii_entitati declaratii_notatii alte_informatii ]>
Urmatorul document XML este descris prin intermediul unui DTD intern, care apare in interiorul declaratiei tipului de document. Definitia tipului de document incepe cu elemental radacina, email, si contine declaratii de elemente si o declaratie a unui atribut.
<?xml version="1.0" encoding="UTF-8"?> | |
<!DOCTYPE email [ | |
<!ELEMENT email (to, from, subject, body)> | |
<!ELEMENT to (#PCDATA)> | |
<!ELEMENT from (#PCDATA)> | |
<!ELEMENT subject (#PCDATA)> | |
<!ELEMENT body (#PCDATA)> | |
<!ATTLIST email id CDATA #REQUIRED> | |
]> | |
<email id="368"> | |
<to>webmaster@virtualcampus.ro</to> | |
<from>virgil.popescu@virtualcampus.ro</from> | |
<subject>Test</subject> | |
<body> | |
Test my email account. | |
</body> | |
</email> |
Utilizarea unui DTD extern este mult mai avantajoasa, deoarece acesta poate fi distribuit unui grup de documente XML. Atata timp cat toate documentele utilizeaza marcajele descrise prin intermediul DTD, se poate realiza o administrare mult mai buna a marcajelor prin operarea unui DTD comun.
Pentru a utiliza un DTD extern intr-un document XML, acesta trebuie inclus prin intermediul unei declaratii a tipului de document ce prezinta urmatoarea sintaxa, unde locatie reprezinta un URL sau calea catre un fisier DTD utilizat pentru validarea documentului XML.
<!DOCTYPE element_radacina SYSTEM locatie>
Daca documentul XML si DTD-ul corespunzator se gasesc in acelasi director, atunci locatia este precizata chiar prin numele fisierului DTD.
<!DOCTYPE element_radacina SYSTEM "C:\temp\email.dtd"> <!DOCTYPE element_radacina SYSTEM "https://virtualcampus.ro/email.dtd">
Daca se doreste utilizarea unui DTD extern pentru documentul XML din exemplul anterior, se modifica declaratia tipului de document pentru a contine cuvantul cheie SYSTEM si o referinta catre fisierul email.dtd. Acesta va include definitia tipului de document utilizata pentru validarea documentului XML.
<!-- email.dtd --> | |
<!ELEMENT email (to, from, subject, body)> | |
<!ELEMENT to (#PCDATA)> | |
<!ELEMENT from (#PCDATA)> | |
<!ELEMENT subject (#PCDATA)> | |
<!ELEMENT body (#PCDATA)> | |
<!ATTLIST email id CDATA #REQUIRED> |
Definitia tipului de document din fisierul email.dtd poate fi interpretata astfel:
• elementul radacina, email, contine patru elemente: to, from, subject si body, in aceasta ordine;
• elementul to contine date caracter ce pot fi procesate de un parser XML;
• elementul from contine date caracter ce pot fi procesate de un parser XML;
• elementul subject contine date caracter ce pot fi procesate de un parser XML;
• elementul body contine date caracter ce pot fi procesate de un parser XML;
• elementul email detine un atribut id, care identifica unic o locatie din documentul XML; pentru atributul id trebuie stabilita o valoare.
Un DTD poate contine urmatoarele informatii:
• declaratii de elemente: permit introducerea oricarui tip de element prezent in documentul XML; toate elementele trebuie declarate si in definitia tipului de document, devenind astfel parte a setului de elemente permise;
• declaratii de liste de atribute: specifica setul de atribute care pot fi utilizate in marcajul de inceput al elementelor din documentul XML; orice declaratie a unui atribut precizeaza numele, valoarea si comportamentul acestuia;
• declaratii de entitati: stabilesc numele si definitiile entitatilor (generale, parametru);
• declaratii de notatii: specifica tipurile de date binare sau date text, care nu pot fi procesate;
• alte informatii: aceasta categorie include diverse declaratii XML, comentarii sau spatii.
Daca se utilizeaza spatii de nume in documentele XML, atunci declaratiile de elemente si liste de atribute din DTD-uri vor include denumirile prefixate. In acest caz, nu vor putea fi utilizate foarte usor aceleasi DTD-uri pentru validarea unor documente XML care contin spatii de nume diferite.
<!-- cursuri.dtd --> | |
<!ENTITY % prefix "t"> | |
<!ENTITY % colon ":"> | |
<!ENTITY % nsdecl1 "xmlns"> | |
<!ENTITY % nsdecl2 "xmlns%colon;%prefix;"> | |
<!ENTITY % tutor "%prefix;%colon;tutor"> | |
<!ENTITY % titlu "%prefix;%colon;titlu"> | |
<!ENTITY % nume "%prefix;%colon;nume"> | |
<!ENTITY % birou "%prefix;%colon;birou"> | |
<!ELEMENT cursuri (curs)*> | |
<!ATTLIST cursuri %nsdecl1; | |
CDATA #FIXED "https://virtualcampus.ro/cursuri/curricula/" %nsdecl2; | |
CDATA #FIXED "https://idata.upt.ro/personal/"> | |
<!ELEMENT curs (titlu, an , semestru, tutori)> | |
<!ELEMENT titlu (#PCDATA)> | |
<!ELEMENT an (#PCDATA)> | |
<!ELEMENT semestru (#PCDATA)> | |
<!ELEMENT tutori (%tutor;)+> | |
<!ELEMENT %tutor; (%titlu;, %nume;, %birou;)> | |
<!ELEMENT %titlu; (#PCDATA)> | |
<!ELEMENT %nume; (#PCDATA)> | |
<!ELEMENT %birou; (#PCDATA)> |
Chiar daca in momentul de fata se recomanda inlocuirea DTD cu scheme XML, datorita limitarilor DTD, acest lucru nu a dus la excluderea DTD din categoria limbajele utilizate pentru descrierea documentelor XML.