260 likes | 351 Views
C02. XML. DTD. Date Semistructurate, 2012-2013. C 02 . DS. DTD. C02 - DS.
E N D
C02. XML. DTD Date Semistructurate, 2012-2013
C02. DS • DTD
C02 - DS • Cum nu exista un vocabular standard, iar documentele XML pot contine orice elemente (valide), trebuie, totusi, stabilite niste reguli, pentru ca documentele sa poata fi citite de cei interesati (ex: institutii financiare care cer diferite rapoarte). • Pentru a stabili reguli care sa fie indeplinite de documentele unei aplicatii XML – o solutie este DTD. • DTD-urile sunt scrise intr-o sintaxa formala care explica exact ce elemente si entitati pot sa apara in document, unde pot sa apara, ce poate sa contina un element si ce atribute poate sa aiba. • Diferite aplicatii XML pot sa foloseasca diferite DTD-uri pentru a specifica ce este si ce nu este permis in documentele XML. • DTD – mecanism pentru descrierea structurii unui document – exprima modelul si permite validarea documentului conform acestui model.
C02 - DS • Aspecte pe care un DTD nu le poate mentiona (explicit!): • care este elementul radacina al documentului (desi se poate deduce printr-o parcurgere a DTD-ului) • cate instante ale unui element pot sa apara in document (doar 0, 1, ..., n) • de ce natura sunt datele caracter din interiorul unui element (tipuri de date – nu se poate specifica daca reprezinta valori numerice, date calendaristice s.a.) • Un DTD nu spune nimic legat de un document XML despre lungime, semnificatie, valori permise (vezi valorile fixe si valori posibile pentru atribute) si alte caracteristici ale textului continut de un element. • Observatie: Este important sa avem DTD-ul inainte de crearea documentului XML.
C02 - DS • Rolul DTD-ului este de a specifica ce elemente sunt permise in document, unde, si in ce ordine. DTD-ul descrie arborele care este acceptabil pentru documentul XML. • Avantaje DTD • daca se foloseste un editor XML care stie sa citeasca un DTD, atunci acesta forteaza structura documentului care se creeaza; • un DTD ajuta in plus un procesor XML in delimitarea tag-urilor de continutul efectiv; • un DTD poate declara valori fixe sau implicite pentru atributele elementelor. • Observatie: Cel mai important este ca un document XML sa fie well-formed. Validarea este optionala. Dar, daca datele din document sunt folosite pentru a fi importate intr-o BD, atunci conteaza daca lipseste un element.
C02 - DS • Submultimi DTD externe • Declaratia de tip de document este inclusa in documentul XML dupa declaratia XML si inainte de tag-ul de inceput al documentului radacina. • Exemple: <?xml version="1.0" standalone="no"?> <!DOCTYPE person SYSTEM "http://www.aaa.org/dtds/person.dtd"> <!DOCTYPE person SYSTEM "/subdir/person.dtd"> <!DOCTYPE person SYSTEM "person.dtd"> Se indica faptul ca este necesara o sursa externa Elementul radacina
C02 - DS • Submultimi DTD interne <?xml version="1.0"?> <!DOCTYPE person [ <!ELEMENT first_name (#PCDATA)> ... ]> <person> <name> ... (doc XML)
C02 - DS • Specificatie mixta (intern + extern) => DTD complet (in mod firesc, subseturile nu trebuie sa se suprapuna) <!DOCTYPE person SYSTEM "name.dtd" [ <!ELEMENT profession (#PCDATA)> <!ELEMENT person (...)> ]> <...> ... Doc XML </...>
C02 - DS • Elemente: • Fiecare element care poate fi folosit intr-un document XML trebuie declarat separat intr-un DTD: <!ELEMENT element_namecontent_specification> • Continut: • #PCDATA – daca elementul poate sa contina date caracter • Elemente fiu (secventa ordonata): e_parinte (e_fiu1, e_fiu2, …) • Cardinalitatea elementelor continute (numarul de elemente fiu, sufixe): • un element poate sa contina una sau mai multe instante de un anumit tip de element => se poate mentiona numarul de elemente fiu: • ? – zero sau unul • * – zero sau mai multe • + – unul sau mai multe
C02 - DS • Alegeri (optiuni): se poate specifica pentru un element sa contina unul sau alt element fiu. • O alegere este data printr-o lista de elemente (potentiale elemente fiu). • Un element nu poate sa aiba mai multe elemente fiu din lista data. • Dar – se poate (a | b | c)* • Exemplu: <!ELEMENT methodResponse (params | fault)> • Grupari: optiunile, secventele si sufixele pot fi combinate pentru o varietate mai mare a continutului posibil al unui element, cu ajutorul parantezelor rotunde. • Exemplu: <!ELEMENT adresa (strada, cod?, localitate, (judet | regiune | stat)+, tara, email+, website*, (retea?, telefon)+)>
C02 - DS • Continut mixt (documente narative): • Exemplu: <!ELEMENT paragraph (#PCDATA | name | profession | footnote | emphasize | date )* > • Observatie: #PCDATA trebuie sa fie primul element din secventa.Acesta este singurul mod prin care se poate defini continut mixt. In acest caz nu se poate specifica ordine in elementele fiu sau numar de aparitii al acestora.
C02 - DS • Elemente vide: <!ELEMENT image EMPTY> • Orice continut: <!ELEMENT page ANY> • Observatie: In cazul in care un element este declarat de tip ANY, iar in document contine sub-elemente, atunci acele elemente trebuie declarate in DTD. De obicei, ANY se foloseste temporar, pana la definitivarea DTD-ului.
C02 - DS • Declaratii de atribute • Toate atributele elementelor trebuie declarate – in declaratiile ATTLIST. Un ATTLIST poate declara mai multe atribute pentru acelasi element, insa – daca mai multe elemente au acelasi atribut, trebuie declarat de fiecare data. • Exemplu – elementul image are atributul source de tip sir de caractere, iar valoarea acestuia este obligatoriu sa fie data: <!ATTLIST image source CDATA #REQUIRED> <!ATTLIST image source CDATA #REQUIRED width CDATA #REQUIRED height CDATA #REQUIRED alt CDATA #IMPLIED>
C02 - DS • Tipuri de atribute: • CDATA – continut sir de caractere oarecare (valid XML) <!ATTLIST prof specializare CDATA #REQUIRED> • Enumerare – lista de posibile valori <!ATTLIST disciplina activitati (C | S | L) #REQUIRED> • ID: atributul trebuie sa contina un nume XML care sa fie unic pe multimea de elemente (de orice tip) in cadrul documentului; fiecare element poate avea un singur atribut de tip ID <!ATTLIST prof idp ID #REQUIRED> • IDREF: refera un atribut de tip ID al unui element din document; Observatie: valorea unui atribut IDREF poate fi orice valoare care apare ca valoare a unui atribut ID din document, chiar daca nu este al unui element asteptat <!ATTLIST prof catedra IDREF #REQUIRED> • IDREFS: contine o lista de nume XML separate prin whitespace, unde fiecare este valoarea unui atribut ID al unui element din documentul curent; elementul curent, prin acest atribut, refera mai multe elemente <!ATTLIST catedra sefi IDREFS #REQUIRED> • NMTOKEN: un XML name token este similar cu un nume XML; difera fata de un nume XML prin faptul ca orice caracter permis in numele token-ului este acceptat ca prim caracter (nu numai litere, ideograme sau underscore); orice nume XML este un XML name token, dar nu orice XML name token este un nume XML
C02 - DS • Posibile valori pentru un atribut: • #IMPLIED – atributul este optional, fara a se da valoare implicita <!ATTLIST prof email CDATA #IMPLIED> • #REQUIRED – atributul este obligatoriu, fara a se da valoare implicita <!ATTLIST prof specializare CDATA #REQUIRED> • #FIXED – valoarea atributului este constanta; atributul are valoarea data, chiar daca nu este mentionat in element; daca este mentionat – trebuie sa aiba valoarea data in declaratia din DTD <!ATTLIST disciplinaprezenta CDATA #FIXED"Da"> • Literal – valoarea implicita este data ca sir de caractere <!ATTLIST prof diriginteNMTOKEN "Nu">
C02 - DS • Declaratii de entitati generale • XML predefineste 5 entitati: <, &, >, ", '. • Un DTD poate sa defineasca si alte entitati cu o declaratie ENTITY – se da un nume (nume XML) si textul cu care se va inlocui entitatea declarata. Textul trebuie sa fie well-formed (poate fi sectiune din document XML). • Exemplu: <!ENTITY super "supercalifragilisticexpialidocious"> • => in document, unde se scrie &super;, la afisare se inlocuieste cu textul dat.
C02 - DS • Entitati parametru (DTD extern) • Este posibil ca mai multe elemente sa aiba o parte din atribute sau specificatii de continut similare. • Exemplu: <!ELEMENT apartment (address, footage, rooms, baths, rent)> <!ELEMENT sublet (address, footage, rooms, baths, rent)> <!ELEMENT coop (address, footage, rooms, baths, price)> <!ELEMENT condo (address, footage, rooms, baths, price)> <!ELEMENT house (address, footage, rooms, baths, price)> • Pentru a nu repeta aceleasi specificatii pentru mai multe elemente, este posibil sa se se declare partea comuna o singura data (astfel – si modificarile se vor efectua intr-un singur loc), care sa fie referita din fiecare declaratie de element.
C02 - DS • Entitati parametru • Entitatea parametru se poate folosi numai intr-un DTD– referinta de entitate parametru – este declarata similar unei entitati generale. • Exemplu – declarare: <!ENTITY % residential_content "address, footage, rooms, baths"> <!ENTITY % rental_content "rent"> <!ENTITY % purchase_content "price"> • Exemplu – utilizare (in DTD-uri externe): <!ELEMENT apartment (%residential_content;, %rental_content;)> <!ELEMENT sublet (%residential_content;, %rental_content;)> <!ELEMENT coop (%residential_content;, %purchase_content;)> <!ELEMENT condo (%residential_content;, %purchase_content;)> <!ELEMENT house (%residential_content;, %purchase_content;)>
C02 - DS • Includere conditionala • Directiva IGNORE se foloseste pentru ignorarea unei sectiuni de declaratii, de catre parser. • Exemplu: <![IGNORE[ <!ELEMENT production_note (#PCDATA)>] ]> • Directiva INCLUDE – se foloseste pentru a specifica cum ca acea sectiune de declaratii chiar este folosita in DTD. • Dar – daca se foloseste o entitate parametru, se poate modifica usor functionalitatea DTD-ului, pe diferite sectiuni: <!ENTITY % caz1 "INCLUDE"> <!ENTITY % caz2 "IGNORE"> <![%caz1; [<!ELEMENT e1 ... >]]> <![%caz2; [<!ELEMENT e2 ... >]]>
C02 - DS • Exemplu DTD (1) <!ELEMENT catedre (catedra*, prof*)> <!ELEMENT catedra (#PCDATA)> <!ATTLIST catedra idc ID #REQUIRED> <!ATTLIST catedra sefi IDREFS #REQUIRED> <!ELEMENT prof (nume, birou?, disciplina+, observatii, diverse?)> <!ATTLIST prof idp ID #REQUIRED> <!ATTLIST prof cat IDREF #REQUIRED> <!ELEMENT nume (#PCDATA)> <!ELEMENT birou (#PCDATA)>
C02 - DS • Exemplu DTD (2) <!ELEMENT disciplina (#PCDATA)> <!ATTLIST disciplina tip CDATA "obl" activitati (C | S | L | CS | CL | CSL) #REQUIRED prezenta CDATA #FIXED "da" x CDATA #IMPLIED > <!ELEMENT observatii (#PCDATA)> <!ENTITY obsP1 SYSTEM "obsP1.txt"> <!ENTITY element_extern SYSTEM "elext.yml"> <!ENTITY text_fix "acesta este textul fix care vreau sa-l inserez"> <!ELEMENT diverse ANY> <!ELEMENT aaa (#PCDATA)> <!ENTITY % continut_elext "#PCDATA"> <!ELEMENT elext (%continut_elext;)>
C02 - DS • Exemplu DTD (3) Continut "obsP1.txt": observatii prof 1 din fisier extern Continut "elext.yml": <elext> continut de element extern </elext>
C02 - DS • Exemplu DTD (4) - XML <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE catedre SYSTEM "profi_ent_ext.dtd"> <catedre> <catedra idc="C1" sefi="P11 P12"> Sisteme Informatice </catedra> <catedra idc="C2" sefi="P21"> Limbaje de programare </catedra> <prof idp="P11" cat="C1"> <nume>prof 1</nume> <birou>333</birou> <disciplina tip ="obl" activitati="CL" prezenta="da" x="optional">bd</disciplina> <disciplina tip ="opt" activitati="CS">ds</disciplina> <observatii>&obsP1;</observatii> </prof >
C02 - DS • Exemplu DTD (5) - XML <prof idp="P12" cat="C1"> <nume>prof 2</nume> <birou>406</birou> <disciplina activitati="C">pdpj</disciplina> <observatii>obs prof 2</observatii> </prof > <prof idp="P21" cat="C2"> <nume>prof 3</nume> <disciplina tip ="fac" activitati="S">curs facultativ</disciplina> <disciplina tip ="opt" activitati="CL">curs optional</disciplina> <observatii>obs prof 3</observatii> <diverse> <aaa> continut divers &text_fix; </aaa> &element_extern; </diverse> </prof > </catedre>
C02 - DS • Exemplu DTD (6) – XML – OUTPUT
C02 - DS • Next C03 • XML Schemas