Sunteți pe pagina 1din 153

Tehnologii XML

Lucian Sasu 30 mai 2007

Cuprins
1 Introducere in tehnologii XML 1.1 Scopul cursului . . . . . . . . . . . . . . . . . 1.2 Prezentare general a . . . . . . . . . . . . . . . 1.3 Tr as aturi ale limbajului XML . . . . . . . . . 1.3.1 Formatul datelor . . . . . . . . . . . . 1.3.2 Limbaj de marcare specic domeniului 1.3.3 Acces programatic facil . . . . . . . . . 1.3.4 Creare u soar a . . . . . . . . . . . . . . 1.3.5 Utilizare u soar a n Internet . . . . . . . 1.3.6 Modelul semistructurat . . . . . . . . . 1.4 Tehnologii nrudite . . . . . . . . . . . . . . . 1.4.1 XSL . . . . . . . . . . . . . . . . . . . 1.4.2 XPath, XLink, XPointer . . . . . . . . 1.4.3 DTD, XSD . . . . . . . . . . . . . . . 1.5 Aplicat ii XML . . . . . . . . . . . . . . . . . . 1.6 Tipuri de instrumente XML . . . . . . . . . . 1.7 Compozit ia unui document XML . . . . . . . 1.7.1 Declarat ia XML . . . . . . . . . . . . . 1.7.2 Elemente . . . . . . . . . . . . . . . . 1.7.3 Atribute . . . . . . . . . . . . . . . . . 1.7.4 Comentarii . . . . . . . . . . . . . . . 1.7.5 Referint e la entit a ti . . . . . . . . . . . 1.7.6 Sect iuni de marcare . . . . . . . . . . . 1.7.7 Instruct iuni de procesare . . . . . . . . 1.8 Spat ii de nume . . . . . . . . . . . . . . . . . 1.9 Buna formare a documentelor XML . . . . . . 1.10 Arborele ata sat unui document XML . . . . . 1.11 Versiunea 1.1 de XML . . . . . . . . . . . . . 3 9 9 9 11 11 11 12 12 12 13 13 13 14 14 14 15 16 16 17 19 22 22 23 23 25 26 28 28

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

4 2 DTD 2.1 Documente valide . . . . . . . . . . . . . . 2.2 Document Type Denition - generalit a ti . 2.3 Declarat ii DTD . . . . . . . . . . . . . . . 2.4 Comentarii n DTD . . . . . . . . . . . . . 2.5 Declarare de elemente . . . . . . . . . . . 2.5.1 Specicarea de cont inut oarecare . 2.5.2 Specicarea cont inutului de tip text 2.5.3 Specicarea elementelor copil . . . 2.5.4 Cont inut mixat . . . . . . . . . . . 2.5.5 Elemente goale . . . . . . . . . . . 2.5.6 Exemplu . . . . . . . . . . . . . . . 3 DTD - continuare 3.1 Declarat ii de entit a ti . . . . . . . . . 3.1.1 Entit a ti interne . . . . . . . . 3.1.2 Entit a ti externe . . . . . . . . 3.2 Declarare de atribute . . . . . . . . . 3.2.1 Generalit a ti . . . . . . . . . . 3.2.2 Atribute f ar a valori implicite . 3.2.3 Tipuri de date pentru atribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS 31 31 32 33 36 37 37 38 39 43 43 44 47 47 47 48 50 50 51 53 59 59 62 62 62 63 63 63 63 63 64 64 64 64 65 65 65 66 66

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 XPath 4.1 Prezentare general a . . . . . . . . . . . 4.2 Modelul de date XPath 1.0 . . . . . . . 4.2.1 Tipul numeric . . . . . . . . . . 4.2.2 Tipul sir de caractere . . . . . . 4.2.3 Tipul logic . . . . . . . . . . . . 4.2.4 Tipul set de noduri . . . . . . . 4.3 Noduri - caracteristici . . . . . . . . . 4.3.1 Numele nodului . . . . . . . . . 4.3.2 Ordinea documentului . . . . . 4.3.3 Relat ia de familie cu alte noduri 4.3.4 Valoarea de string a unui nod . 4.4 Tipuri de noduri . . . . . . . . . . . . 4.4.1 Nodul r ad acin a . . . . . . . . . 4.4.2 Nodul element . . . . . . . . . . 4.4.3 Nodul atribut . . . . . . . . . . 4.4.4 Nodul instruct iune de procesare 4.4.5 Nodul comentariu . . . . . . . . 4.4.6 Nod text . . . . . . . . . . . . .

CUPRINS 4.4.7 Nod spat iu de nume . . . . . . . . Expresii de localizare . . . . . . . . . . . . 4.5.1 Exemplicare . . . . . . . . . . . . 4.5.2 Structura unei expresii de localizare 4.5.3 Axe XPath . . . . . . . . . . . . . 4.5.4 Teste pentru noduri . . . . . . . . . 4.5.5 Predicate XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 66 68 68 69 69 71 71 73 73 74 75 75 77 78 79 80 80 80 81 81 82 82 82

4.5

5 XPath (continuare) 5.1 Funct ii si operatori XPath . . . . . . . . . . . . . . . 5.1.1 Operatori si funct ii pentru tipul boolean . . . 5.1.2 Operatori si funct ii pentru tipul numeric . . . 5.1.3 Funct ii pentru tipul sir de caractere . . . . . . 5.1.4 Operatori si funct ii pentru tipul set de noduri 5.2 XPath 2.0 . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Expresii primare . . . . . . . . . . . . . . . . 5.2.2 Expresii aritmetice . . . . . . . . . . . . . . . 5.2.3 Expresii de localizare XPath 2.0 . . . . . . . . 5.2.4 Expresii secvent a . . . . . . . . . . . . . . . . 5.2.5 Expresii de comparare . . . . . . . . . . . . . 5.2.6 Expresii logice . . . . . . . . . . . . . . . . . . 5.2.7 Expresii for . . . . . . . . . . . . . . . . . . . 5.2.8 Expresii condit ionale . . . . . . . . . . . . . . 5.2.9 Expresii cuanticate . . . . . . . . . . . . . .

6 XSLT 83 6.1 Generalit a ti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.2 Mecanismele XSLT . . . . . . . . . . . . . . . . . . . . . . . . 84 6.2.1 Template-uri . . . . . . . . . . . . . . . . . . . . . . . 86 6.2.2 Elementul xsl:value-of . . . . . . . . . . . . . . . . . 89 6.2.3 Procesarea mai multor elemente cu xsl:for-each . . . 89 6.3 Regulile de template implicite . . . . . . . . . . . . . . . . . . 91 6.3.1 Regula de template implicit a pentru elemente . . . . . 91 6.3.2 Regula de template implicit a pentru noduri text si atribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 6.3.3 Regula de template implicit a pentru instruct iuni de procesare si comentarii . . . . . . . . . . . . . . . . . . 93 6.4 Template-uri pentru valori de atribute . . . . . . . . . . . . . 93 6.5 Specicarea ie sirii la runtime . . . . . . . . . . . . . . . . . . . 94 6.5.1 Inserarea de elemente n documentul de ie sire cu xsl:element 94 6.5.2 Inserarea de atribute n documentul de ie sire cu xsl:attribute 94

CUPRINS 6.5.3 Inserarea de PI n documentul de ie sire cu xsl:processing-instruction 95 6.5.4 Inserarea de comentarii n documentul de ie sire cu xsl:comment 95 6.5.5 Inserarea de text n documentul de ie sire cu xsl:text 95 Moduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 97 99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 . 101 . 101 . 101 . 102 . 102 . 102 . 102 . 102 . 103 . 104 . 108 . 108 . 108 . 108 . 109 . 109 . 110 . 111 . 111 . 111 . 111 . 111 . 113 . 113 . 114 . 114

6.6

7 XSLT (2) 8 XSL-FO 9 XML Schema 9.1 Introducere . . . . . . . . . . . . . . . . . . 9.2 Minusuri ale lui DTD . . . . . . . . . . . . . 9.2.1 Lipsa tipiz arii . . . . . . . . . . . . . 9.2.2 Sintaza non-XML . . . . . . . . . . . 9.2.3 Scalabilitatea redus a . . . . . . . . . 9.2.4 Nesuportarea spat iilor de nume . . . 9.2.5 Structura inexibil a. . . . . . . . . . 9.2.6 Alte limit ari . . . . . . . . . . . . . . 9.3 XSD . . . . . . . . . . . . . . . . . . . . . . 9.4 Tipuri complexe . . . . . . . . . . . . . . . . 9.5 Grupare . . . . . . . . . . . . . . . . . . . . 9.5.1 Grupul xsd:all . . . . . . . . . . . . 9.5.2 Grupul xsd:choice . . . . . . . . . . 9.5.3 Grupul xsd:sequence . . . . . . . . 9.6 Tipuri simple . . . . . . . . . . . . . . . . . 9.6.1 Tipuri numerice . . . . . . . . . . . . 9.6.2 Tipuri pentru reprezentarea timpului 9.6.3 Tipuri de date XML . . . . . . . . . 9.6.4 Tipuri de date sir de caractere . . . . 9.6.5 Tipuri binare . . . . . . . . . . . . . 9.7 Derivare de tipuri . . . . . . . . . . . . . . . 9.7.1 Derivarea prin restr angere . . . . . . 9.7.2 Reuniuni . . . . . . . . . . . . . . . . 9.7.3 Liste . . . . . . . . . . . . . . . . . . 9.8 Elemente goale . . . . . . . . . . . . . . . . 9.9 Atribute . . . . . . . . . . . . . . . . . . . . 10 API-uri pentru XML: DOM 10.1 Introducere . . . . . . . . 10.2 DOM: XML arborescent . 10.3 SAX: XML cu evenimente

si SAX 115 . . . . . . . . . . . . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . . 117 . . . . . . . . . . . . . . . . . . . . 121

CUPRINS

10.4 DOM sau SAX? . . . . . . . . . . . . . . . . . . . . . . . . . . 124 11 XLink si XPointer 11.1 Generalit a ti . . . . . . . . . . . . . . . . . 11.2 XLink . . . . . . . . . . . . . . . . . . . . 11.3 XPointer . . . . . . . . . . . . . . . . . . . 11.3.1 Termeni pentru localizare absolut a 11.3.2 Termeni pentru localizare relativ a . 11.3.3 Sub siruri de caractere . . . . . . . 12 Baze de date si XML 12.1 Extragerea de date n format XML . . . 12.1.1 FOR XML RAW . . . . . . . . . 12.1.2 FOR XML AUTO . . . . . . . . 12.1.3 FOR XML EXPLICIT . . . . . . 12.1.4 FOR XML PATH . . . . . . . . . 12.2 Utilizarea de document XML ca surs a de 12.3 Lucru cu XML ca tip de dat a . . . . . . 12.3.1 Metoda query . . . . . . . . . . . 12.3.2 Metoda value . . . . . . . . . . . 12.3.3 Metoda exist . . . . . . . . . . . 12.3.4 Metoda modify() . . . . . . . . . 12.3.5 Metoda nodes() . . . . . . . . . 12.4 Indexare pe XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 127 127 130 133 133 135

. . . . . . . . . . . . . . . date . . . . . . . . . . . . . . . . . . . . .

137 . 137 . 139 . 143 . 144 . 146 . 147 . 148 . 149 . 150 . 150 . 151 . 151 . 152

CUPRINS

Capitolul 1 Introducere in tehnologii XML


1.1 Scopul cursului

Cursul de Tehnologii XML are drept scop introducerea at at a limbajului XML, c at mai ales a tehnologiilor conexe; intent ion am de asemenea s a trecem n revist a domeniile de utilizare a acestor tehnologii, n str ans a corelat ie cu tipurile de aplicat ii care folosesc XML. Cursul cont ine o prezentare a: limbajului XML modului de validare a unui document XML modurilor de procesare a unui document XML adres arii port iunilor din XML transform arii documentelor XML leg aturii dintre XML si serviciile web suportul XML oferit de c atre sistemele de baze de date de generat ie nou a

1.2

Prezentare general a

XML (Extensible Markup Language) este un metalimbaj propus de c atre World Wide Web Consortium (W3C) care are drept scop dep a sirea unor A probleme legate de limbajele de marcare existente (HTML, L TEX, RTF). XML este un limbaj de marcare, insemn and c a folose ste niste construct ii 9

10

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

specice - elemente - ce precizeaz a modul de structurare a datelor. Spre deosebire de elementele folosite n limbajul HTML, ele nu precizeaz a nimic relativ la modul n care sunt prezentate datele cont inute. Limbajul este extensibil; asta nseamn a c a el permite crearea de elemente n cadrul unui document XML, dup a dorint a programatorului; mai mult dec at at at, un document XML poate include referint e la alte resurse, sau alte tipuri de cont inut. Un exemplu de document XML este dat n listing-ul 1.1: Tabela 1.1: Document XML pentru modelarea unei colect ii de cursuri <?xml version="1.0" ?> <biblioteca> <carte> <titlu>Tehnologii XML</titlu> <autor>Sabin Buraga</autor> <editura>Polirom</editura> </carte> <carte> <titlu>Beginning XML</titlu> <autor>David Hunter</autor> <autor>Kurt Cagle</autor> <autor>Chris Dix</autor> <editura>Wrox Press</editura> </carte> </biblioteca> Observ am ca elementele (biblioteca, titlu, editura) sunt denite in mod convenabil de c atre noi. De asemenea, documentul este evident structurat: biblioteca det ine mai multe c art i, care prezint a drept caracteristici titlul, autorul/autorii, editura. Tot acum remarc am c a elementele denesc si semantica datelor din document. Unul din aspectele remarcabile ale limbajului XML este c a el permite separarea cont inutului, a prezent arii si a interact iunii. Aceasta este o diferent a major a fat a de un document HTML de tipul: <HTML> <HEAD> <TITLE>Exemplu de HTML</TITLE> </HEAD>

ATURI 1.3. TRAS ALE LIMBAJULUI XML <BODY> <CENTER> <H1> Document HTML </H1> </CENTER> Acesta este un document <b>HTML</b> </BODY> </HTML>

11

Remarc am c a documentul de mai sus este de asemenea structurat, dar partea de cont inut este mixat a cu partea de prezentare: de exemplu tag-urile <CENTER> si <b> se refer a la modul de a sare si nu au rol de structurare a cont inutului documentului; n schimb, elementele <HTML>, <HEAD>, <BODY> se refer a la structura documentului HTML. In cazul documentelor de tip XML, ns a, formatarea este precizat a separat (documente CSS sau transform ari XSLT).

1.3
1.3.1

Tr as aturi ale limbajului XML


Formatul datelor

Un document XML este reprezentat ca un sir de caractere; s-a dep a sit astfel bariera reprezent arilor binare care de cele mai multe ori sunt nt elese si produse de un set restr ans de aplicat ii. Accesul la un document XML nu depinde de nici o aplicat ie particular a n parte. Este o situat ie total diferit a de cea a unui sier .mdb, care de si cont ine acelea si date, nu poate interpretat dec at de Access. Altfel spus, semantica datelor nu mai este continut a doar de codul care prelucreaz a datele, ci este dat a n chiar documentul XML. Aceast a facilitate este cunoscut a si sub bumele de auto-descriere, f ac and din documentul XML un tip de date auto-cont inut.

1.3.2

Limbaj de marcare specic domeniului

Oricine poate deni propria structur a de document XML in acord cu propriile interese; un astfel de document poate creat pentru reprezentare de cont inut matematic, al datelor unor tranzact ii imobiliare, formule chimice, descrieri de obiecte grace, datele pentru apelul unei metode, descriere de circuite electronice, etc. Versatilitatea limbajului si faptul c a permite cuiva s a se concentreze pe structurarea cont inutului este unul din atuurile care l-a

12

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

f acut s a e rapid acceptat si folosit. De si n cele din urm a un document XML este destinat unei aplicat ii, alegerea adecvat a a elementelor poate facilita dezvoltarea de programe care s a foloseasc a un asemenea document.

1.3.3

Acces programatic facil

Unul din scopurile declarate de la nceput a fost crearea unui mod de comunicat ie care s a e u sor de integrat n orice limbaj de programare; aceasta face u soar a comunicarea ntre produc atorii de date si aplicat iile de prelucrare sau prezentare a lor. Mai mult dec at asta, comunicarea ntre aplicat ii devine mult mai simpl a, chiar dac a se folosesc platforme diferite. Avem aici n vedere nu doar aplicat iile create cu ultimele tehnologii, ci si cele de tip mo stenit (engl: legacy) care de cele mai multe ori folosesc protocoale si tehnologii proprietare, greu de extins si de interfat at. Datorit a caracterului structurat al unui document XML procesarea lui este mult u surat a. Regulile care denesc buna formare a unui document XML fac parcurgerea unui asemenea document mult mai facil a dec at a unui document HTML, de exemplu.

1.3.4

Creare u soar a

Pentru ca XML s a cunoasc a o adoptare pe scar a larg a a fost nevoie de crearea unui tip de document care s a nu necesite un timp mare de acomodare sau de creare. Regulile care se folosesc pentru crearea unui document XML corect sunt u sor de nt eles; un sier cont in and un document XML se poate scrie cu orice editor de texte standard; din punct de vedere programatic, APIul pentru producerea unui document XML este u sor de utilizat n bibliotecile care nsot esc limbajele de programare.

1.3.5

Utilizare u soar a n Internet

Designerii limbajului XML l-au v azut ca un standard de interoperabilitate, care s a poat a folosit peste infrastructura de comunicat ie existent a (Internet). La ora actual a, XML interact ioneaz a n mod transparent cu protocolul HTTP sau alte protocoale majore de comunicare utilizate curent. Un alt motiv pentru care XML este considerat prietenos fat a de Internet este faptul c a poate utilizat n majoritatea limbajelor folosite n dezvoltarea de aplicat ii Web; pe l ang a suportul oferite de limbajele server-side, amintim si de AJAX - care se bazeaz a pe o comunicare cu serverul folosind JavaScript si XML ca mod de transmitere al mesajelor.

1.4. TEHNOLOGII INRUDITE

13

1.3.6

Modelul semistructurat

Stocarea datelor este o problem a rezolvat a de c atre sistemele de gestiune a bazelor de date. Dar modelarea relat ional a a datelor impune un model rigid, specicat apriori si asupra c aruia este greu de intervenit ulterior. XML-ul, pe de alt a parte, este mai adecvat utiliz arii ntr-un mediu descentralizat, cu surse de date multiple si cu date a c aror structur a variaz a. Desigur, exist a trucuri prin care un SGBD relat ional suport a structur a variabil a, dar rezolv arile nu fac dec at s a simuleze abilit a tile intrinseci ale unui document XML. La ora actual a se remarc a tot mai mult folosirea unor SGBD-uri cu suport nativ pentru ret inerea documentelor de tip XML.

1.4

Tehnologii nrudite

XML vine nsot it de o familie de standarde nrudite ce i asigur a o utilizare mai u soar a n contexte diferite. Tehnologiile majore care se folosesc n context XML sunt: 1. XSL: eXtensible Style Language 2. XPath, XLink, XPointer: limbaje de legare a XML-ului 3. DTD, XSD: scheme XML Ele vor detaliat prezentate pe parcursul cursurilor urm atoare.O prezentare succint a este dat a n cele ce urmeaz a.

1.4.1

XSL

Un document XML poate s a e preluat si transformat ntr-un alt cont inut A - e el HTML, L TEX, RTF, alt document XML sau chiar cont inut binar. Aceste tipuri de transform ari se a a n zona a dou a aplicat ii: XSLT = XSL Transformations XSL-FO = XSL Formatting Objects XSLT este un limbaj de tip recursiv, care specic a transform arile ce trebuie aplicate diferitelor sect ini de document XML pentru a obt ine alte rezultate. Pe l ang a partea de formatare vizual a a datelor, XSLT poate s a fac a si schimbarea ordinii elementelor sau combinarea datelor. Este folosit n special pentru obt inerea de documente HTML sau XML.

14

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

XSL-FO este un document care descrie layout-ul unei pagini. El specic a unde anume ntr-o pagin a se plaseaz a un anumit text n relat ie cu alte elemente de pe pagin a. De asemenea poate ata sa stiluri si fonturi elementelor dintr-o pagin a. Este folosit deseori pentru producerea de documente PDF.

1.4.2

XPath, XLink, XPointer

XPath este folosit la adresarea elementelor dintr-un document XML, pe baza relatiilor ierarhice existente. Poate folosit at at n limbajele de programare clasice (de exemplu pentru selectarea unor noduri care satisfac un anumit crieriu) c at si de c atre alte tehnologii (de exemplu XSLT, pentru identicarea sabloanelor). XLink permite unui element s a devin a o leg atur a c atre un alt document. Mai mult, ea permite denirea de leg aturi extinse (de tip bidirect ional si ntre mai multe documente). XPointer permite adresarea de cont inut din interiorul altui document XML; astfel, se poate face referire la un cont inut particular al unui document (al 4-lea element, de exemplu) sau la un domeniu ntreg dintr-un document, f ar a ca aceasta s a impun a modicarea intr-un fel anume al documentului c atre care se face referire.

1.4.3

DTD, XSD

DTD (Document Type Denition) si XSD (XML Schema Denition) precizeaz a care este structura acceptat a pentru un document XML. Se specic a astfel ce elemente pot ap area ntr-un document XML si ce pot cont ine acestea. In timp ce un document DTD are un format aparte, un document XSD este de tip XML, deci poate procesat cu unelte dedicate XML.

1.5

Aplicat ii XML

Pentru a da o idee despre paleta larg a de aplicat ii n care XML este implicat facem o enumerare (incomplet a) a principalelor direct ii si implement ari: prezentarea c atre utilizator a cont inutului formatare de cont inut pentru browsere: XHTML - Extensible HTML formatare de cont inut pentru browsere din mediul mobil: WML Wireless Markup Language

1.6. TIPURI DE INSTRUMENTE XML grac a vectorial a: SVG formulare electronice: XForms reprezentarea tipurilor de cont inut expresii matematice: MathML formule chimice: CML - Chemical Markup Language notat ie muzical a: MusicML reprezentarea unor cuvinte ce sunt pronunt ate: VoiceXML

15

prezent ari multimedia pentru Web: SMIL - Synchronized Multimedia Integration Language componente pentru interfat a grac a cu utilizatorul: XAML (Extensible Application Markup Language) stocarea documentelor de tip oce: OpenDocument folosit in OpenOce descriere de resurse Web: difuzare de cont inut Web: RSS, ATOM exprimare de ontologii: OWL - Web Ontology Language descriere servicii Web: descriere de servicii Web: WSDL (Web Service Description Language), DISCO descrierea modului de mpachetare a mesajelor pentru comunicare n servicii Web: SOAP - Simple Object Access Protocol procese de afaceri: BPEL4WS - Business Process Execution Language for Web Services, ce dene ste procesele de afaceri care interact ioneaz a cu procese exterioare

1.6

Tipuri de instrumente XML

Pentru a putea folosi tehnologia XML au apa arut o ntreag a colet ie de unelte si tipuri de instrumente: editoare, parsere, vizualizatoare. editoare - de si un document XML poate creat folosind un editor text standard, n mod clar este util a se considera editoare structurale, care veric a dac a documentul respect a un set de canoane, precum si ofer a un suport pentru scrierea rapid a de XML.

16

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

parsere - numite si procesoare sau analizoare; sunt ni ste componente care folosesc structura intrinsec a a unui document XML si permit operat iile pe elemente (g asirea unui element anume, inserarea sau modicarea de elemente, etc). De asemenea parserele sunt folosite pentru a determina dac a un document este bine format (vezi sect iunea 1.9) sau valid (vezi sect iunea 2.1). Scopul lor este de a folosit de c atre aplicat ii. aplicat ii de vizualizare - din aceast a categorie avem browserele (Firefox, Internet Explorer) sau aplicat iile de desenare (SVGViewer) care dau o viziune asupra documentului XML; se bazeaz a pe parsere incluse.

1.7

Compozit ia unui document XML

Un document XML este compus din: 1. declarat ie (sau prolog) 2. elemente 3. atribute 4. comentarii 5. referint e la entit a ti 6. sect iuni de marcare 7. instruct iuni de procesare Inainte de a trece la detalierea acestor constituent i, facem precizarea c a limbajul XML este de tip case-sensitive; astfel, <autor> nu este echivalent cu <Autor>.

1.7.1

Declarat ia XML

Este indicat ca un document XML s a nceap a cu o declarat ie XML care specic a versiunea de limbaj XML folosit a n document. O asemenea declarat ie arat a astfel: <?xml version="1.0" ?>

1.7. COMPOZIT IA UNUI DOCUMENT XML

17

Nu este permis a omiterea num arului de versiune, scrierea de spat iu ntre <, ? si cuv antul xml, schimbarea literelor mari cu mici sau inserarea de spat iu ntre ? de la nal si simbolul >. Declarat ia de XML, dac a este prezent a, trebuie s a e prima entitate din document, nu poate precedat a nici m acar de spat ii. Drept valoare pentru version se poate specica 1.0 sau 1.1. Documentul trebuie s a respecte intern canoanele versiunii precizate, altfel se va declara eroare de c atre parser si orice act iune pe document este ntrerupt a. Alte pseudo-atribute1 care se pot specica pentru acest preambul sunt: 1. encoding - specic a un subset al setului de caractere Unicode care este folosit pentru scriere documentului. Valorile UTF-8 si UTF-16 sunt cele mai des nt alnite si suportate de c atre toate procesoarele de XML, dar se mai pot specica si ISO-8859-1 sau ISO-8859-2 sau altele valide. Dac a nu se specic a nici un tip de codicare, implicit se va considera valoarea UTF-8. In UTF-8 se va folosi un singur byte pentru caractere ASCII (cu num ar de ordine cuprins ntre 0 si 127), 3 octet i pentru seturi de caractere mai put in folosiet (silabe hangul si caractere Han) si 2 octet i pentru majoritatea altor caractere. 2. standalone - atribut opt ional binar (cu valorile yes si no) care specic a dac a acest document face referire la alte documente care cont in denit ii ale unor alte elemente, atribute sau entit a ti. De exemplu, dac a un document XML depinde de un alt document DTD extern, atunci se va specica valoarea no. Prin lips a acest atribut va avea valoarea yes.

1.7.2

Elemente

Un element este unitatea structural a a unui document XML. Datele sunt scrise sub forma unor perechi etichet a de deschidere - etichet a de nchidere ntre care se a a text sau alte sub-elemente. Relat ia este deci de cont inere. Intr-un document XML exist a un unic element care nu are nici un element p arinte, numit element r ad acin a. S a consider am un exemplu de document XML: <?xml version="1.0" encoding="ISO-8859-2"?> <cursuri> <curs titlu="Tehnologii XML">
Acestea nu sunt propriu-zis ni ste atribute, deoarece declarat ia de XML nu este un element.
1

18

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

<capitol> <nume> Introducere </nume> <sectiune> Scopul cursului </sectiune> <sectiune> Prezentare generala</sectiune> </capitol> <capitol> <nume>Definirea tipului de document</nume> <sectiune>Necesitatea definirii tipului</sectiune> <sectiune>DTD</sectiune> </capitol> </curs> </cursuri> Elementul cursuri dene ste r ad acina documentului; el cont ine un element copil (sub-elemente) curs. Elementul curs cont ine dou a elemente copil numite capitol, s.a.m.d. Observ am c a ecare astfel de element este denit printr-o etichet a de deschidere si una de n chidere care are exact acela si nume si mod de scriere a literelor, precedat de caracterul /. Numele unui element poate s a cont in a litere, cifre, minus, dou a puncte, caracter de subliniere; trebuie s a nceap a cu liter a sau cu caracter de subliniere; nu se permite s a nceap a cu sirul xml (indiferent de modul de scriere al literelor) deoarece acest identicator este rezervat. Intre numele propriuzis al elementului si caracterul < nu se permite spat iu. Nu se accept a spat iu n interiorul numelui unui element. Cont inutul unui element poate s a e orice sir de caractere care respect a codicarea dat a n atributul encoding. Dac a n cont inut avem caracterele &, <, > atunci ei trebuie substituit i cu referint e la entitate (vezi 1.7.5) sau cu sect iuni CDATA (1.7.6). Eticheta de n chidere trebuie s a e scris a cu acelea si caractere ca si eticheta de deschidere (XML este case-sensitive). Eticheta de nchidere se scrie sub forma </etichetaelement>; nu se admite spat iu imediat nainte sau dup a simbolul slash. Un element poate s a nu cont in a nici un text - n acest caz este un element gol; de exemplu, pentru situat ia de mai sus putem considera c a ec arui capitol i putem ata sa opt ional o sect iune de exercit ii; pentru cazul n care nu avem o sectiune de acest tip, putem simboliza prin: <exercitii></exercitii> sau echivalent: <exercitii/>

1.7. COMPOZIT IA UNUI DOCUMENT XML

19

Nu se admite ca ntre simbolul / si > sau s a e spat iu; n ultimul caz, se poate l asa un spat iu nainte de caracterul /. O alt a regul a de baz a pentru scrierea elementelor este c a elementele se pot imbrica, dar nu se pot suprapune; altfel spus, daca elementul a cont ine elementul b, atunci b trebuie s a se nchid a naintea lui a. Este permis ca s a mix am textul cu alte elemente n cont inutul altui element, at ata timp c at regulile de mai sus nu sunt nc alcate: <result> The <highlight>company</highlight> is centered on... </result>

1.7.3

Atribute

Atribute denite de utilizator Un atribut permite declararea unei propriet a ti mpreun a cu valoarea asociat a. Ele se denesc pentru elemente, doar n interiorul etichetei de deschidere; au forma: nume="valoare" sau nume=valoare Spre deosebire de atributele din limbajul HTML, valorile trebuie s a e delimitate de apostroafe sau ghilimele. Un element poate avea oric ate atribute, dar un nume de atribut nu poate s a apar a de mai multe ori n cadrul aceluia si element. Valoarea atributului trebuie precizat a (chiar dac a e stringul vid). Plec and de la exemplul 1.1 de la pagina 10, putem rescrie precum n listing-ul 1.2. Numele atributelor se d a dup a acelea si reguli ca la elemente. Remarc am c a n unele cazuri, atributele si valorile lor pot prelua rolul elementelor. Pe l ang a cele denite de utilizator, XML pune la dispozit ie nc a trei atribute predenite: xml:space, xml:lang, xml:id. Atributul xml:space In cazul n care exist a mai multe spat ii albe consecutive, acestea pot considerate redundante sau pot avea o semnicat ie special a si ar trebui p astrate ca atare. Atributul xml:space poate avea dou a valori: default si preserve.

20

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

Tabela 1.2: Rescriere document biblioteca folosind atribute <?xml version="1.0" encoding="ISO-8859-2"?> <cursuri> <curs titlu="Tehnologii XML"> <capitol nume="Introducere "> <sectiune titlu="Scopul cursului"/> <sectiune titlu="Prezentare generala"/> </capitol> <capitol nume="Definirea tipului de document"> <sectiune titlu="Necesitatea definirii tipului"/> <sectiune titlu="DTD"/> </capitol> </curs> </cursuri>

Tabela 1.3: Includere de cod surs a <?xml version="1.0" standalone="yes" ?> <program xml:space="preserve">public class HelloWorld { public static void main (String[] args) { System.out.println("Hello World"); } } </program>

1.7. COMPOZIT IA UNUI DOCUMENT XML

21

Un procesor (parser) XML p astreaz a spat iile si le d a mai departe aplicat iei, indiferent de valoarea atributului xml:space. Aplicat ia este cea care va interpreta acest atribut; dac a este default se va considera c a spat iile multiple adiacente nu sunt relevante si de obicei aplicat ia va face colapsarea lor la unul singur. Pentru valoarea preserve parserul comunic a faptul c a spat iile ar trebui p astrate, altfel spus, c a spat iile sunt semnicative. Relevant a spat iilor depinde de aplicat ia destinat ie n sine: pentru un compilator ele nu sunt importante, dar au relevant a pentru un editor de cod surs a. Deoarece un browser colapseaz a automat spat iile, atunci c and un document XML se ncarc a n browser atributul xml:space va ignorat. Elementele care sunt descendent i ai unui element care are precizat acest atribut vor mo steni atributul cu tot cu valoare, dac a nu cumva se face o precizare explicit a pentru un element anume. Atributul xml:lang Atributul xml:lang descrie limba ( si opt ional de tara) n care este scris cont inutul elementului. Codurile limbii sunt e pe stringuri de 2 caractere (conform standardului ISO639) (de exemplu en sau ro ), e cele dou a plus un calicator (en-US). Tabela 1.4: Exemplu de specicare de limb a pentru cont inutul elementului <text xml:lang="en-GB">This is the color</text> <text xml:lang="en-US">This is the colour</text> Utilitatea acestui element apare din faptul ca o aplicat ie (de exemplu un motor de c autare) ar putea folosi si raporta doar elementele al c aror cont inut este scris ntr-o anumit a limb a, conform preferint elor utilizatorului. Atributul xml:id Exist a o propunere de permite specicarea unui identicator unic pentru ecare element. Pentru aceasta s-ar folosi atributul xml:id, iar pe baza valorii lui s-ar putea face referint e (din interior sau din exterior) la elemente din document. Trebuie ns a tinut cont de faptul c a este doar o recomandare, iar la ora actual a parserele de XML nu suport a toate acest atribut; altfel spus, putem scrie un document in care noduri diferite s a aib a aceea si valoare pentru xml:id, iar nc arcarea ntr-un browser larg utilizat s a nu duc a la raportare de conicte.

22

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML Tabela 1.5: Exemplu de folosire a atributului xml:id

<result id="123" xml:id="123">The given result is ...</result>

1.7.4

Comentarii

Un comentariu XML este o zon a ce va ignorat a de c atre un procesor XML. Ea este delimitat a de <!-- si --> si se poate scrie pe mai multe linii. Comentariile se folosesc pentru scriere de documentat ii sau pentru eliminarea temporar a a anumitor zone. Tabela 1.6: Comentariu n XML <!--sectiunea urmatoare trebuie sa fie mutata --> <inregistrare>continut</inregistrare>

Deoarece comentariile nu sunt elemente, ele pot ap area si nainte de deschiderea elementului r ad acin a, c at si dup a el. Totu si nu se pot pune naintea declarat iei de XML. Un parser de XML poate s a dea mai departe unei aplicat ii cont inutul unui comentariu, dar nu este obligatoriu s a o fac a.

1.7.5

Referint e la entit a ti

Dup a cum se vede, exist a anumite simboluri (mai mic, mai mare, apostrof, ghilimele) care au deja o semnicat ie n cadrul unui document XML: ele sunt folosite pentru elemente sau valori de atribute. Dac a se dore ste folosirea acestor simboluri n cont inutul textual al unui element sau ca valoare de atribut, vor ap area erori de interpretare; spre exemplu, c and un procesor XML g ase ste un simbol < va considera c a urmeaz a o etichet a. Ca atare, ele trebuie s a e substituite si acest lucru se face cu ni ste referint e la entit a ti (aliasuri). O astfel de referint a are forma &entitate;. Deoarece simbolul & este folosit pentru referint e la entitate (deci este si el un simbol rezervat XML), pentru gurarea lui se va folosi o alt a referint a. Tabelul 1.7 cont ine referint ele la entitate predenite. Exemplul 1.8 arat a cum se folosesc n cadrul unui cont inut de document. Mai mult dec at at at, exist a posibilitatea cre arii unor componente care pot reutilizate n interiorul unui document XML. Aceste componente (numite

1.7. COMPOZIT IA UNUI DOCUMENT XML Tabela 1.7: Entit a tile la referint a predenite Simbol Entitate < &lt; > &gt; &quot; &apos; & &amp;

23

Tabela 1.8: Folosirea de referint e la entit a ti <cod> for (int i = 0; i &lt;= tab.length; i++ ) { </cod> <magazin>Tata &amp; fiul</magazin> <client nume=O&apos;Brien />

entit a ti) care au un nume unic ata stat pot ulterior referite. Pentru denirea de entit a ti (interne sau externe), a se vedea sect iunea 3.1.

1.7.6

Sect iuni de marcare

Sunt cazuri n care vrem s a includem ntr-un document p art i ntregi care nu trebuie procesate ca si cont inut XML, ci luate a sa cum sunt. Este cazul n care avem text ce cont ine multe aparit ii ale caracterelor din sect iunea 1.7.5. De si se poate face substituirea ec arui caracter conform celor ar atate, exist a o variant a mai simpl a, bazat a pe folosirea sect iunilor de marcare (numite si sec tiuni CDATA). Sintaxa unei astfel de sect iuni este <![CDATA[ . . . ]]>. In locul punctelor se va pune textul care va redat de c atre parser ad-literam. O astfel de sect iune se poate pune oriunde este accepat cont inut de tip text; se folose ste deseori la includerea de cod surs a formatat.

1.7.7

Instruct iuni de procesare

Instruct iunile de procesare nu sunt destinate parserului de XML ci au drept scop precizarea unor act iuni care trebuie ndeplinite de c atre un nivel superior. O asemenea instruct iune ncepe cu <? si se termin a cu ?>. Un parser XML este obligat s a trimit a mai departe aplicat iei aceast a instruct iune

24

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML Tabela 1.9: Sect iune CDATA cu cod C#

<cod limbaj="C#"> <![CDATA[ internal static void Afisare(params int[] sir) { for(int i=0; i<sir.Length; i++) { Console.WriteLine("elementul de indice {0}: {1} este pozitiv: {2}", i.ToString(), sir[i].ToString(), sir[i] >= 0); } } ]]> </cod>

de procesare. Instruct iunile de procesare pot avea drept efect lansarea unei aplicat ii auxiliare, care este determinat a de ceea ce urmeaz a imediat dup a <?. Tabela 1.10: Instrut iune de procesare pentru stil <?xml-stylesheet type="text/xml" href="formatter.xsl"?>

Singura combinat ie care nu se poate folosi n interiorul unei instruct iuni de procesare este ?>, care semnic a sf ar situl instruct iunii. In rest pot folosite orice caractere, chiar si cele care n mod normal ar produce probleme unui procesor de XML: Tabela 1.11: Alt exemplu de instruct iune de procesare <?php echo "Bellu & comp: <<Viitorul suna bine>>"; ?>

1.8. SPAT II DE NUME

25

1.8

Spat ii de nume

D and posibilitatea de a crea un element sau atribut cu orice nume, exist a o mare sans a ca acela si nume s a e folosit n locuri diferite (din acela si document sau nu) cu semnicat ii diferite. Avem ns a posibilitatea de a deni ni ste spat ii de nume (eng: namespaces) care s a permit a precizarea contextului n care este folosit un anumit element sau atribut. Exemplu: s a presupunem c a se concep documente XML pentru cataloage de muzic a; sunt dou a tipuri surse de provenient a a pieselor muzicale - soli sti sau grupuri, respectiv dou a tipuri de creat ie muzical a - respectiv c antece individuale si albume; pentru primul caz vom folosi elementul artist, iar pentru creat ie - titlu. Problema apare dac a vrem s a trat am diferent iat cazurile respective, de exemplu vrem s a select am doar titlurile care apart in grupurilor. Tabela 1.12: Utilizare de elemente cu spat ii de nume <?xml version="1.0" encoding="UTF-8"?> <muzica xmlns:grup="http://discografie.ro/grupuri" xmlns:solist="http://discografie.ro/solist"> <creatie> <grup:nume>Compact</grup:nume> <grup:titlu>Fata din vis</grup:titlu> </creatie> <creatie> <solist:nume>Nicu Alifantis</solist:nume> <solist:titlu>Decembrie</solist:titlu> </creatie> </muzica> Atributul xmlns este folosit pentru a deni spat ii de nume (grup si solist), c arora li se ata seaz a un URI. Dac a URI-ul este un URL, atunci nu este obligatoriu ca acesta s a corespund a unei locat ii zice. Un astfel de spat iu de nume poate specicat si pentru un atribut; de asemenea, spat iul de nume se poate deni n chiar elementul pentru care se specic a spat iul de nume, dar nu mai t aarziu. Calicarea numeDeSpatiu:element sau numeDeSpatiu:atribut se nume ste nume calicat (engl: Qualied Name, QName). Declarat iile de spat iu de nume n care dup a xmlns urmeaz a dou a puncte si titlul unui spat iu de nume

26

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML Tabela 1.13: Spat iu de nume folosit specicat pentru atribut

<?xml version="1.0" encoding="UTF-8"?> <muzica> <grup:creatie xmlns:grup="http://discografie.ro/grupuri" grup:nume="Compact" grup:titlu="Fata din vis"/> <solist:creatie xmlns:solist="http://discografie.ro/solist" solist:nume="Nicu Alifantis" solist:titlu="Decembrie"/> </muzica>

se numesc explicite. Un spat iu de nume poate si implicit, dac a nu se specic a titlul spat iului de nume. Tabela 1.14: Declarat ie de spat iu de nume implicit <?xml version="1.0" encoding="UTF-8"?> <contacte> <client xmlns="http://discografie.com"> <nume>...</nume> <adresa>...</adresa> </client> <furnizor>...</furnizor> </contacte> In exemplul 1.14, spat iul de nume implicit este cu adresa http://discografie.com, denit at at pentru elementul contacte c at si pentru elementele nume si adresa. Elementul furnizor ns a nu mai face parte din acela si spat iu de nume.

1.9

Buna formare a documentelor XML

Dup a cum s-a v azut p an a acum, XML d a posibilitatea cre arii propriului limbaj de structurare a datelor; cu toat a aceast a exibilitate, trebuie s a respect am un set minim de reguli care asigur a buna-formare a documentului. Aceste reguli (de bun simt , n cele din urm a) permit unui procesor XML s a proceseze documentul; este total opusul a ceea ce se nt ampl a ntr-un document HTML scris cu un anumit grad de incorectitudine, care n interiorul

1.9. BUNA FORMARE A DOCUMENTELOR XML

27

unui browser este completat automat pentru a putea reprezentat. Altfel spus, un parser de XML nu are voie s a aduc a corect ii asupra documentelor XML, a sa cum se nt ampl a n cazul unui browser. Scrierea unui parser de XML devine n acest caz mult mai u soar a dec at a unui parser de HTML; n plus un asemenea procesor de XML poate folosit pe orice document care respect a regulile de bun a formare. Pentru ecare constituent al unui document XML regulile de scriere au fost prezentate la momentul introducerii lor. Cele mai importante sunt: orice document trebuie s a aib a un singur element r ad acin a orice etichet a de deschidere trebuie s a aib a o nchidere asociat a; elementele goale trebuie s a aib a o nchidere corect a elementele trebuie s a e imbricate corect valorile atributelor se delimiteaz a prin ghilimele sau apostroafe numele de elemente si atribute trebuie formate cu un anumit set de caractere Remarc am c a nu se cere prezent a declarat iei XML. Toate regulile enumerate denesc un document ca ind bine format - deci, de fapt, ca ind un document XML. Este destul de u sor de g asit rat iunea aceastor cerint e; de exemplu, pentru cea de a doua regul a (care nu este obligatorie n limbajul de marcare HTML) putem considera situat ia: <p>Paragraf 1 <p>Paragraf 2 A sa cum este denit limbajul HTML, reiese c a cele dou a elemente para graf sunt de acela si nivel, si nu unul cont inut n altul. In momentul a su arii, un browser adaug a el la sf ar situl ec arui paragraf eticheta de nchidere </p>. Situat ia este cu totul alta ntr-un document XML. Deoarece XML nu fort eaz a folosirea etichetelor dintr-o anumit a colect ie, parserul va trata neutru declarat ia de mai sus si va nt elege c a al doilea paragraf este cont inut n primul ( si asta numai dac a am si nchiderile de elemente corespunz atoare) o interpretare cu totul deosebit a de cea de la HTML.

28

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

1.10

Arborele ata sat unui document XML

Modul de reprezentare a datelor ntr-un document XML element r ad acin a care cont ine elemebnte care cont in la r andul lor elemente, etc, ne duce cu g andul la o reprezentare des nt alnit a n informatic a: cea a unui arbore, a c arui r ad acin a corespunde elementului r ad acin a, copii lui sunt elementele descendete ale r ad acinii, etc. De exemplu, pentru documentul XML din listingul 1.15 reprezentarea arborescent a este cea din gura 1.10. Tabela 1.15: Document XML <?xml version="1.0"?> <curs> <titlu>Tehnologii XML</titlu> <capitol> <nume>Introducere</nume> <sectiune>Scopul cursului</sectiune> <sectiune>Prezentare generala</sectiune> </capitol> <capitol> <nume>Definirea tipului de document</nume> <sectiune>Necesitatea definirii tipului</sectiune> <sectiune>DTD</sectiune> <exercitii/> </capitol> </curs>

1.11

Versiunea 1.1 de XML

Versiunea unui document XML este denit a de valoarea pentru atributul version n declarat ia de XML. XML 1.0 este construit pe baza standardului Unicode 2.0, pe c and XML 1.1 intent ioneaz a s a nu mai e dependent de o anume versiune de Unicode. Concret, numele de elemente sau de atribute pot s a e scrise cu caractere de alt tip dec at cele bazate pe alfabetul latin (de exemplu cambodgian a). In afar a de asta, s-au mai introdus alte tipuri de caractere pentru care nu exista suport n XML 1.0; dar impactul lor este neglijabil. Pentru moment se recomand a declararea versiunii 1.0, deoarece sunt put ine procesoare de XML care pot accept a version="1.1".

1.11. VERSIUNEA 1.1 DE XML

29

Figura 1.1: Arborele asociat documentului XML din exemplul1.15

30

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

Capitolul 2 DTD
2.1 Documente valide

XML este un meta-limbaj de marcare, care vine ca un set de reguli despre cum arat a un document bine format. Aceasta d a posibilitatea autorilor de a- si structura dup a dorint a documentele. Problema apare n momentul n care avem de-a face cu mai multe surse de documente XML, dar care trebuie procesate de o aceea si aplicat ie. Cum ne asigur am de faptul c a o aplicat ie va putea nt elege de ecare dat a documentele pe care le prime ste? Dac a documentul provine de la un alt utilizator, cum putem s a ne asigur am c a s-au folosit acelea si denumiri de etichete si atribute, si c a acestea respect a un format comun pentru toat a colect ia de documente? Altfel spus: cum specic am gramatica documentului? Exact ca si n limbile naturale care beneciaz a de seturi de reguli gramaticale care explic a cum se ajunge la o form a corect a de exprimare, la fel avem mecanisme n XML care permit specicarea unor reguli de validitate. Acestea sunt: Document Type Denition XML Schema Relax NG Schematron Namespace Routing Language Namespace-based Validation Dispatching Language 31

32

CAPITOLUL 2. DTD

Toate aceste mecanisme au ceva n comun: denesc schema pentru un document XML; validatoarele de XML pot s a proceseze documentul mpreun a cu aceast a schem a si s a spun a dac a documentul respect a schema. Pe l ang a caracteristica de bun a formare a unui document XML (a se vedea 1.9), mai ad aug am si pe aceea de validitate : spunem c a un document XML este valid dac a este bine format si se conformeaz a unei scheme ata sate. Un set de documente valid fat a de o schem a poate trece mai departe la o aplicat ie care s a fac a uz de datele cont inute. Lipsa unor scheme poate duce, n schimb, la haos si gestionare greoaie. Este echivalentul denirii unei structuri zice ntr-o baz a de date, structur a care trebuie s a e replicat a ntr-un sistem de tip distribuit. Document Type Denition (DTD) este cel mai comun mod de denire al unei scheme. Este (cronologic) primul mod de specicare a gramaticii pentru XML; de si are destui concurent i, este larg folosit.

2.2

Document Type Denition - generalit a ti

O denit ie a tipului de document const a ntr-o serie de declarat ii. Acestea precizeaz a elementul r ad acin a al unui document, elementele, atributele, precum si relat iile dintre ele. De exemplu, se poate preciza c a elementele de tip client trebuie s a cont in a un atribut idClient, trei elemente copil: nume, adresa de livrare, adresa de facturare si opt ional elemente de observat ii. Fiecare document XML valid trebuie s a specice un document DTD fat a de care se va face validarea. Acest document DTD se poate specica e n interiorul documentului XML, e n exterior, folosinduse o referint a. De cele mai multe ori documentele DTD se scriu cu set de caractere codicate ASCII sau UTF-8; dac a se folose ste o alt a codicare, atunci documentul DTD ncepe cu un o declarat ie asem an atoare cu cea de la XML: <?xml encoding="ISO-8859-2"?> S a consider am exemplul unui document XML care cont ine: <?xml version="1.0" encoding="utf-8" ?> <helloSchema> Vreau o schema!</helloSchema> Schema o putem include ntre declarat ia de XML si elementul r ad acin a astfel: <!DOCTYPE helloSchema [ <!ELEMENT helloSchema (#PCDATA)> ]>

2.3. DECLARAT II DTD

33

(schema nu este senzitiv a la modul de rupere a r andurilor, dar face distinct ie ntre litere mici si mari). La fel de bine am putea salva schema ntr-un sier separat (de exemplu n acela si director, cu numele mySchema.dtd); acesta va cont ine: <!ELEMENT helloSchema (#PCDATA)> Referirea la schem a s-ar face atunci prin: <!DOCTYPE helloSchema SYSTEM "mySchema.dtd"> Detaliile de sintax a vor l amurite n sect iunile urm atoare; tot ceea ce trebuie nt eles acum este c a am denit gramatica documentului - acesta trebuie s a cont in a elementul r ad acin a helloSchema, iar cont inutul acestui element este un sir de caractere ce va procesat de c atre parser (PCDATA provine de la Parsed Character Data). Dac a ncerc am s a ad aug am un atribut la elementul r ad acin a, atunci se va semnala eroare de c atre un parser care face si validare, deoarece acest atribut nu este specicat n schema documentului.

2.3

Declarat ii DTD

Un document XML cu pretent ii de validitate exprimat a n form a de DTD va include o declarat ie de document dup a declarat ia de XML. Aceast a declarat ie poate s a includ a denit ia DTD, s a fac a referire la un document DTD extern sau ambele. O declarat ie DTD1 are forma: <!DOCTYPE numeElementRadacina SYSTEM adresa URL a subsetului DTD extern [ subset DTD intern ]> Printr-o asemenea declarat ie se arat a c a documentul XML este o instant a a tipului denit de DTD. Un document XML poate s a aib a doar o singur a declarat ie DOCTYPE. Specicatorul SYSTEM se declar a atunci c and documentul XML este tinut undeva extern (pe acela si site de pe care provine documentul XML sau un altul, sau ntr-o locat ie specicabil a fat a de documentul XML), si n plus dac a este folosit n interiorul unei comunit a ti sau grup restr ans. URL-ul poate s a e absolut sau relativ, asa cum se exemplic a n listing-ul 2.1. Dac a DTD-ul este specicat extern, pseudo-atributul standalone din declarat ia documentului XML trebuie s a e prezent si s a aib a valoarea no.
A nu se confunda declarat ia DTD cu denit ia DTD si declarat ia de element/atribut: un document XML va referi un DTD prin intermediul unei declarat ii DTD, un document sau o sect iune DTD cont ine declarat ii care denesc structura documentului XML.
1

34

CAPITOLUL 2. DTD Tabela 2.1: Declarat ii de DTD extern

<!-- adresa completa --> <!DOCTYPE clients SYSTEM http://domeniu.eu/clienti.dtd> <!-- adresa absoluta, pornind din directorul radacina al serverului web--> <!DOCTYPE SEASON SYSTEM /xml/dtd/clienti.dtd> <!-- 2 adrese relative la locatia documentului xml --> <!DOCTYPE SEASON SYSTEM dtds/clienti.dtd> <!DOCTYPE SEASON SYSTEM ../clienti.dtd>

Se poate opta pentru denirea intern a a DTD-ului, a sa cum s-a exemplicat n sect inea 2.2; n acest caz, specicatorul SYSTEM si URL-ul pot lipsi. A sa cum arat a sintaxa pentru declarat ia XML, este chiar permis ca s a avem ambele moduri de declarare: at at referint a extern a, c at si cont inere n interior. O situat ie n care avem ambele declarat ii simultan este cea n care exist a elemente comune care se vor trece n subsetul extern, pentru documente XML nrudite si elemente specice (ce se vor declara deci intern). De exemplu avem r ad acina contacte care ntr-un caz cont ine nume si adresa, iar n alt caz nume ia pentru nume) ar trecut n si numar telefon. Elementul comun (declarat sierul contacte.dtd, iar structura r ad acinii si elementele specice (adresa, respeciv num arul de telefon) vor declarate n documentele corespunz atoare, asa cum este dat n listing-ul 2.2. Indiferent de varianta pentru care se opteaz a, nu este permis ca un element s a e declarat de dou a ori - altfel se declar a eroare de validare. Cuv antul SYSTEM din declarat ia DTD poate substituit cu PUBLIC, pentru cazul n care documentul DTD referit este disponibil public, nu doar la nivel de comunitate. Este cazul n care asociat ii mari pot standardiza documentele DTD n conformitate cu un domeniu de activitate. Documentele XML care beneciaz a de DTD-uri publice pot scrise de persoane din afara asociat iilor respective; este de asemenea de presupus c a documentul DTD nu va modicat ulterior, deoarece s-ar ajunge la invalidarea documentelor XML valide p an a atunci. Pentru cazul unor DTD-uri publice mai trebuie precizat si numele DTDului: <!DOCTYPE numeleElementuluiRadacina PUBLIC

2.3. DECLARAT II DTD

35

Tabela 2.2: Mixare de declarat ie extern a si intern a Documentul contacte.dtd: <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT nume (#PCDATA) > Documentul contacte1.xml: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE contacte SYSTEM "contacte.dtd" [ <!ELEMENT contacte (nume, adresa)> <!ELEMENT adresa (#PCDATA)> ]> <contacte> <nume>Popescu Ion</nume> <adresa>Bucuresti</adresa> </contacte> Documentul contacte2.xml: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE contacte SYSTEM "contacte.dtd" [ <!ELEMENT contacte (nume, numar_telefon)> <!ELEMENT numar_telefon (#PCDATA)> ]> <contacte> <nume>Ionescu Maria</nume> <numar_telefon>0799 1231234</numar_telefon> </contacte>

36 nume DTD URL DTD>

CAPITOLUL 2. DTD

URL DTD este acela si lucru ca n cazul declar arii DTD-ului ca ind de tip SYSTEM. Nume DTD reprezint a numele public al documentului de denire a tipului, pe care anumite procesoare XML l pot c auta ntr-un depozit de denit ii. Numele DTD-ului poate s a cont in a caractere alfanumerice ASCII, spat ii, caractere de r and nou si caracterele: -()+,/:=?;!*#@$ %. Exist a c ateva convent ii care se respect a pentru scrierea acestor nume. Prexul numelui se formeaz a astfel: dac a DTD-ul este un standard ISO, atunci identicatorul public ncepe cu identicatorul ISO. dac a DTD-ul este aprobat de o organizat ie non-ISO, atunci numele ncepe cu caracterul + dac a DTD-ul nu e aprobat de c atre nici o organizat ie, atunci numele lui ncepe cu caracterul Aceste prexe sunt urmate de dou a caractere slash (//), apoi de numele entit a tii care a denit DTD-ul, dublu slash, tipul de document pe care l descrie, apoi de un identicator de limb a, conform standardului ISO-639. De exemplu, pentru un document HTML se poate s a avem declarat ia DTD astfel: <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN DTD/xhtml1-transitional.dtd> ceea ce arat a c a este un standard care nu e nc a ocial acceptat de o organizat ie, este propus de c atre World Wide Web Consortium (W3C) si se refer a la documente XHTML versiunea 1.0 (deci e de a steptat ca documentul s a e de fapt XHTML). Tot de aici deducem c a elementul r ad acin a este html.

2.4

Comentarii n DTD

Este posibil si chiar indicat s a se includ a comentarii ntr-un document DTD. Acestea pot specica scopul n care s-a denit documentul, eventualele drepturi de copiere, sau pot delimita sect iuni ale documentului. Includerea unui comentariu se face n acela si mod ca la XML sau HTML: <!-- acesta este un comentariu pe doua linii --> <!-- elementul radacina-->

2.5. DECLARARE DE ELEMENTE

37

2.5

Declarare de elemente

Elementele denesc structura documentului XML. Pentru un DTD ata sat unor documente valide va trebui s a declar am ecare element ce se poate folosi; altfel spus, tot ceea ce nu este explicit declarat este interzis a se folosi. Pentru ecare element declar am care sunt atributele pe care le poate avea, sub-elementele care l compun, care este ordinea elementelor copil, de c ate ori trebuie/pot s a ap ar a ecare din ele. Cea mai natural a abordare este pornirea de la elementul r ad acin a (oricum este specicat n declarat ia DTD si trebuie s a apar a ntrun document XML) si dezvoltarea documentului cu elemente aate tot mai ad anc n arbore. Se ajunge la un proces iterativ, n care DTD-ul este specicat pe m asur a ce se adaug a date la documentul XML. Ment ion am c a exist a si aplicat ii care pornind de la un document XML deduc (construiesc) n mod automat documentul DTD asociat. Forma general a de specicare a unui element este: <!ELEMENT numeElement specificatorElement> Declarat ia este senzitiv a la tipul caracterelor. Specicatorii de element vor prezentatt i n cele ce urmeaz a. Declarat ia poate scris a pe mai multe r anduri, dar nu poate s a cont in a comentarii.

2.5.1

Specicarea de cont inut oarecare

Cea mai permisiv a declarat ie DTD este aceea care spune c a un element poate avea orice tip de cont inut, e el sir de caractere, alte elemente, sau mix ari ale acestora. Acest lucru se face prin scrierea specificatorElement ca ind ANY - listing-ul 2.3. Tabela 2.3: Specicare de element de tip ANY <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE exempluElement [ <!ELEMENT exempluElement ANY> ]> <exempluElement> text</exempluElement>

Chiar dac a specic am ANY, nu se permite s a se foloseasc a drept cont inut al lui exempluElement un element care nu a fost declarat. Astfel, dac a p astr am

38

CAPITOLUL 2. DTD Tabela 2.4: Eroare: includere de element nedeclarat

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE exempluElement [ <!ELEMENT exempluElement ANY> ]> <exempluElement> <elementNedeclarat> Document invalid </elementNedeclarat> </exempluElement>

DTD-ul din exemplul 2.3 si scriem un document XML ca n listing-ul 2.4, atunci se va raporta o eroare de validare. Cu toate acestea, este permis a se scrie precum n listing-ul 2.5. Tabela 2.5: Document valid <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE exempluElement [ <!ELEMENT exempluElement ANY> ]> <exempluElement> <exempluElement> Document valid </exempluElement> </exempluElement>

De si ANY este un mod permis de declarare a unui element, ar trebui evitat a folosirea lui masiv a, pentru c a s-ar ajunge la aberat ii semantice prin includerea unor elemente ca si copii ai altor elemente cu care nu se a a n relat ie. Este ns a modul n care se poate porni un document DTD, dup a care se pot face ran ari succesive.

2.5.2

Specicarea cont inutului de tip text

Elementele pot cont ine date n dou a moduri: ca valori de atribute sau direct ntre elementul de deschidere si nchidere. Pentru primul caz vom da modul de declarare n sect iunea 3.2. Pentru al doilea caz putem avea

2.5. DECLARARE DE ELEMENTE

39

specificatorElement ca ind (#PCDATA) (Parsed Character Data) - a se vedea exemplul 2.6. Tabela 2.6: Specicare cont inut de tip text <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE exempluElement [ <!ELEMENT exempluElement (#PCDATA)> ]> <exempluElement> Document valid </exempluElement>

Dac a pentru documentul XML de mai jos s-ar folosi acela si DTD, atunci am avea eroare: cont inutul elementului exempluElement nu poate s a e un alt element, ci strict numai un sir de caractere: <exempluElement> <exempluElement> Document invalid </exempluElement> </exempluElement> De notat c a specicatorul #PCDATA nu impune nici o restrict ie asupra textului; nu avem nici un mecanism prin care s a specic am c a textul dat trebuie s a aibe un anumit format (de exemplu dou a cuvinte separate prin virgul a si spat iu, sau dat a calendaristic a n formatul zz/ll/aaaa) sau o lungime minim a/maxim a admis a.

2.5.3

Specicarea elementelor copil

De cele mai multe ori, un element cont ine alte elemente. DTD permite specicarea urm atoarelor detalii relativ la dispunerea acestor elemente: care sunt elementele copil ale unui element care este ordinea n care apar elementele copil faptul c a un element copil este opt ional sau trebuie s a apar a cel put in o dat a sau poat a s a apar a de oric ate opri, inclusiv niciodat a care sunt subelementele ntre care se pot face alegeri, la un moment dat

40

CAPITOLUL 2. DTD

Pentru cazul declar arii elementelor copil, specificatorElement se substituie cu lista elementelor copil desp art ite prin virgul a. Aceast a list a este scris a ntre paranteze: <!ELEMENT parinte (copil1, copil2, ...)> List a specic a urm atoarele: 1. elementul numit parinte trebuie s a cont in a toate elementele copil; 2. ordinea elementelor copil este cea specicat a - nu se admit permut ari ale lor. S a presupunem c a dorim s a declar am un element numit persoana pentru care s a specic am obligatoriu numele si prenumele, sub form a de elemente ce cont in text: Tabela 2.7: Element cu dou a elemente copil <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> </persoana> Declarat ia DTD pentru elementul persoana ar trebui s a e: <!ELEMENT persoana (nume, prenume)> unde, re ste, nume si prenume se declar a ca av and cont inut de tip PCDATA: <!ELEMENT nume (#PCDATA)> <!ELEMENT prenume (#PCDATA)> Declarat ia pentru persoana va invalida un document care cont ine: <persoana> <prenume>Rafael</prenume> <nume>Ionescu</nume> </persoana> Vom ar ata ulterior cum anume se specic a o list a de elemente care pot ap area n orice ordine. S a consider am c a pentru ecare persoana, mai vrem s a permite ad augarea unor elemente numite observatie, dup a elementul prenume. Vom considera cele trei cazuri care pot ap area:

2.5. DECLARARE DE ELEMENTE 1. avem cel mult o observat ie; 2. avem cel put in o observat ie; 3. avem oric ate observat ii, posibil niciuna.

41

Pentru primul caz vom specica opt ionalitatea sub folosind caracterul ? dup a numele elementului observatie: <!ELEMENT persoana (nume, prenume, observatie?)> In acest context, sunt valide at at ce s-a scris n exemplul 2.7, c at si ce este n listing-ul 2.8. Tabela 2.8: Includerea elementului de observatie <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> <observatie>glumet</observatie> </persoana> Pentru al doilea caz cel put in o observat ie va trebui s a folosim simbolul + dup a cel al elementului observatie: <!ELEMENT persoana (nume, prenume, observatie+)> Pentru aceast a declarat ie, exemplu 2.7 devine invalid, dar exemplul 2.8 este acceptat, precum si elementul persoana din exemplul 2.9: Tabela 2.9: Element persoana cu mai multe observat ii <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> <observatie>glumet</observatie> <observatie>optimist</observatie> </persoana> Pentru ultimul caz - cel n care se permite precizarea elementului observatie de oric ate ori sau omiterea lui, avem declarat ia DTD:

42

CAPITOLUL 2. DTD

<!ELEMENT persoana (nume, prenume, observatie*)> Aceast a declarat ie va valida exemplele 2.7, 2.8, 2.9. Se permite folosirea multiplicatorilor ?, +, * pentru mai multe elemente copil ale aceluia si element: <!ELEMENT persoana(nume, prenume+, observatie*, adresa?)> Not am ca nu avem nici un mecanism prin care s a limit am (ca minim sau maxim) num arul de aparit ii ale unui element copil. Multiplicatorii pot folosit i ca sux si pentru grup ari date de paranteze. De exemplu, dac a vrem s a model am o colect ie n care ecare intrare este o pereche de elemente, vom folosi declarat ia: <!ELEMENT colectie (valoare1, valoare2)+ > DTD permite ca pentru un element, un copil s a e o variant a din mai multe posibile. De exemplu, putem considera c a pentru a lua leg atura cu o persoan a, putem apela la adres a de email sau numar de telefon; dac a una din aceste modalit a ti este specicat a, ne putem declara mult umit i. Alegerea se specic a dup a schema: <!ELEMENT numeElement (optiune1 | optiune2 | ....)> De remarcat c a numai o opt iune poate folosit a. Pentru cazul nostru avem: <!ELEMENT contact (email | telefon)> S a consider am urm atoare declarat ie DTD: <!ELEMENT persoana (nume|prenume)+ > Printre altele, aceasta ne permite ca s a avem element persoana care poate avea dou a elemente copil (nume si prenume) specicate n orice ordine. Dar de asemenea ne permite s a omitem elementul prenume, sau s a repet am oricare din cele dou a elemente de oric ate ori, ceea ce nu e corect. De fapt, declarat ia de mai sus se traduce prin: elementul persoana trebuie s a cont in a m acar un nume sau un prenume, iar ordinea si num arul pentru mai multe astfel de elemente sunt indiferente. Pentru a cere specicarea celor dou a elemente n orice ordine vom folosi declarat ia: <!ELEMENT persoana ( (nume, prenume) | (prenume, nume) ) >

2.5. DECLARARE DE ELEMENTE

43

Remarc am gruparea perechilor de elemente prin paranteze - nivelul de imbricare al elementelor prin folosire de paranteze poate oric at de mare, cu condit ia ca parantezele s a se nchid a si deschid a corect. Solut ia dat a este limitat a, ns a, deoarece dac a un element ar cont ine n elemente copil, atunci n declarat ia DTD ar trebui specicate toate cele n! combinat ii, ceea ce e nepractic. Iat a un exemplu mai complex folosind grup ari si multiplicatori, preluat din [1]: <!ELEMENT PRODUCER ( (GIVEN_NAME, (MIDDLE_NAME | MIDDLE_INITIAL)*, SURNAME?) | ((MIDDLE_NAME | MIDDLE_INITIAL)+, SURNAME) | SURNAME )>

2.5.4

Cont inut mixat

Un element poate s a cont in a at at text, c at si elemente. Declarat iile de mai sus nu sunt suciente pentru acest lucru, dar prin combinarea unor p art i ale lor se obt ine efectul dorit: <!ELEMENT numeDeElement1 (#PCDATA | numeDeElement2)*> Dat a ind folosirea multiplicatorului *, structura este extrem de ne ngr adit a: elementul interior poate s a lipseasc a sau s a apar a de oric ate ori, cont inutul de tip text poate s a se ae n orice pozit ie fat a de elementul copil, iar elementul declarat poate s a e chiar gol. De ret inut ns a c a nu putem permuta #PCDATA si numeDeElement2 n declarat ia anterioar a. Acest tip de cont inut se folose ste deseori c and se introduc elemente ce scot n evident a anumite port iuni. De exemplu, putem avea: <paragraf> Acesta este un text cu <sublineniere>sublinieri</sublineniere> si <ingrosat>text ingrosat<ingrosat> </paragraf>

2.5.5

Elemente goale

Exist a posibilitatea de a folosi elemente f ar a cont inut; e aceste elemente au datele cont inute n atribute, e au rol decorativ (de exemplu pentru ruperea de r anduri sau introducerea unor elemente grace - a se vedea elementele <br /> si <hr /> din (X)HTML). Pentru a declara un element care nu are cont inut se folose ste:

44 <!ELEMENT numeElement EMPTY>

CAPITOLUL 2. DTD

2.5.6

Exemplu

Se consider a documentul XML de mai jos: <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE contacte SYSTEM "contacte.dtd"> <contacte> <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> <observatie>Este <subliniat>de incredere</subliniat></observatie> <contact> <telefon>123123</telefon> </contact> </persoana> <persoana> <prenume>Ioana</prenume> <nume>Popescu</nume> <observatie>Cumsecade</observatie> <observatie><italic>Vorbeste</italic> 8 limbi straine</observatie> <contact> <adresa>Brasov</adresa> </contact> </persoana> </contacte> Documentul DTD asociat este o concentrare a tot ceea ce s-a exemplicat n sect iunile anterioare. Vom pune deci n preambulul documentului anterior: <!DOCTYPE contacte SYSTEM "contacte.dtd"> iar sierul contacte.dtd, aat n acela si director cu documentul XML va cont ine: <?xml version="1.0" encoding="UTF-8"?> <!-- contacte este elementul radacina --> <!ELEMENT contacte (persoana)* > <!-- copiii radacinii --> <!ELEMENT persoana ( ((nume, prenume) |

2.5. DECLARARE DE ELEMENTE (prenume, nume)), observatie+, contact ) > <!--copiii elementului persoana --> <!ELEMENT nume (#PCDATA)> <!ELEMENT prenume (#PCDATA)> <!ELEMENT observatie (#PCDATA | subliniat | italic)* > <!ELEMENT contact (adresa|telefon)> <!--parte de continut mixat in observatie--> <!ELEMENT subliniat (#PCDATA)> <!ELEMENT italic (#PCDATA)> <!-- declararea subelementelor din contact --> <!ELEMENT adresa (#PCDATA)> <!ELEMENT telefon (#PCDATA)>

45

46

CAPITOLUL 2. DTD

Capitolul 3 DTD - continuare


3.1 Declarat ii de entit a ti

A sa cum s-a spus n partea de prezentare a cont inutului unui document XML, avem posibilitatea de a declara ni ste componente (sau entit a ti) care s a e ulterior referite. Avem astfel de entit a ti deja denite pentru anumite simboluri: <, &, etc. Putem ns a s a mbog a tim documentul XML cu entit a ti, care pot face referint a la un buc a ti de text, siere externe n format XML sau nu (text simplu sau chiar format binar). Orice document XML cont ine m acar o entitate - a sa numita entitate document, format a din declarat ia de XML, declaratia de tip de document, elementul r ad acin a. Aceast a entitate nu are nume, spre deosebire de alt a entitate care poate creat a suplimentar. Entit a tile se declar a n DTD. Pot interne - declarate complet n DTD si externe - referite n DTD, dar cu cont inut aat la un URL. De asemenea, mai avem un criteriu - formatul entit a tii: astfel avem entit a ti procesabile1 care sunt compatibile cu XML si neprocesabile2 - a c aror includere ar strica buna formare a documentului XML.

3.1.1

Entit a ti interne

Entit a tile interne sunt alias-uri care se denesc pentru port iuni de text. Putem avea astfel entit a ti de tip caracter sau de tip text. Pentru entit a tile de tip caracter, este vorba utilizarea unui substitut pentru codurile ISO ale unor caractere ce nu se a a n setul standard ASCII. De
1 2

Engl: parsed entities Engl: unparsed entities

47

48

CAPITOLUL 3. DTD - CONTINUARE

` putem proceda astfel: e foloexemplu, dac a vrem s a obt inem caracterul E, sim referint a &#2003 , e declar am o entitate caracter cu un nume sugestiv: <!ENTITY Egrave "&#200;"> In text referirea la acest caracter s-ar face cu: &Egrave; iar parserul l va ` nlocui cu caracterul E. Un exemplu de entitate text este dat mai jos: <!ENTITY semnatura "Lucian Sasu"> Peste tot unde apare: &semnatura; n documentul XML, parserul va interveni si va nlocui cu secvent a de text dintre ghilimele. O asemenea entitate intern a poate s a cont in a chiar si elemente XML, scrise pe mai multe r anduri; resc, trebuie ca prin includerea elementului s a nu se afecteze validitatea documentului XML. De exemplu, dup a procesarea fragmentului de document: <?xml version="1.0"?> <!DOCTYPE mesaj [ <!ELEMENT mesaj ANY> <!ENTITY semnatura "<nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> " > ]> <mesaj> Salutari si numai bine &semnatura; </mesaj> va rezulta (fragment): <mesaj> Salutari si numai bine <nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> </mesaj>

3.1.2

Entit a ti externe

O entitate extern a refer a o resurs a ce nu este complet denit a n DTD. Forma pentru entit a ti externe procesabile este:
3

Codul a fost luat de pe Internet, c aut and dupa ISO entity set

I 3.1. DECLARAT II DE ENTITAT <!ENTITY numeEntitate SYSTEM URI>

49

Cuv antul SYSTEM poate nlocuit cu PUBLIC. URI dene ste locat ia resursei, iar aceasta se presupune a o colect ie de elemente prin a c arei includere nu se va afecta validitatea documentului XML. S a presupunem de exemplu c a avem un sier numit contact.txt cont in and: <nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> Not am c a acesta nu este un document XML (nu are element r ad acin a). Declararea unei entit a ti care s a indice spre aceast a resurs a, precum si utilizarea ei se poate face prin4 : <?xml version="1.0"?> <!DOCTYPE mesaj [ <!ELEMENT mesaj ANY > <!ENTITY semnatura SYSTEM "contact.txt" > <!-- se declara si elementele nume si adresa --> ]> <mesaj> Salutari si numai bine &semnatura; </mesaj> Documentul XML nc arcat n Internet Explorer5 este (fragment): <mesaj> Salutari si numai bine <nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> </mesaj> O entitate extern a procesabil a poate s a e chiar un document XML, dar nu are voie s a posede o denit ie de tip de document; validarea ei se va face la includere n documentul care l refer a, pe baza DTD-ului referentului. In sf ar sit, putem declara o entitate extern a care nu este compatibil a cu cont inutul unui document XML. Exemplul clasic este cel al declar arii unei resurse de tip imagine care va ulterior referit a: <!ENTITY logo SYSTEM ./images/logo.gif NDATA gif>
Trebuie spus c a documentul XML obt inut nu este valid dac a nu se face declararea celor dou a elemente aate n sierul contact.txt. 5 Parserul folosit de c atre Mozilla Firefox versiunea 2 nu face nc arcarea entit a tilor externe.
4

50

CAPITOLUL 3. DTD - CONTINUARE

Evident, nc arcarea unui sier binar de tip gif ar distruge orice pretent ie de bun a formare a doucmentului XML, motiv pentru care orice parser va l asa aplicat ia de care a fost apelat s a proceseze corespunz ator resursa. Specicatorul NDATA arat a c a resursa declarat a nu este compatibil a XML, iar gif din nalul declarat iei va precizat ulterior ntr-o declarat ie de tip NOTATION (a se vedea sect iunea 3.2.3).

3.2
3.2.1

Declarare de atribute
Generalit a ti

Elementele pot cont ine date sub forma valorilor de atribute. Pentru ecare element ce suport a atribute se poate specica n DTD lista numelor atributelor si pentru ecare atribut, tipul valorii si eventuala valoare implicit a. Declarat ia DTD pentru un atribut este: <!ATTLIST numeElement numeAtribut tipAtribut optiune> unde numeElement determin a elementul pentru care se dene ste atributul, numeAtribut este numele atributului ce se dene ste, tipAtribut reprezint a tipul de date al atributului, iar optiune specic a ce se nt ampl a dac a vrem s a omitem atributul din element.Vom considera n exemplele imediat urm atoare c a opt iunea este atribuirea unei valori implicite, deci optiune se nlocuie ste cu valoarea implicit a, delimitat a de ghilimele sau apostroafe. Pentru cazul n care un element are mai multe atribute, atunci e se va scrie c ate o declarat ie DTD pentru ecare atribut, e se combin a ntr-o singur a declarat ie ATTLIST. Exemplu: dac a consider am documentul XML: <contacte> <persoana nume="Ionescu" prenume="Rafael"/> </contacte> atunci o variant a de document DTD asociat este: <!DOCTYPE contacte[ <!ELEMENT contacte <!ELEMENT persoana <!ATTLIST persoana <!ATTLIST persoana ]> (persoana+ )> EMPTY> nume CDATA "nume nespecificat"> prenume CDATA "prenume nespecificat">

Pentru moment, preciz am doar c a CDATA arat a c a atributul poate s a e un sir de caractere, ce nu se pot intepreta ca elemente de marcare; lista complet aa

3.2. DECLARARE DE ATRIBUTE

51

posibilit a tilor este dat a n sect iunea 3.2.3. A sa cum am ment ionat, cele dou a declarat ii ATTLIST se pot scrie astfel: <!ATTLIST persoana nume CDATA "nume nespecificat" prenume CDATA "prenume nespecificat"> Spre deosebire de declarat iile pentru sub-elemente, atributele nu sunt obligatoriu s a apar a n ordinea specicat a. Aceste atribute cu valori implicite sunt des folosite n XHTML. De exemplu, pentru un tabel se poate prevedea faptul c a marginea are grosimea 0, iar distant a ntre celule este nul a.

3.2.2

Atribute f ar a valori implicite

DTD-ul anterior are o problem a: ne permite s a introducem elemente persoana pentru care s a nu specic am numele sau prenumele. In funct ie de natura aplicat iei c areia i sunt destinate datele, acest lucru poate acceptabil sau nu. In funct ie de atitudinea noastr a fat a de acest aspect, putem apela la una din urm atoarele posibilit a ti: 1. #REQUIRED 2. #IMPLIED 3. #FIXED Unul din cei trei specicatori se va situa n locul valorii implicite. Specicatorul #REQUIRED Pentru cazul n care vrem s a cerem specicarea unei valori a atributului. Nu se admite astfel nici o valoare implicit a. Pentru cazul n care dorim s a specic am c a at at numele c at si prenumele din exemplul anterior sunt mandatorii, vom scrie: <!ATTLIST persoana nume CDATA #REQUIRED prenume CDATA #REQUIRED> Solicit am astfel celui care creeaz a documentele XML s a dea o informat ie minim a. Mai trebuie s a sper am c a aceast a valoare de atribut este si adecvat a din punct de vedere semantic.

52 Specicatorul #IMPLIED

CAPITOLUL 3. DTD - CONTINUARE

Exist a cazuri n care am vrea ca un anumit atribut s a e prezent; dar dac a nu este precizat, atunci nu avem cum s a furniz am o valoare implicit a care s a e bun a pentru toate cazurile. Pentru aceasta se folose ste cuv antul #IMPLIED. S a presupunem de exemplu c a pentru o persoan a vrem s a permitem specicarea sub forma unui atribut a unei adrese de email pentru contact. In acest caz vom specica atributul astfel: <!ATTLIST persoana email CDATA #IMPLIED > Specicatorul #FIXED In alte situat ii se cere ca un atribut, dac a este prezent, s a nu poat a avea o alt a valoare dec at una aprioric specicat a. Sintaxa general a este: <!ATTLIST numeElement numeAtribut tipAtribut #FIXED valoareFixa> De exemplu, s a presupunem c a pentru ecare judet avem un document XML cu contacte; pentru elementul r ad acin a vom avea un atribut numit judet care s a e xat, n funct ie de provenient a documentului. Pentru Bra sov am avea: <!ATTLIST contacte judet CDATA #FIXED Brasov> Aceasta va permite scrierea de elemente precum: <contacte> ... </contacte> sau <contacte judet=Brasov> ... </contacte> dar nu si: <contacte judet=BRASOV> ... </contacte> <!-- valoarea de atribut fixat e case sensitive--> sau <contacte judet=Sibiu> ... </contacte> <!-- alta valoare decat cea specificata in DTD-->

3.2. DECLARARE DE ATRIBUTE

53

3.2.3

Tipuri de date pentru atribute

Pentru atribute, putem apela la o palet a de tipuri de date mult mai bogat a dec at n cazul elementelor. Sunt 10 tipuri de date care se pot specica pentru un atribut: CDATA, NMTOKEN, NMTOKENS, ID, IDREF, IDREFS, enumerare, ENTITY, ENTITIES, NOTATION. Tipul CDATA De departe cel mai popular ( si permisiv) tip de atribut, tipul CDATA (character data) este precizat pentru cazul in care valorile pot orice caractere, mai put in semnele de mai mic, ampersand si simbolurile folosite pentru delimitarea valorii acelui atribut. Aceste caractere se vor scrie folosind entit a tile la referint a predenite (a se vedea sect iunea 1.7.5). Tipul NMTOKEN Tipul NMTOKEN (name token) restrict ioneaz a valoarea unui atribut: aceasta trebuie s a respecte urm atoarele: cont ine doar cifre, litere, caracterul minus, caracterul de subliniere, punct, dou a puncte. Principala restrict ie resimt it a este c a nu pot cont ine spat iu. Exemplu: pentru declarat ia <!ATTLIST element atribut NMTOKEN #IMPLIED> urm atorul element este valid: <element atribut=valoare_simpla/> pe c and: <element atribut=valoare cu spatiu/> nu e acceptat a. Tipul NMTOKENS Pentru a accepta drept valoare de atribut mai multe valori de tip NMTOKEN separate prin spat ii s-a introdus tipul NMTOKENS. Astfel, exemplul anterior este valid dac a tipul pentru atribut este NMTOKENS.

54 Tipul ID

CAPITOLUL 3. DTD - CONTINUARE

Un atribut declarat de tip ID va trebui s a aibe o valoare unic a n acel document. Valoarea pentru un asemenea atribut trebuie s a nceap a cu liter a sau caracter de subliniere si poate cont ine litere, caractere de subliniere si cifre. De cele mai multe ori pentru un astfel de atribut se specic a #REQUIRED, niciodat a #FIXED. Tipul IDREF Valoarea unui atribut declarat de tip IDREF este un ID care se reg a se ste n acela si document. Este des folosit a pentru a simboliza leg atura de la copii la p arint i. Exemplic am aceasta prin modelarea listei de personal dintr-o fabric a, n care orice angajat (cu exceptia unora, se) este subordonat unui unic angajat. Vom conveni ca pentru cei care nu sunt subordonat i nim anui s a i model am ca ind proprii lor se. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fabrica [ <!ELEMENT fabrica (angajat+)> <!ELEMENT angajat EMPTY> <!ATTLIST angajat nume CDATA #REQUIRED id ID #REQUIRED idSef IDREF #REQUIRED> ]> <fabrica> <angajat nume="Popescu" id="no1" idSef="no1"/> <angajat nume="Ionescu" id="no2" idSef="no1"/> <angajat nume="Vasilescu" id="no3" idSef="no1"/> <angajat nume="Georgescu" id="no4" idSef="no2"/> </fabrica> Am modelat astfel o relat ie de tip mult i la unu. Mai ad aug am c a situat ia celor care nu sunt subordonat i nim anui poate reprezentat a si altfel: se cere ca atributul idRef de tip IDREF s a e nu #REQUIRED, ci #IMPLIED; n acest caz sei cei mari nu vor avea atributul idSef. Tipul IDREFS Pentru cazul n care valoarea unui atribut poate s a cont in a mai multe valori de tip ID separate prin spat ii. Pentru exemplul precedent, putem vedea relat ia invers: un angajat are un atribut cu valorile cont in and identicatorii

3.2. DECLARARE DE ATRIBUTE

55

celor pe care i are ca subordonat i direct i. Atunci documentul de mai sus s-ar putea rescrie astfel: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fabrica [ <!ELEMENT fabrica (angajat+)> <!ELEMENT angajat EMPTY> <!ATTLIST angajat nume CDATA #REQUIRED id ID #REQUIRED idSubordonati IDREFS #IMPLIED> ]> <fabrica> <angajat nume="Popescu" id="no1" idSubordonati="no2 no3"/> <angajat nume="Ionescu" id="no2" idSubordonati="no4"/> <angajat nume="Vasilescu" id="no3" /> <angajat nume="Georgescu" id="no4" /> </fabrica> Am modelat deci o relat ie de tip unu-la-mult i. De asemenea acest tip ne permite s a model am relat ii de tip mult i la mult i. Exemplic am mai jos pentru cazul relat iei dintre entit a tile c art i si autori: o carte poate scris a de mai mult i autori, un autor poate s a scrie mai multe c art i. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE biblioteca [ <!ELEMENT biblioteca (autor|carte)+> <!ELEMENT autor EMPTY> <!ELEMENT carte EMPTY> <!ATTLIST autor nume CDATA #REQUIRED idAutor ID #REQUIRED cartiScrise IDREFS #REQUIRED> <!ATTLIST carte titlu CDATA #REQUIRED idCarte ID #REQUIRED scrisaDe IDREFS #REQUIRED> ]> <biblioteca> <autor nume="autor 1" idAutor="a1" cartiScrise="c1 c2"/> <autor nume="autor 2" idAutor="a2" cartiScrise="c1 c2"/> <autor nume ="autor 3" idAutor="a3" cartiScrise="c3"/> <carte titlu="carte 1" idCarte="c1" scrisaDe="a1 a2"/>

56

CAPITOLUL 3. DTD - CONTINUARE

<carte titlu="carte 2" idCarte="c2" scrisaDe="a1 a2"/> <carte titlu="carte 3" idCarte="c3" scrisaDe="a3"/> </biblioteca> Tipul enumerare Exist a situat ii n care vrem ca valorile unui atribut s a e alese dintr-o list a prestabilit a. DTD d a posibilitatea enumer arii valorilor eligibile, din care se poate specica doar una. Formatul general este: <!ATTLIST numeElement numeAtribut (valoare1 | valoare2 | ...) specificator> Exemplu: <sectiune vizibilitate=vizibil>....</sectiune> pentru care declarat ia DTD ar : <!ATTLIST sectiune vizibilitate (vizibil | ascuns) vizibil> Tipul ENTITY Pentru atribute putem da valori specicate ca entit a ti. S a reconsider am declarat ia de entitate extern a: <!ENTITY logo SYSTEM ./images/logo.gif NDATA gif> In acest context putem cere unui atribut s a aib a drept valoare o entitate declarat a: <!ATTLIST image source ENTITY #REQUIRED> si atunci e valid a se specica: <image source=logo/> Parserul va nlocui logo cu calea denit a anterior pentru entitate. Este responsabilitatea aplicat iei care preia rezultatul pars arii s a manipuleze n mod adecvat sierul images/logo.gif. Modul de manipularea tipului de entitate (gif, precizat n nalul declarat iei de entitate) trebuie s a e precizat ntr-o declarat ie DTD de tip NOTATION - a se vedea prezentarea dedicat a.

3.2. DECLARARE DE ATRIBUTE Tipul ENTITIES

57

Un atribut de tip ENTITIES poate avea drept cont inut mai multe valori ENTITY separate prin spat ii. Exemplu: vom construi un document XML pentru modelarea unui album de fotograi: <album> <continut ordine="poza1 poza2 poza3"/> </album> DTD-ul asociat ar putea (fragment): <!ELEMENT album (continut+)> <!ELEMENT continut EMPTY> <!ATTLIST continut ordine ENTITIES #REQUIRED> <!ENTITY poza1 SYSTEM ./images/poza1.gif NDATA gif> <!ENTITY poza2 SYSTEM ./images/poza2.gif NDATA gif> <!ENTITY poza3 SYSTEM ./images/poza3.gif NDATA gif> Ca si pentru tipul ENTITY, trebuie precizat prin declarat ie de tip NOTATION formatul datelor de tip gif. Tipul NOTATION Pentru cazul n care documentul XML refer a entit a ti externe incompatibile cu canoanele formatului XML, ar de dorit s a se precizeze aplicat iei care apeleaz a parserul cum anume vor procesate entit a tile. Aceasta se poate face de exemplu prin precizarea tipului resursei (majoritatea browserelor stiu s a manipuleze cont inut de tip jpg, gif, pdf) sau prin precizarea aplicat iei care se va folosi pentru procesarea lor. Forma general a este: <!NOTATION numeTip SYSTEM idExtern> unde numeTip apare n nalul unei declarat ii de tip ENTITY pentru entit a ti externe neprocesabile, iar idExtern d a o indicat ie despre modul de procesare al entit a tii. Exemplu: <!NOTATION gif SYSTEM image/gif> unde image/gif reprezint a descriere MIME standard. Se poate folosi identicatorul PUBLIC n loc de SYSTEM (discut ia ind asem an atoare cu cea de la referirea la un DTD extern); astfel, putem avea:

58

CAPITOLUL 3. DTD - CONTINUARE

<!NOTATION GIF PUBLIC "-//IETF/NOSGML Media Type image/gif//EN" "http://www.isi.edu/in-notes/iana/assignments/media-types/image/gif">

Capitolul 4 XPath
4.1 Prezentare general a

XPath (XML Path Language) este un limbaj utilizat epntru adresarea port iunilor unui document XML sau pentru efectuarea de calcule pe baza cont inutului XML. Ca funct ionalitate este asem an ator cu instruct iunea SELECT din limbajul SQL. Dup a cum se va vedea, limbajul nu este de tip XML si se bazeaz a pe structura de arbore a documentului (a se vedea arborele din gura 4.1 asociat documentului XML din listing-ul 4.1). Acest arbore este format din noduri, care includ: comentarii, instuct iuni de procesare, sect iuni CDATA, elemente, atribute, chiar si declarat ia de XML. Avem un nod r ad acin a naintea oric arui cont inut al documentului; plec and de la acest nod se poate reg asi orice nod sau grup de noduri, pe baza caracteriz arii lor. Selectarea nodurilor se face pe baza unor expresii de localizare. Mai general, se pot deni expresii care s a e evaluate de XPath. XPath are dou a utiliz ari majore: reg asirea nodurilor (ulterior acestea vor procesate n afara XML-ului, de c atre cod scris ntr-un limbaj de programare oarecare) si ca auxiliar pentru XSLT unde precizeaz a sabloanele si permite adresarea diferitelor p art i dintr-un nod. Exist a dou a versiuni de XPath: 1.0 publicat ca recomandare W3C n noiembrie 1999 si versiunea 2.0 dat tot ca recomandare n 23 ianuarie 2007. Un exemplu simplu de expresie XPath pentru listingul anterior este: /curs/capitol/nume care va returna o colect ie format a din dou a noduri: <nume>Introducere</nume> <nume>Definirea tipului de document</nume> 59

60

CAPITOLUL 4. XPATH

Tabela 4.1: Document XML <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/css" href="mystyle.css"?> <studenti> <!-- un student --> <student nume="Popescu" prenume="Rafael"> <adresa>Brasov</adresa> <limba_straina nivel="foarte bine">engleza</limba_straina> <limba_straina nivel="bine">franceza</limba_straina> <hobby>Programarea extrema</hobby> <an>2</an> </student> <!-- o studenta --> <student nume="Ionescu" prenume="Maria"> <adresa> Brasov </adresa> <limba_straina nivel="foarte bine">franceza</limba_straina> <limba_straina nivel="bine">germana</limba_straina> <hobby>Arhitectura</hobby> <an>3</an> </student> </studenti>

4.1. PREZENTARE GENERALA

61

Figura 4.1: Arborele XPath pentru documentul din listing-ul 4.1.

62

CAPITOLUL 4. XPATH

4.2

Modelul de date XPath 1.0

XPath const a dintr-o serii de expresii care sunt evaluate; dup a evaluare trebuie s a se returneze un rezultat de un anumit tip, specic XPath. Exist a 4 tipuri de date denite pentru versiunea 1.0 de XPath: numeric sir de caractere logic set de noduri

4.2.1

Tipul numeric

Exemplu: expresia /studenti/student[2] care se refer a la al doilea element student aat sub r ad acin a folose ste expresia XPath 2 pentru precizarea num arului de ordine. Aceast a expresie se evalueaz a la valoarea cont inut a. Un tip numeric reprezint a numere n virgul a mobil a, conform standardului IEEE 754; ca atare poate reprezenta numere ntregi si rat ionale, NaN (Not-a-Number), , 0. Nu se poate folosi notat ia stiint ic a, deci 2.0E +3 nu este recunoscut ca 2000. Numerele pot folosite ca argument pentru funct ii matematice predenite n XPath sau n combinat ii cu operatori matematici.

4.2.2

Tipul sir de caractere

Este un alt tip de dat a, prin care se reprezint a orice sir de zero sau mai multe caractere Unicode. Un astfel de sir de caractere se delimiteaz a prin apostroafe sau ghilimele. Exemplu: pentru a determina tot i studentii care sunt din Brasov vom folosi: /studenti/student[adresa="Brasov"] Aici am folosit tipul sir de caractere pentru a specica literalul Brasov. Pentru cazul n care se folosesc n interiorul sirului de caractere delimitatorii de sir, se pot substitui cu referint ele la entit a ti predenite introduse n sect iunea 1.7.5.

4.3. NODURI - CARACTERISTICI

63

4.2.3

Tipul logic

Expresiile pot cont ine condit ii care sunt evaluate la true/false, de tip boolean; de exemplu, pentru ecare element student din documentul XML dat expresia logic a adresa="Brasov" are valoarea true.

4.2.4

Tipul set de noduri

Seturile de noduri reprezint a punctul de interes major n XPath. O expresie XPath poate evaluat a la o mult ine ce cont ine 0, 1 sau mai multe noduri; procesarea acestei colect ii poate f acut a apoi dintr-un alt limbaj. Putem folosi expresii care se evalueaz a la setul tuturor nodurilor de un anumit tip, sau un set de noduri poate s a rezulte n urma unei operatt ii de ltrare. De exemplu expresia //hobby va produce o list a de dou a hobby-uri declarate.

4.3

Noduri - caracteristici

Fiecare nod din document are propriet a tile: nume, ordine n document, relat ia de familie cu alte noduri si valoarea de string.

4.3.1

Numele nodului

Cele mai multe noduri (dar nu toate) au nume. Exist a trei feluri de nume: numele calicat : este de fapt QName, sau Qualied Name a sa cum e denit n sect iunea 1.8 - numele elementului eventual prexat de numele de spat iu; de exemplu contracte:persoana, unde contracte reprezint a un spat iu de nume. numele local este numele calicat f ar a prexul dat de spat iul de nume; pentru exemplul anterior este persoana. numele expandat - dac a nodul este asociat cu un spat iu de nume, atunci numele expandat este o pereche, const and din URI-ul ata sat spat iului de nume si numele local al nodului.

4.3.2

Ordinea documentului

Nodurile din document au o pozit ie relativ a fat a de altele. De exemplu elementu r ad acin a este naintea elementelor copil. In ce priveste atributele, se specic a faptul c a ele sunt naintea elementelor copil cont inute. Datorit a ns a faptului c a atributele pot permutate (chiar n prezent a unui DTD), nu

64

CAPITOLUL 4. XPATH

exist a nici o ordine presatbilit a a acestora, ordinea de raportare depinz and de implementarea aplicat iei XPath.

4.3.3

Relat ia de familie cu alte noduri

Pe l ang a ordinea dat a de document avem relat ii complexe ntre noduri: unele noduri sunt copii ai altor noduri, alt ii sunt v azut i ca frat i, sau ca str amo si - toate deriv and din structurarea documentului.

4.3.4

Valoarea de string a unui nod

Orice nod are si un text asociat; de exemplu, textul unui nod de tip comentariu este ceea ce urmeaz a dup a <!-- p an a la nchiderea asociat a. Valoarea acestora va precizat a la prezentarea ec arui tip de nod n parte.

4.4

Tipuri de noduri

XPath vede ntregul document XML ca o colect ie de noduri, organizate sub forma unui arbore. Exist a 7 tipuri de noduri pe care le recunoa ste XPath 1.0: 1. nod r ad acin a 2. nod element 3. nod atribut 4. nod instruct iune de procesare 5. nod comentariu 6. nod text 7. nod spat iu de nume

4.4.1

Nodul r ad acin a

Nodul r ad acin a reprezint a primul nod din arborele XPath. El se refer a prin expresia XPath / si cont ine de fapt tot documentul XML. Nu trebuie f acut a confuzie ntre nodul r ad acin a si elementul r ad acin a. Orice cale XPath care ncepe cu caracterul / semnic a pornirea de la acest nod r ad acin a. In XPath 2.0 numele de nod r ad acin a s-a nlocuit cu cel de nod document.

4.4. TIPURI DE NODURI

65

Numele local al nodului r ad acin a este sirul vid si nu are un nume expandat. Valoarea sa string este concatenarea valorilor de tip string pentru toate nodurile text.

4.4.2

Nodul element

Un nod element este compus din eticheta de start, de sf ar sit mpreun a cu tot ce se a a ntre acestea. Referirea unui asemenea nod se face at at pornind de la nodul r ad acin a, c a si de la alte noduri. Un exemplu de expresie XPath care aduce un nod plec and de la nodul r ad acin a este /studenti. Numele local al unui nod element este eticheta nodului. Numele calicat este eticheta prexat a cu identicatorul spat iului de nume iar numele expandat este URI-ul asociat spat iului de nume plus eticheta. Valoarea de string este concatenarea valorilor pentru toate nodurile text cont inute (direct sau ca descendent i indirect i).

4.4.3

Nodul atribut

Un nod element care are atribute este v azut ca nod p arinte al ec arui atribut ( n viziunea XPath; este diferit a de viziunea DOM, unde aceast a relat ie nu exist a). Se pot referi aceste noduri atribut, iar valoarea lor poate folosit a e n interiorul XPath, e ntr-un limbaj de programare. Nu exist a noduri atribut corespunz atoare declarat iilor de spat ii de nume. Pentru a obt ine valoarea atributului nume din primul elementr student al documentului XML anterior se poate folosi /studenti/student[1]/@nume. Prexul de spat iu de nume al atributului este cel declarat n atribut, nu se preia cel de la elementul cont in ator. De exemplu pentru xml:id este xml. Valoarea string este valoarea normalizat a a atributului (normalizare nseamn a eliminarea spat iilor de la nceputul si sf ar situl sirului si substituirea mai multor spat ii consecutive cu unul singur - dac a nu cumva stringul este considerat CDATA).

4.4.4

Nodul instruct iune de procesare

De asemenea se pot referi si nodurile instruct iune de procesare (noduri PI). Deoarece aceste instruct iuni de procesare nu sunt destinate parserului de XML, ele sunt v azute ca un simplu sir de caractere care ncepe de dup a <? si se termin a cu ?>. Nu exist a modalit a ti directe de accesare a pseudo-atributelor type si href din instruct iunea de procesare exempli-

66

CAPITOLUL 4. XPATH

cat a1 . Pentru determinarea listei tuturor elementelor de procesare se folose ste //processing-instruction(). Numele local al unui nod PI este tinta declarat a (ceea ce urmeaz a dup a <? p an a la primul spat iu). Deoarece o instruct iune de procesare nu are spat iu de nume, numele expandat si calicat cont in ca parte de spat iu de nume null. Valoarea de string este tot ce se a a ntre tinta declarat a si partea de nchidere ?>. In cazul de mai sus este type="text/css" href="mystyle.css".

4.4.5

Nodul comentariu

Nodurile comentariu au ca valoare sirul de caractere dintre <!-- si -->. Nu au nici un fel de nume. Aducerea tuturor comentariilor din document, indiferent de nivelul la care se a a se face cu //comment().

4.4.6

Nod text

XPath aloc a noduri cont inutului de tip text al elementelor. De exemplu, pentru primul element adresa din listing-ul 4.1 avem un nod text: Brasov. Dac a elementul cont ine sub-elemente, instruct iuni de procesare sau comentarii atunci pot rezulta mai multe elemente text pentru un singur element. De exemplu, dac a avem: <p>text 1<br/>text 2</p> atunci vor rezulta dou a noduri text cont in and text1 si text2. Mult imea nodurilor text din document se obt ine cu: //text(). Un nod text nu are nume local, QName sau nume expandat. Valoarea lui string este sirul de caractere cont inut.

4.4.7

Nod spat iu de nume

Nodurile spat ii de nume nu sunt direct vizibile precum nodurile anterioare. Fiecare element are un set de spat ii de nume, c ate unul pentru ecare prex de spat iu de nume care este accesibil elementului. Chiar si pentru elementele pentru care nu se folose ste un spat iu de nume avem implicit declarat xml, conform XML Namespaces Recommendation. Un element are c ate un nod spat iu de nume pentru: 1. ecare atribut care declar a un spat iu de nume
Dar se pot folosi funct ii care lucreaz a pe siruri de caractere pentru a face parsarea sirului
1

4.4. TIPURI DE NODURI

67

2. ecare atribut al unui element cont in ator al c arui nume ncepe cu xmlns: 3. ecare atribut numit xmlns denit pentru element sau un element p arinte Exemplu: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <xsl:template match="//planets"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:variable name="myPosition" select="3"/> <xsl:template match="planet"> <p> <xsl:value-of select="$myPosition"/> </p> </xsl:template> </xsl:stylesheet> Prexul xsl este asociat cu URI-ul http://www.w3.org/1999/XSL/Transform si orice element care are prexul xsl va avea un nod spat iu de nume cu valoarea http://www.w3.org/1999/XSL/Transform. Avem si spat iul de nume implicit cu URI-ul http://www.w3.org/1999/xhtml care se folose ste pentru orice element care nu are prex. In sf ar sit, mai avem un spat iu de nume, anume cel implicit din XML care afecteaz a toate elementele; acesta are URIul http://www.w3.org/XML/1998/namespace. Numele local al unui nod spat iu de nume este prexul s au (posibil vid). URI-ul spat iului de nume pentru un nod spat iu de nume este ntotdeauna vid.

68

CAPITOLUL 4. XPATH

4.5
4.5.1

Expresii de localizare
Exemplicare

Expresiile de localizare reprezint a partea de interes maxim din XPath. Pe baza lor se pot selecta diferite cont inuturi din document (noduri, elemente, comentarii, etc). De exemplu, pentru a determina adresa primului student din documentul XML dat n listing-ul 4.1 se poate folosi expresia XPath: /studenti/student[1]/adresa/text() sau echivalent /child::studenti/child::student[position()=1]/child:: adresa/child::text() Interpretarea primei c ai de mai sus este urm atoarea: se porne ste de la nodul r ad acin a XML; acesta nu are nume, se refer a prin / si are drept descendent i toate nodurile din document: declarat ia de XML, instrunct iunea de procesare, etc, a sa cum se vede n gura 4.1; se coboar a n elementul student i aat sub r ad acin a; din acest element se coboar a la nivelul urm ator, de unde se alege primul copil de tip element, numit student; din acest element se caut a elementul copil numit adresa; din nodul de adresa se preia cont inutul de tip text. Alte exemple: Expresie XPath /studenti /studenti/student //limba straina //@nivel

Rezultat selecteaz a elementul r ad acin a selecteaz a cele dou a elemente student toate elementele de tip limba straina, indiferent unde se a a toate atributele nivel, indiferent unde sunt precizate

4.5. EXPRESII DE LOCALIZARE

69

4.5.2

Structura unei expresii de localizare

O expresie de localizare este format a din pa si (mai sus: studenti, student[1], etc); ecare pas are forma general a: axa :: test-nod [predicat1][predicat2]... De exemplu, pentru child::student[position()=1] axa este child, testul de nod este student iar predicatul este position()=1. O expresie de localizare poate pleca de la nodul r ad acin a, iar n acest caz calea ncepe cu / sau // si spunem c a avem de-a face cu o cale absolut a. Dac a nu se ncepe cu aceste caractere atunci avem de-a face cu o cale relativ a, care pleac a de la nodul curent - numit nod context. Dup a cum se observ a, am folosit ca separator de pa si caracterul /, care leag a un p arinte de nodul cont inut; se mai poate folosi // care se refer a at at la descendet i direct i, c at si la cei indirect i.

4.5.3

Axe XPath

Exist a 13 axe n XPath 1.0: 1. axa ancestor este referint a la tot i ascendent ii unui nod. Ace sti ascendet i pornesc de la p arinte si includ si nodul r ad acin a; aduce tipurile de noduri: r ad acin a, elemente; 2. axa ancestor-or-self este referint a la colect ia format a din nodul context si tot i ascendet ii s ai; aduce tipurile de noduri: r ad acin a, elemente. 3. axa attribute refer a lista atributelor unui element; aduce doar noduri de tip atribut; 4. axa child reprezint a lista tuturor elementelor copil; este axa implicit a; va aduce noduri de tip: elemente, comentarii, PI-uri, text 5. axa descendant d a acces la lista tuturor descendet ilor (direct i sau indirect i); aduce tipuri de nod: elemente, comentarii, PI-uri, noduri text 6. axa descendant-or-self reprezinta lista format a din nodul curent precum si descendet ii de orice nivel ai nodului curent; aduce tipurile de noduri: orice n afar a de atribute si spat ii de nume. 7. axa following reprezint a toate nodurile din document care apar dup a nodul context; aduce tipurile de nod: orice n afar a de r ad acin a, atribute sau spat ii de nume

70

CAPITOLUL 4. XPATH 8. axa following-sibling d a acces la lista urm atoarelor noduri frate, adic a noduri aate la acela si si cu acela si p arinte nivel cu contextul curent, care i urmeaz a n ordinea de document; tipurile de nod aduse sunt: orice n afar a de r ad acin a, atribute sau spat ii de nume; 9. axa namespace d a nodurile spat ii de nume pentru nodul context; aduce doar noduri de tip spat iu de nume;

10. axa parent d a nodul p arinte pentru nodul context; tipurile de nod aduse sunt: r ad acin a, elemente 11. axa preceding d a toate nodurile care l preced a pe cel curent; aduce tipurile de nod: orice n afar a de r ad acin a, atribute sau spat ii de nume; 12. axa preceding-sibling d a nodurile frate pentru nodul curent si care l preced; tipurile de nod aduse sunt: orice n afar a de r ad acin a, atribute, sau spat ii de nume; 13. axa self este referint a c atre nodul curent Fiecare pas dintr-o expresie de localizare trebuie s a specice o ax a; prin lips a, aceasta se consider a a axa child. Pentru aceste axe se pot folosi prescurt ari, care duc la exprim ari cu mult mai compacte - vezi tabelul 4.2. Axa child::numeCopil parent::node() self:: attribute:: Prescurtare numeCopil .. . @

Tabela 4.2: Prescurt ari pentru axe Referirea se poate face relativ la: nodul r ad acin a, dac a expresia XPath ncepe cu / nodul curent, dac a se ncepe cu altceva dec at / Atunci c and / (un caracter) se folose ste ca separator de pa si este folosit a leg atura p arinte-u; astfel, studenti/student se refer a la descendentul direct student al nodului studenti. Dac a se folose ste // ca separator, (studenti//student) atunci se refer a la orice descendent student al lui studenti, indiferent c a este descendent direct sau tranzitiv.

4.5. EXPRESII DE LOCALIZARE

71

4.5.4

Teste pentru noduri

O ax a specic a direct ia n care va face c autarea. Suplimentar se poate preciza care noduri trebuie s a e selectate. Un rol special l are *, care reprezint a un substituent pentru orice nume de element sau atribut. Specicarea nodului se face prin: nume si are ca efect specicarea elementului sau al atributului cu acel nume; e.g. student specic a selectarea elemntelor <student>; respectiv, @nivel specic a selectarea unui set de atribute cu numele nivel (de cele mai multe ori se refer a la un atribut din contextul curent; dar poate s a reprezinte si un grup de atribute) comment() este folosit pentru obt inerea nodurilor de tip comentariu node() d a lista tuturor nodurilor processing-instruction() selecteaz a instruct iunile de procesare text() selecteaz a nodurile text

4.5.5

Predicate XPath

Un predicat permite ltrarea nodurilor care se returneaz a de c atre o expresie de localizare. Un predicat se include ntre paranteze drepte c si reprezint a o expresie logic a a c arui evaluare decide dac a se va returna nodul dat de expresie sau nu. De exemplu, dac a dorim s a return am toate elementele student pentru care elementul adresa are cont inutul text Brasov, vom folosi: /studenti/student[adresa=Brasov] care folosind axele se scrie echivalent: /child::studenti/child::student[child::adresa=Brasov] iar pentru detectarea limbilor str aine cunoscute de c atre tot i cei care se numesc Popescu se folose ste: /studenti/student[@nume="Popescu"]/limba_straina Pe l ang a posibilitatea de a compara cont inutul unor elemente sau atribute cu siruri de caractere sau cont inutul altor noduri, este posibil s a folosim funct ii XPath; de exermplu, pentru selectarea primei limbi str aine pentru cel de-al doilea student se poate folosi:

72

CAPITOLUL 4. XPATH

/studenti/student[position()=2]/limba_straina[position()=1] formul a care se poate scrie ca /studenti/student[2]/limba_straina[1] O list a a funct iilor disponibile n XPath 1.0 va dat a ntr-o sect ine viitoare. Pentru cazul n care se dore ste precizarea mai multor predicate, acest lucru se poate face prin scrierea lor unul dup a cel alalt. De exemplu, dac a ne intereseaz a tot i student ii care stiu limba german a la nivel bine putem scrie: /studenti/student[limba_straina/text()=germana][limba_straina/ @nivel=bine] Acela si efect se obt ine prin unirea predicatelor folosind operatorul and: /studenti/student[limba_straina/text()=germana and limba_straina/ @nivel=bine] Se pot combina c aile de localizare folosind caracterul | (pipe). Rezultatul este reuniunea nodurilor care satisfac oricare din c ai. Se pot conecta oric ate c ai, iar evaluarea uneia nu afecteaz a n niciun fel evaluarea celorlalte. Este de asemenea permis a imbricarea predicatelor. De exemplu, putem selecta toate elementele student care au element hobby pentru care exist a un frate precedent numit adresa: /studenti/student[hobby[preceding-sibling::adresa]]

Capitolul 5 XPath (continuare)


5.1 Funct ii si operatori XPath

Reamintim c a exist a 4 tipuri de date n XPath 1.0: numeric sir de caractere logic set de noduri Pentru ecare exist a un set de operatori si funct ii dedicate. Vom considera n cele ce urmeaz a urm atorul document XML: <?xml version="1.0" encoding="UTF-8"?> <studenti> <student> <nume>Popescu</nume> <prenume>Rafael</prenume> <examen materie="Java" nota="9"/> </student> <student> <nume>Ionescu</nume> <prenume>Maria</prenume> <examen materie="Java" nota="9.5"/> </student> </studenti> 73

74

CAPITOLUL 5. XPATH (CONTINUARE)

5.1.1
!= < <= = > >=

Operatori si funct ii pentru tipul boolean

Operatorii logici booleeni sunt:

av and semnicat iile cunoscute. De exemplu, dac a dorim s a select am student ii care au luat cel put in nota 9 la examen, vom folosi: /studenti/student[examen/@nota>=9] Funct iile booleene sunt: boolean() care converte ste argumentul la o valoare boolean a; astfel avem cazurile: 1. dac a parametrul este de tip boolean atunci se returneaz a exact valoarea lui 2. dac a parametrul este de tip numeric, atunci dac a num arul este 0 atunci se returneaz a false, altfel pentru num ar nenul true 3. dac a parametrul este de tip sir de caractere, atunci dac a este sirul vid se returneaz a false, altfel true 4. dac a parametrul este de tip set de noduri atunci se returneaz a false dac a setul este vid, true altfel. true(), false() sunt funct ii care nu primesc parametru si returneaz a valorile de adev ar omonime. Sunt folosite de exemplu n XSLT, unde valorile returnate pot date unor variabile lang() returneaz a true dac a valoarea atributului xml:lang pentru elementul curent este setat a la parametrul trimis funct iei. not() este folosit pentru a produce negarea parametrului de tip boolean transmis funct iei.

5.1. FUNCT II S I OPERATORI XPATH

75

5.1.2

Operatori si funct ii pentru tipul numeric

Exist a urm atorii operatori care se pot folosi pentru tipul numeric: + pentru adunare - pentru sc adere * pentru nmult ire div pentru mp art ire mod pentru restul mp art irii ntregi Funct iile care lucreaz a cu numere sunt: floor() - d a partea ntreag a inferioar a a unui num ar; de exemplu floor(3.14)=3, floor(-3.14)=-4; ceiling() - d a partea ntreag a superioar a a unui num ar; de exemplu, ceiling(3.14) este 4, ceiling(-3.14)=-3; pentru a obt ine lista student ilor care au luat note cu valori ntregi la examen se poate folosi: /studenti/student[floor(examen/@nota)=ceiling(examen/@nota)] round() rotunje ste nota la cel mai apropiat ntreg; e.g. round(3.1) produce 3, round(3.5)=4, round(-3.1)=-3 sum() determin a suma numerelor care sunt date ca argument; de exemplu, suma notelor obt inute la examene este: sum(/studenti/student/examen/@nota) number() produce o valoare numeric a pentru argumentul care i se d a; number(3.14) va produce num arul 3.14.

5.1.3

Funct ii pentru tipul sir de caractere

XPath 1.0 nu are operatori care s a funct ioneze cu siruri de caractere, dar posed a funct ii: concat(string string1, string string2, ...) este folosit a pentru concatenarea sirurilor de caractere transmise ca parametri. De exemplu pentru concatenarea numelui si prenumelui celui de al doilea student, cu spat iu desp art itor vom folosi:

76

CAPITOLUL 5. XPATH (CONTINUARE) concat(/studenti/student[2]/nume, " ", /studenti/student[2]/prenume) contains(string string1, string string2) - returneaz a true dac a string1 cont ine string2; de exemplu, pentru a g asi student ii al c aror nume cont ine particula escu putem folosi: /studenti/student[contains(nume, "escu")] normalize-space(string string1) - aplicat a unui string va duce la: eliminarea spat iilor de nceput si de sf ar sit, colapsarea mai multor spat ii adiacente la unul singur. De exemplu, dac a dorim s a g asim tot i student ii numit i Popescu, dar elementul nume poate s a cont in a si spat ii nainte sau dup a nume, atunci expresia XPath: /studenti/student[nume="Popescu"] nu va aduce primul student, deoarece cont inutul elementului nume este de fapt Popescu. Pentru a se obt ine rezultatul dorit se folose ste: /studenti/student[normalize-space(nume)="Popescu"] starts-with(string string1, string string2) - funct ia returneaz a true dac a primul string ncepe cu al doilea string(string string1) converte ste argumentul dat la sir de caractere string-length(string string1) - se returneaz a num arul de caractere din parametru substring(string string1, number offset, number length) - se returneaz a un sub sir al primului argument, care ncepe de la pozit ia dat a de al doilea argument si are length caractere substring-after(string string1, string string2) - se returneaz a un sux al primului argument, care se a a dup a prima aparit ie a celui de al doilea parametru n primul; eventual se returneaz a stringul vid substring-before(string string1, string string2) se returneaz a un prex al primului argument aat naintea primei aparit ii a celui deal doilea argument n primul.

5.1. FUNCT II S I OPERATORI XPATH

77

translate(string string1, string string2, string string3) este folosit a pentru a obt ine un sir de caractere plec and de la primul argument, substituind caracterele din al doilea argument cu cele care se a a n al treilea argument. Mai exact, primul caracter din al doilea argument se substituie cu primul caracter din al treilea argument, al doilea caracter din al doilea argument se substituie cu al doilea caracter din al treilea argument, etc. Spre exemplu, pentru a face comparat ie case-insensitive se poate folosi: translate(@materie, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcdefghijklmnopqrstuvwxyz)=programare orientata pe obiecte

5.1.4

Operatori si funct ii pentru tipul set de noduri

Operatorii folosit i pentru lucrul cu seturi de noduri sunt: |, reprezent and reuniunea c ailor date de expresiile precizate; de exemplu, n XSLT se poate folosi: <xsl:template match="name | day"> ... </xsl:template> iar zona de aplicare a sablonului este orice sub-element care se nume ste name sau day al elementului curent. / este folosit pentru a delimita pa sii de localizare sau poate preciza locul de unde ncepe c autarea (r ad acin a), iar // specic a modul de c autare (la orice nivel, ncep and din nodul context). Funct iile care lucreaz a cu seturile de noduri sunt: count(node-set) returneaz a num arul de noduri din setul de noduri; de exemplu, pentru a determina num arul de elemente de tip student se folose ste: count(/studenti/student) Pentru a determina media general a pentru grupul de studet i se folose ste:

78

CAPITOLUL 5. XPATH (CONTINUARE) sum(/studenti/student/examen/@nota) div count(/studenti/ student/examen) id(string ID) returneaz a lista de elemente care au atributul id cu valoarea specicat a. De obicei se folose ste pentru documentele XML la care se specic a prin DTD c a exist a atribut de tip ID: <!ATTLIST student id ID #REQUIRED> Se recomand a prudent a n folosirea acestei funct ii deoarece anumite procesoare de XPath nu ncarc a DTD-urile externe. last() returneaz a num arul de elemente din elementul curent; de exemplu dac a se dore ste aducerea ultimului element, se poate folosi: /studenti/student[last()] local-name(node-set) returneaz a numele local (i.e. necalicat) pentru un nod. De exemplu, //*[local-name()=nume] aduce toate elementele care au numele local nume. name(node-set) returneaz a numele calicat al unui nod, adic a numele de spat iu de nume, dou a puncte si apoi numele local. namespace-uri(node-set) este utilizat pentru a obt ine lista de URIuri asociate unui nod sau element position() d a pozit ia nodului context n cadrul p arintelui.

5.2

XPath 2.0

Nout a tile aduse de XPath 2.0 sunt: tipuri de date noi, compatibile cu XML Schema (XSD): xs:string, xs:boolean, xs:decimal, xs:float, xs:double, xs:duration, xs:dateTime, xs:time, xs:date, xs:gYearMonth, xs:gYear, xs:gMonthDay, xs:gDay, xs:gMonth, xs:hexBinary, xs:base64Binary, xs:anyURI, xs:QName, xs:NOTATION conceptul de secvent a ce poate cont ine noduri sau valori atomice; n plus fat a de seturile de noduri din XPath 1.0, o secvent a poate s a cont in a si valori atomice. Suport a conceptul de ordine si pot obt inute

5.2. XPATH 2.0

79

pe baza unor expresii noi introduse; spre deosebire de seturile de noduri accept a si valori repetate. Exemplu: (1, 2, 3) sau (1 to 3) reprezint a o aceea si secvent a. expresia for - permite iterarea cont inutului unei colect ii expresia if folosit a pentru select ie expresiile some si every reuniuni, intersect ii, diferent e Modelul de date este preluat aproape complet de la XPath 1.0, cu deosebirea c a n loc de nod r ad acin a se folose ste numele de nod document.

5.2.1

Expresii primare

Expresiile primare sunt cele mai simple expresii; sunt de tipurile: literal variabil a apel de funct ie item de context expresie cu paranteze Un literal este o valoare de tip atomic. Exist a dou a tipuri de literali numeric si sir de caractere. Pentru cei sir de caractere se accept a dublarea caracterelor sau , dac a apar n interiorul literalului si coincid cu cei de delimitare a valorii. Variabilele reprezint a expresii a c aror evaluare produce o valoare. Valoarea unei variabile se obt ine cu $numeVariabila. Parantezele se folosesc, precum n cazurile nt alnite n general pentru stabilirea ordinii de efectuare a operat iilor. De asemenea se pot folosi pentru denotarea secvent elor:(1, 2, 3) este secvent a de 3 numere, deosebit a de ((1, 2), 3) care este format a dintr-o secvent a si un num ar. Apelurile de funt ii sunt de asemenea considerate expresii n XPath 2.0, iar valoarea lor este valoarea returnat a de apel. Un item de context este pur si simplu ., put and reprezenta nodul curent (precum n XPath 1.0); dar poate de asemenea s a reprezinte o secvent a, precum n: (1 to 100)[. mod 10 = 0] care produce secvent a 10, 20, 30, 40, 50, 60, 70, 80, 90, 100.

80

CAPITOLUL 5. XPATH (CONTINUARE)

5.2.2

Expresii aritmetice

Operatorii aritmetici sunt: + pentru adunare - pentru sc adere si schimbare de semn * pentru nmult ire div pentru mp art ire idiv pentru mp art ire mod pentru modulo Operatorul - trebuie s a e prexat si urmat de caracter spat iu, altfel s-ar putea interpreta ca parte dintr-un nume; deci, x - y si nu x-y. Se poate folosi pentru sc aderea a dou a valori de tip dat a atunci se obt ine valoare de tip durat a de timp (xs:dayTimeDuration). Operatorul idiv cere ca operanzii dat i s a e de tip ntreg.

5.2.3

Expresii de localizare XPath 2.0

Au aceea si form a ca n XPath 2.0: axa :: test-nod [predicat1][predicat2]... Axele sunt acelea si din versiunea precedent a; axa namespace este considerat a nvechit a si se va elimina ulterior.

5.2.4

Expresii secvent a

O secvent a ncepe cu parantez a, continu a cu o list a de elemente separate prin virgul a (se admite lista vid a) si se ncheie cu paranteza nchis a. O secvent a poate s a cont in a noduri, valori atomice sau amestec al acestora. Elementele secvent ei se pot repeta. Exemplu de secvent e: (9, 10, 11, 12, 13, 14) produce secvent a de numere de la 9 la 14. Secvent a (1, (2, 3), (), 4, 5, 6) reprezint a secvent a 1, 2, 3, 4, 5, 6. Dac a name si address sunt elemente copil ale contextului, atunci (name, address) produce o secvent a de 2 elemente. Dac a temperature reprezint a o variabil a cu valoarea 20, atunci secvent a ($temperature, 1+2*3) va produce 20, 7. Se poate folosi si to, precum n (1 to 5) care este echivalent a cu (1, 2, 3, 4, 5).

5.2. XPATH 2.0

81

Secvent ele pot combinate folosind reuniunea, intersect ia, sc aderea de alte secvent e. Trebuie ret inut c a ace sti operatori produc eliminarea duplicatelor, deci rezultatul este similar cu conceptul de set de noduri. Dac a a, b, c, d sunt noduri, atunci: a, b union c, d duce la crearea secvent ei a, b, c, d. Pentru interset ie se folose ste operatorul intersect. Rezultatul aplic arii operatorului poate secvent a vid a (). Sc aderea a dou a secvent e se face cu operatorul except.

5.2.5

Expresii de comparare

Pentru compararea de valori atomice se folosesc operatorii: eq pentru = ne pentru diferit lt pentru < gt pentru > ge pentru >= le pentru <= Operatorul produce valoarea true sau false. Pentru cazul compar arii expresiilor de tip secvent a, se folosesc =, !=, <, >, <=, >=, dar sensurile lor sunt un pic denaturate fat a de cele intuitive. De exemplu, expresia (1, 2) = (2, 3) este evaluat a la true deoarece 2 apare n ambele secvent e.

5.2.6

Expresii logice

Pentru crearea de expresii logice se folosesc operatorii and si or, precum si funct ia not().

82

CAPITOLUL 5. XPATH (CONTINUARE)

5.2.7

Expresii for

For este folosit pentru a itera peste secvent e. Are forma general a: for variabila in secventa return expresie Rezultatul este o secvent a care cont ine toate valorile retunate. Se pot imbrica astfel de expresii de tip for: for $x in (1, 2) $y in (3, 4) return ($x * $y)

5.2.8

Expresii condit ionale

Forma general a este: if expresie then expresie1 else expresie2 Expresia de sub if poate de comparat ie sau de testare a existent ei unui anumit item, precum n: if (/studenti/student[1]/examen) ... testeaz a dac a primul student are m acar un element numit examen.

5.2.9

Expresii cuanticate

Exist a dou a cuvinte cheie care se folosesc pentru cuanticare: some si every. Forma pentru o expresie cuanticat a cu some este: some clauzeIn statisfies expresieTest Exemplu: some $student in //student satisfies $student/examen returneaz a true dac a exist a un element student care are element examen; alt exemplu este: some $student in //student satisfies $student/examen[ @materie eq "Java" and @nota ge 8] care returneaza true dac a exist a cel put in un student care a luat m acar 8 la Java si false n caz contrar. Cuanticatorul every are forma: every clauzeIn statisfies expresieTest De exemplu, pentru expresia: every $student in //student satisfies $student/examen returneaz a true dac a ecare element student are m acar un element examen.

Capitolul 6 XSLT
6.1 Generalit a ti

Extensible Stylesheet Language (XSL) este format din trei limbaje: XPath - limbaj pentru adresarea p ac tilor de cont inut dintr-un document XML XSL Transformations (XSLT) - pentru transformarea documentelor XML n cont inut de tip text XSL Formatting Objects (XSL-FO) - pentru formatarea vizual a a documentelor XML Intr-o transformare XSLT, un procesor de XSLT cite ste at at un sier XML c at si un document XSLT; pe baza indicat ilor din documentul XSLT se opereaz a transform ari asupra documentului XML, rezultatul ind un al treilea document (e el XML sau nu). De cele mai multe ori, XSLT este folosit pentru a obt ine siere (X)HTML, sau un XML intermediar ce poate apoi transformat n altceva, de exemplu n PDF. Intuitiv, procesul de transformare este redat n gura 6.1. R ad acinile limbajului XSLT stau n programarea funct ional a; de asemenea se folose ste mecanism de pattern-matching bazat pe XPath. Limbajul este unul declarativ, bazat pe transformarea de pattern-uri (sect iuni de document); pe baza unor expresii funct ionale se arat a care este noul cont inut ce trebuie generat. Abordarea este una de tip divide et impera, iar prin combinarea rezultatelor obt inute pentru diferite pattern-uri se obt ine documentul de ie sire nal. Versiunea curent a de XPath este 2.0, dat a sub form a de recomandare W3C n 23 ianuarie 2007. 83

84

CAPITOLUL 6. XSLT Figura 6.1: Procesul transform arii unui document XML prin XSLT ()

6.2

Mecanismele XSLT

Un procesor XSLT se bazeaz a pe arborele XPath al unui document XML (e sucient ca documentul s a e bine format, nu e necesar a si validarea lui). XSLT opereaz a prin transformarea unui nod n altceva (cel mai des, alte noduri XML). Un document XSLT cont ine ni ste reguli pentru template-uri ( sabloane). O astfel de regul a este compus a dintr-o expresie de localizare XPath si ie sirea care trebuie s a e produs a c and procesorul g ase ste un nod care respect a localizarea dat a de XPath. Un document de stil XSLT este un document XML ce respect a un vocabular anume. Elementul r ad acin a este e stylesheet, e transform; se folose ste spat iul de nume xsl av and drept URI asociat http://www.w3.org/ 1999/XSL/Transform. Inceputul unui document XSLT este: <?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> Atributul de versiune din elementul xsl:stylesheet este mandatoriu. Prexul de spat iu de nume se folose ste pentru orice element XSLT - asta ajut a procesorul de XSLT s a aleag a elementele pe care le va procesa. Orice nu este prexat cu xsl: se consider a c a va face parte din ie sirea produs a.

6.2. MECANISMELE XSLT

85

S a consider am documentul XML din listing-ul 6.1. Listingul 6.2 cont ine un document XSLT care se aplic a peste lista de student i. Tabela 6.1: Document XML <?xml version="1.0"?> <studenti> <student nume="Popescu" prenume="Rafael"> <adresa>Brasov</adresa> <limba_straina nivel="foarte bine">engleza</limba_straina> <limba_straina nivel="bine">franceza</limba_straina> <hobby>Programarea extrema</hobby> <an>2</an> </student> <student nume="Ionescu" prenume="Maria"> <adresa> Brasov </adresa> <limba_straina nivel="foarte bine">franceza</limba_straina> <limba_straina nivel="bine">germana</limba_straina> <hobby>Arhitectura</hobby> <an>3</an> </student> </studenti>

Tabela 6.2: Document XSLT ce produce ie sire de tip text <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/studenti"> Inceputul listei de studenti <xsl:apply-templates/> Sfarsitul listei de studenti </xsl:template> <xsl:template match="student"> <xsl:value-of select="@nume"/>, <xsl:value-of select="adresa"/> </xsl:template> </xsl:stylesheet>

Rezultatul aplic arii XSLT-ului peste XML este:

86 <?xml version="1.0" encoding="utf-8"?> Inceputul listei de studenti Popescu, Brasov Ionescu, Brasov Sfarsitul listei de studenti Explicat ii:

CAPITOLUL 6. XSLT

procesorul XLST parcurge documentul XML si g ase ste elementul r ad acin a care se conformeaz a expresiei de localizare din primul element xsl:template. procesorul XSLT se conformeaz a regulii: se scrie Inceputul listei de studenti, apoi se continu a cu aplicarea template-urilor pentru nodurile cont inute - cele dou a noduri student (este un apel recursiv, care va genera executarea unui alt template), apoi se va scrie la sf ar sit Sfarsitul listei de studenti din elementul curent (/studenti) reg asim un alt tip de element, student pentru care se aplic a al doilea template din documentul xslt (e resc, deoarece contextul n nodul context avem un nod care se potrive ste cu match="student"). Pentru ecare element student se a seaz a cont inutul atributului nume, apoi cont inutul elementului adresa, desp art ite prin virgul a. Alt exemplu: plec and de la acela si XML, vom aplica transformarea dat a n listing-ul 6.3. Ie sirea va cea din listing-ul 6.4.

6.2.1

Template-uri

Un element de tip xsl:template dene ste un nod c aruia i se va aplica o anumit a regul a. Are atributele match, mode, priority si name. Atributul match pentru orice element template are ca valoare o expresie XPath care specic a cui i se va aplica acel template. Se poate folosi tot ceea ce s-a prezentat la sect iunea de XPath: c ai relative, c ai absolute, referiri la axe si locat ii, predicate, etc. Pe baza acestor expresii de localizare se face identicarea nodurilor pentru care se va aplica template-ul curent. Atributul mode este opt ional, permit and procesarea selectiv a a unui template, dac a la elementul <xsl:apply-templates> se specic a aceea si valoare de atribut.

6.2. MECANISMELE XSLT

87

Tabela 6.3: Document XSLT ce produce ie sire HTML <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <xsl:apply-templates /> </html> </xsl:template> <xsl:template match="/studenti"> <body> <table> <xsl:apply-templates/> </table> </body> </xsl:template> <xsl:template match="student"> <tr> <td><xsl:value-of select="@nume"/></td> <td><xsl:value-of select="@prenume"/></td> <td><xsl:value-of select="adresa"/></td> <td><xsl:value-of select="an"/></td> </tr> </xsl:template> </xsl:stylesheet>

88

CAPITOLUL 6. XSLT

Tabela 6.4: Ie sirea HTML corespunz atoare XSLT-lui din listing-ul 6.3 <html> <body> <table> <tr> <td>Popescu</td> <td>Rafael</td> <td>Brasov</td> <td>2</td> </tr> <tr> <td>Ionescu</td> <td>Maria</td> <td> Brasov </td> <td>3</td> </tr> </table> </body> </html>

6.2. MECANISMELE XSLT

89

Atributul name se folose ste pentru template-uri care au nume, deci care nu se aplic a pe baza potrivirii locului nodului cu expresia XPath, ci sunt apelate manual. Atributul priority are ca valoare un num ar real (implicit 1) care specic a prioritatea aplic arii regulii.

6.2.2

Elementul xsl:value-of

Calculul valorii ce se va a sa se face cu elementul xsl:value-of. Atributul select specic a formula de calcul pentru elementul curent; acesta poate s a e o cale XPath, sau apel de funct ii XPath. Cont inutul efectiv depinde de tipul de nod pe care se aplic a. Valorile pentru ecare tip de nod sunt: pentru un nod element, cont inutul este concatenarea tuturor caracterelor (mai put in cele de parsare) pentru nodul r ad acin a este valoarea sa, adic a concatenarea tuturor valorilor de string pentru nodurile de tip text nod de tip text, este chiar cont inutul s au nod atribut - este valoarea atributului nod spat iu de nume - URI-ul spat iului de nume nod instruct iune de procesare - textul dintre tinta declarat a (exclusiv) si nchiderea ?> nod comentariu - valoarea este chiar textul cont inut

6.2.3

Procesarea mai multor elemente cu xsl:for-each

Elementul xsl:for-each poate folosit pentru a face selectarea tuturor elementelor dintr-un set de noduri. De exemplu, dac a vrem s a scriem pentru ecare student o list a a limbilor pe care le cunoa ste, putem scrie XSLT-ul din listing-ul 6.5. Ie sirea asociat a XLST-ului din 6.5 este dat a n listingul 6.6. De multe ori se poate evita folosirea acestui element, folosind-se n schimb template-urile. Acela si efect se obt ine prin XSLT-ul din listing-ul 6.7.

90

CAPITOLUL 6. XSLT

Tabela 6.5: XSLT cu iterare xsl:for-each

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0 <xsl:template match="/"> <html> <head>Document obtinut din XML si XSLT</head> <body> <xsl:for-each select="studenti/student"> Student: <xsl:value-of select="concat(@nume, , @prenume)"/><br /> <ol> <xsl:for-each select="limba_straina"> <li> <xsl:value-of select="."/> </li> </xsl:for-each> </ol> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>

6.3. REGULILE DE TEMPLATE IMPLICITE Tabela 6.6: XSLT cu iterare xsl:for-each

91

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Document obtinut din XML si XSLT</head> <body> Student: Popescu Rafael<br><ol> <li>engleza</li> <li>franceza</li> </ol> Student: Ionescu Maria<br><ol> <li>franceza</li> <li>germana</li> </ol> </body> </html>

6.3

Regulile de template implicite

XSLT dene ste ni ste reguli de template-uri implicite care sunt incluse n orice document XSLT. Prima regul a implicit a se refer a la nodul r ad acin a si elemente si aplic a template-uri la orioce nod copil. A doua regul a se refer a la nodurile text si atribute. Acestea 2 mmpreun a nseamn a c a chiar si un document XSLT care cont ine doar element xsl:stylesheet va produce o ie sire cont in and textul elementelor din documentul XML.

6.3.1

Regula de template implicit a pentru elemente

Prima regul a se refer a la toate nodurile elemente si la nodul r ad acin a: <xsl:template match=*|/> <xsl:apply-templates/> </xsl:template> Scopul acestei reguli este de a ne asigura c a s eva face o procesare a tuturor elementelor, n mod recursiv. Dac a nu exist a alte template-uri care s a percizeze pentru ce elemente se aplic a, atunci se va aplica regula implicit a. De exmeplu, putem bloca apelarea regulii implicite pentru nodul r ad acin a astfel:

92

CAPITOLUL 6. XSLT

Tabela 6.7: Procesare echivalent a cu 6.5, dar f ar a for-each

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0 <xsl:template match="/"> <html> <head>Document generat din XML si XSLT</head> <body> <xsl:apply-templates select="studenti/student"/> </body> </html> </xsl:template> <xsl:template match="studenti/student"> Student: <xsl:value-of select="concat(@nume, , @prenume)"/><br/> <ol> <xsl:apply-templates select="limba_straina"/> </ol> </xsl:template> <xsl:template match="limba_straina"> <li> <xsl:value-of select="."/> </li> </xsl:template> </xsl:stylesheet>

6.4. TEMPLATE-URI PENTRU VALORI DE ATRIBUTE <xsl:template match=/> </xsl:template>

93

6.3.2

Regula de template implicit a pentru noduri text si atribute

Aceast a regul a este: <xsl:template match=text()|@*> <xsl:value-of select=./> </xsl:template> Aceast a regul a va produce la ie sire valoarea nodului, adic a copiaz a textul de la intrare la ie sire. Pentru atribute, aceast a regul a va produce la ie sire valorile atributelor. Deoarece nu este o regul a implicit a care s a aplice template-uri la atribute, aceast aregul a nu va activat a pentru atribute dac a nu se adaug a n mod explicit o regul a neimplicit a care s a aplice template-uri atributelor unui/unor elemente.

6.3.3

Regula de template implicit a pentru instruct iuni de procesare si comentarii

Exist a de asemenea o regul a implicit a pentru instruct iuni de procesare si comentarii care spoune s a nu se fac a nimic pentru aceste tipuri de noduri. Ea arat a astfel: <xsl:template match=processing-instruction()|comment()/>

6.4

Template-uri pentru valori de atribute

S a presupunem c a plec and de la XML-ul din listing-ul 6.1 vrem s a scriem ora sul din elementul adresa ca o valoare a atributului oras. Am tentat i s a scriem astfel: <adresa oras="<xsl:value-of select=adresa/> Dar valorile atributelor nu pot s a cont in a <. Putem ns a folosi parantezele { si } care iau locul lui xsl:value-of. Modul corect de scriere este: <adresa oras="{adresa}"/> In expresia de mai sus adresa se nlocuie ste cu textul elementului adresa.

94

CAPITOLUL 6. XSLT

6.5

Specicarea ie sirii la runtime

De cele mai multe ori se cunosc numele elementelor si al atributelor care compun documentul de ies sire. In unele cazuri, ns a numele elementelor, atributelor, instruct iunilor de procesare nu este cunoscut, sau vrem s a producem din mers comentarii, sau s a producem text a c arui formatare s a se p astreze. Pentru aceasta s-au introdus: xsl:element, xsl:attribute, xsl:processing-instruction, xsl:comment, xsl:text.

6.5.1

Inserarea de elemente n documentul de ie sire cu xsl:element

Dac a avem nevoie de detalii din documentul XML, pe baza c arora se creeaz a efectiv un nume de element putem folosi xsl:element; aceasta, dup a cum am mai spus, se nt ampl a c and vocabularul documentului rezultat nu este cunoscut aprioric, ci construit pe baza cont inutului documentului surs a. Sintaxa acestui element este: <xsl:element name=valoare> ... </xsl:element> Exemplu: <xsl:template match=/studenti/student> <xsl:element name=adresa> <xsl:value-of select=nume/> <!--etc--> </xsl:element> </xsl:template>

6.5.2

Inserarea de atribute n documentul de ie sire cu xsl:attribute

La fel, se poate folosi xsl:attribute pentru generarea unui atribut al c arui nume se deduce la run-time; se mai utilizeaz a pentru crearea de atribute n cazul unui element generat cu xsl:element. <xsl:template match=/studenti/student> <xsl:element name=adresa> <xsl:attribute nume={nume}/> <xsl:value-of select=nume/>

6.5. SPECIFICAREA IES IRII LA RUNTIME </xsl:element> </xsl:template>

95

Evident, orice atribut se nainte de a ncepe generarea cont inutului elementului.

6.5.3

Inserarea de PI n documentul de ie sire cu xsl:processing-instructi

Instruct iunea xsl:processing-instruction insereaz a o instruct iune de procesare n documentul de ie sire. se specic a tinta PI-ului pruin valoarea atributului name. Cont inutul PI-ului devine cont inutul instruct iunii de procesare. Exemplu: <xsl:template match=PROGRAM> <xsl:processing-instruction name=gcc> -O4 </xsl:processing-instruction> </xsl:template>

6.5.4

Inserarea de comentarii n documentul de ie sire cu xsl:comment

Elementul xsl:comment insereaz a un comentariu n documentul de ie sire. Nu are atribute. Exemplu: <xsl:template match="/studenti/student"> <xsl:comment>aici e un student</xsl:comment> </xsl:template>

6.5.5

Inserarea de text n documentul de ie sire cu xsl:text

Eleemntul xsl:text va produce textul dat ca si cont inut n documentul de ie sire. De si pare redundant, textul scris ind oricum trecut n documentul de ie sire, are un set de avantaje: p astreaz a exact spat iile cont inute; un procesor de XSLT va elimina spat iile din documentul XSLT permite includerea de caractere < si & f ar a folosirea referint elor la entit a ti predenite.

96

CAPITOLUL 6. XSLT

6.6

Moduri

S a presupunem c a se dore ste procesarea unui nod din document, dar n locuri diferite acesta va trebui s a arate diferit. Solut ia este de a da ec arei reguli un mod spcic, care va selectat de c atre utilizator. Acest mod se specic a prin intermediul atributului mode pentru xsl:template, iar invocarea unui template cu un mod anume se face prin specicarea aceluia si mod la apelul xsl:apply-templates. Un mod este materializat ca un sir de caractere. Exemplu: <xsl:template match="student" mode="tabel"> <tr> <td><xsl:value-of select="@nume"/></td> <td><xsl:value-of select="@prenume"/></td> <td><xsl:value-of select="adresa"/></td> <td><xsl:value-of select="an"/></td> </tr> </xsl:template> care este apelabil cu: <xsl:apply-templates select="student" model="tabel"/> respectiv un alt template, cu acela si target: <xsl:template match="student" mode="lista"> <li> <xsl:value-of select="@nume"/> </li> </xsl:template> apelabil cu: <xsl:apply-templates select="student" model="lista"/>

Capitolul 7 XSLT (2)


Din [1], sect iunile: Counting Nodes with xsl:number, Sorting Output, Dening Constants with xsl:variable, Named Templates, Passing Parameters to Templates, Making Choices.

97

98

CAPITOLUL 7. XSLT (2)

Capitolul 8 XSL-FO
A se vedea [5].

99

100

CAPITOLUL 8. XSL-FO

Capitolul 9 XML Schema


9.1 Introducere

XML Schema a fost publicat ca o recomandare W3C n mai 2001, ind unul din limbajele schem a XML. O schem a XML este descrierea unui document XML, de obicei sub forma constr angerilor pe care trebuie s a le satisfac a o instant a XML1 . Un document schem a XML este un document XSD (XML Schema Denition), adic a un sier av and extensia .xsd; acesta va folosit pentru validare.

9.2

Minusuri ale lui DTD

DTD are si el ca scop validarea documentelor XML. De si extrem de popular, are c ateva probleme evidente:

9.2.1

Lipsa tipiz arii

Dac a consider am un element cu cont inut de tip text, este imposibil s a preciz am care sunt restrict iile care trebuie satis acute de acesta; vom specica doar #PCDATA, asta nsemn and orice sir alfanumeric. Ar de dorit s a putem preciza c a ntr-un element avem posibilitatea de a specica o dat a calendaristic a, sau un num ar aat ntre anumite praguri, sau un sir de caractere care satisface un anumit model.
1

Exemple de limbaje de schem a: XSD, RELAX NG.

101

102

CAPITOLUL 9. XML SCHEMA

9.2.2

Sintaza non-XML

DTD reprezint a un limbaj n sine, evident diferit de convent iile XML. Ar fost de a steptat ca XML s a dea posibilitatea auto-descrierii tot n format XML. Problema vine din faptul c a este incomod s a nvet i dou a sintaxe: una pentru validare, alta pentru documentul propriu-zis.

9.2.3

Scalabilitatea redus a

Este dicil a combinarea de documente DTD. Exist a posibilit a ti limitate de folosire at at a DTD-urilor interne c at si externe, dar se ajunge rapid la cod greu de gestionat si de nt eles.

9.2.4

Nesuportarea spat iilor de nume

Am v azut din prezent arile anterioare (XSLT, XSL-FO) c a se folosesc masiv spat iile de nume. Acestea se denesc printr-un prex (numele efectiv al acestui prex este put in important, put and varia) si un URI (care este de fapt partea important a). In DTD se pot deni numele de elemente cu prex, dar nu se poate preciza u sor c a acesta poate s a e variabil, dar cu un URI xat.

9.2.5

Structura inexibil a

S a presupnem urm atoarele declarat ii DTD pentru denirea structurii unui document XML: <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT mailAddress (name, address, zipcode)> name (#PCDATA)> address (#PCDATA)> zipcode (#PCDATA)>

Dac a ns a n acela si document XML vrem s a folosim elementul name care s a cont in a elementele first, last, middle atunci avem o problem a: structura precizat a anterior nu permite asta. Fie folosim spat ii de nume, e schimb am complet numele elementului ca s a reecte contexte diferite, nu avem o solut ie elegant a la problem a.

9.2.6

Alte limit ari

C ateva limit ari care nu sunt at at de evidente: ordinea elementelor dat a de DTD este xat a;

9.3. XSD

103

nu se poate preciza cu u surint a num arul maxim de aparit ii ale unui element; dac a se face asta, atunci se stabile ste si ordinea de aparit ie a elementelor. Ordinea, de cele mai multe ori, este irelevant a, prim and structura documentului. Exist a solut ii la aceste probleme, dar ele sunt caracterizate prin explozie combinatorial a a num arului de linii ce trebuie scrise, ceea ce rezult a n cod greu de gestionat si dezvoltat. Din ceea ce se spune mi sus s-ar putea deduce c a DTD este o solut ie ce nu ar trebui adoptat a. Ins a nu este chiar a sa, XSD vine doar s a ntregeasc a anumite lipsuri ale DTD; alegerea schemei de validare se face n funct ie de problema efectiv a. La ora actual a DTD este o opt iune des nt alnit a.

9.3

XSD

S a consider am documentul XML de mai jos: <?xml version="1.0" encoding="utf-8" ?> <helloSchema> Vreau o schema XSD!</helloSchema> Documentul XSD asociat este: <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="helloSchema" type="xsd:string"/> </xsd:schema> Remarc am c a elementul r ad acin a pentru schem a este xsd:schema. Prexul xsd este asociat URL-ului http://www.w3.org/2001/XMLSchema. Se poate folosi si alt prex n loc de xsd, de exemplu xs, dar URL-ul este important a se preciza de ecare dat a la fel. Declararea de element se face prin intermediul lui xsd:element care precizeaz a ca valoare a atributului name numele elementului denit, iar prin atributul type tipul de date permis: sir de caractere. Nu se permite ca elementul helloSchema s a cont in a subelemente, dar poate gol. S a presupunem c a documentul XSD anterior este salvat cu numele helloschema.xsd. Legarea documentului XML de cel XSD n vederea valid arii se face prin ata sarea atributului xsi:noNamespaceSchemaLocation la elementul r ad acin a; valoarea acestuia va URL-ul documentului xsd, iar prexul xsi este legat la URI-ul http://www.w3.org/2001/XMLSchema-instance. Prin urmare, vom avea:

104

CAPITOLUL 9. XML SCHEMA

<?xml version="1.0" encoding="utf-8" ?> <helloSchema xsi:noNamespaceSchemaLocation="helloschema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Vreau o schema XSD! </helloSchema>

9.4

Tipuri complexe

Elementele sunt e de tip simplu, e de tip complex. Tipurile simple vor introduse n sect iunea 9.6. Elementele de tip simplu pot s a cont in a orice n afar a de alte elemente. Elementele de tip compus pot cont ine atribute si alte elemente. S a consider am documentul XML: <?xml version="1.0"?> <SONG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="song.xsd"> <TITLE>Yes I Am</TITLE> <COMPOSER>Melissa Etheridge</COMPOSER> <PRODUCER>Hugh Padgham</PRODUCER> <PUBLISHER>Island Records</PUBLISHER> <LENGTH>4:24</LENGTH> <YEAR>1993</YEAR> <ARTIST>Melissa Etheridge</ARTIST> <PRICE>$1.25</PRICE> </SONG> Fi sierul xsd referit ar putea : <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="SONG" type="SongType"/> <xsd:complexType name="SongType"> <xsd:sequence> <xsd:element name="TITLE" type="xsd:string"/> <xsd:element name="COMPOSER" type="xsd:string"/> <xsd:element name="PRODUCER" type="xsd:string"/> <xsd:element name="PUBLISHER" type="xsd:string"/> <xsd:element name="LENGTH" type="xsd:string"/> <xsd:element name="YEAR" type="xsd:string"/> <xsd:element name="ARTIST" type="xsd:string"/>

9.4. TIPURI COMPLEXE <xsd:element name="PRICE" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>

105

Schema declar a un singur element de nivel superior - SONG. Doar acest tip de elemente pot folosite ca element r ad acin a pentru documentul XML. Tipul elementului este SongType, tip denit ca ind complex; n cazul de fat a se dene ste ca o secvent a de elemente de tip simplu (TITLE, COMPOSER, etc) care trebuie s a e prezente ca singurele elemente copil si n ordinea dat a. Se pot insera, desigur, spat ii si caractere de linie nou a ntre elemente. Pot exista ns a cazuri n care num arul de aparit ii ale unui element este minorat/majorat, de exemplu pot exista mai mult i compozitori pentru un c antec. Se pot preciza atributele minOccurs si maxOccurs pentru ecare element, valoarea lor ind c ate un ntreg mai mare sau egal ca 0. Atributul maxOccurs poate de asemenea s a ia valoarea unbounded pentru a indica un num ar oric at de mare de aparit ii. Exemplu: <xsd:element name="COMPOSER" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> Se pot preciza astfel: oric ate aparit ii, inclusiv niciuna oric ate aparit ii, maxim n oric ate aparit ii, minim m oric ate aparit ii, minim m si maxim n element opt ional (minOccurs=0 maxOccurs=1) Ce s-ar nt ampla dac a elementele COMPOSER si PRODUCER ar trebui s a cont in a elementul NAME, de tip simplu? altfel spus, dac a ar trebui s a scriem: <COMPOSER> <NAME>Henri Belolo</NAME> </COMPOSER> si <PRODUCER> <NAME>Jacques Morali</NAME> </PRODUCER>

106

CAPITOLUL 9. XML SCHEMA

atunci vom deni tipurile compuse ComposerType si ProducerType: <xsd:complexType name="ComposerType"> <xsd:sequence> <xsd:element name="NAME" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ProducerType"> <xsd:sequence> <xsd:element name="NAME" type="xsd:string"/> </xsd:sequence> </xsd:complexType> iar elementele COMPOSER si PRODUCER se denesc n innteriorl tipului SongType ca: <xsd:element name="COMPOSER" type="ComposerType" maxOccurs="unbounded"/> <xsd:element name="PRODUCER" type="ProducerType" minOccurs="0" maxOccurs="unbounded"/> Pentru eliminarea redundant ei se poate deni un singur tip complex, numit de exemplu PersonType iar acesta s a e folosit a ca tip de date pentru COMPOSER si PRODUCER. Codul asociat are minime modic ari fat a de cel de mai sus. S a presupunem acum c a dorim ca tipul NAME s a arate astfel: <NAME> <GIVEN>Victor</GIVEN> <FAMILY>Willis</FAMILY> </NAME> Am putea scrie urm atoarele: <xsd:complexType name="NameType"> <xsd:sequence> <xsd:element name="GIVEN" type="xsd:string"/> <xsd:element name="FAMILY" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="PersonType">

9.4. TIPURI COMPLEXE <xsd:sequence> <xsd:element name="NAME" type="NameType"/> </xsd:sequence> </xsd:complexType>

107

Observ am ns a c a tipul NameType se folose ste doar pentru denirea tipului PersonType, reutilizarea lui ind nul a. Ne punem problema dac a nu s-ar putea reduce domeniul de vizibilitate al unui tip, astfel nc at s a e valabil doar n cadrul tipului ce are nevoie de el. Putem crea tipuri anonime: <?xml version="1.0" encoding="UTF-8"?> <xsd:complexType name="PersonType"> <xsd:sequence> <xsd:element name="NAME"> <xsd:complexType> <xsd:sequence> <xsd:element name="GIVEN" type="xsd:string"/> <xsd:element name="FAMILY" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> Pentru cazul n care se vrea ca un element s a e cu cont inut mixat, precum: <NAME> Mr. <GIVEN>Victor</GIVEN> C. <FAMILY>Willis</FAMILY> </NAME> se poate folosi: <xsd:element name="NAME"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="GIVEN" type="xsd:string"/> <xsd:element name="FAMILY" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element>

108

CAPITOLUL 9. XML SCHEMA

9.5

Grupare

Gruparea prive ste aspectul ordinii elementelor copil. In exemplele date mai sus s-a denit de ecare dat a si ordinea n care apar sub-elementele. De cele mai multe ori, ns a, ordinea este put in relevant a. Exsit a trei moduri de grupare: xsd:all, xsd:choice, xsd:sequence.

9.5.1

Grupul xsd:all

Grupul xsd:all este folosit pentru a ar ata c a ecare element din grup trebuie s a apar a cel mult o dat a, dar c a ordinea nu este important a. Deducem de aici c a folosirea atributelor minOccurs si maxOccurs este limitat a doar la valorile 0 si 1. Un grup xsd:all nu poate cont ine secvent e xsd:choice sau xsd:sequence.

9.5.2

Grupul xsd:choice

Grupul xsd:choice arat a c a din elementele precizate exact unul singur trebuie s a apar a n lista nal a. <xsd:sequence> <xsd:element name="TITLE" type="xsd:string"/> <xsd:choice> <xsd:element name="COMPOSER" type="PersonType"/> <xsd:element name="PRODUCER" type="PersonType"/> </xsd:choice> ... </xsd:sequence> Elementul xsd:choice poate avea atributele minOccurs si maxOccurs care precizeaz a de c ate ori pot ap area elementele specicate n list a, ecare din elemente ind independent de alegerile anterioare.

9.5.3

Grupul xsd:sequence

Grupul xsd:sequence cere ca ecare element din grup s a apar a exact o singur a dat a (dac a nu se specic a altceva cu atributele minOccurs si maxOccurs), iar ordinea este cea precizat a.

9.6. TIPURI SIMPLE

109

9.6

Tipuri simple

Un tip simplu se asoviaz a unui element care nu are elemente copil. Am v azut tipul string, dar exist a si alte tipuri de date care pot precizate. De exemplu, pentru elementul LENGTH se poate preciza tipul duration, iar pentru YEAR tipul gYear Tipurile simple sunt: numerice timp XML sir de caractere boolean referint a URI binare

9.6.1

Tipuri numerice

Tipurile numerice ofer a suport pentru: numere ntregi si n virgul a mobil a numere cu dimensiune nit a sau cu precizie innit a numere cu si f ar a semn Concret: 1. xsd:float - numere n virgul a mobil a pe 32 de bit i, conform IEEE 754 2. xsd:double - numere n virgul a mobil a pe 64 de bit i, conform IEEE 754 3. xsd:decimal - numere cu precizie arbitrar a; echivalente cu java.math.BigDecimal 4. xsd:integer - numere ntregi cu precizie arbitrar a; echivalent cu java.math.BigInteger 5. xsd:nonPositiveInteger - ntregi mai mici sau egali cu 0 6. xsd:negativeInteger - ntregi strict mai mici dec at 0

110

CAPITOLUL 9. XML SCHEMA

7. xsd:long - ntregi pe 8 octet i, cu semn 8. xsd:int - ntregi pe 4 octet i, cu semn 9. xsd:short - ntregi pe 2 octet i, cu semn 10. xsd:byte - ntregi pe 1 octet, cu semn 11. xsd:nonNegativeInteger - ntreg mai mare sau egal cu 0 12. xsd:unsignedLong - ntreg pe 8 octet i, f ar a semn, 0 13. xsd:unsignedInt - ntreg pe 4 octet i, f ar a semn, 0 14. xsd:unsignedShort - ntreg pe 2 octet i, f ar a semn, 0 15. xsd:unsignedByte - ntreg pe 1 octet, f ar a semn, 0 16. xsd:positiveInteger - un ntreg strict mai mare de at 0

9.6.2

Tipuri pentru reprezentarea timpului

xsd:dateTime - ex: 1999-05-31T13:20:00.000-05:00 reprezent and un anumit moment n UCT xsd:date - ex: -0044-03-15 = o anumit a zi xsd:time - ex: 14:30:00.000 = un anumit moment din zi, valabil zi de zi xsd:gDay - ex: 01, 02, . . . , 30, 31 = o anumit a zi dintr-o lun a oarecare xsd:gMonth - ex: 01, 02, . . . , 11, 12 = o anumit a lun a dintr-o zi oarecare xsd:gYear - ex: -0002, -0001, 0001, 0002, 0003 = un an precizat xsd:gYearMonth - ex: 1999-12 = o lun a precizat a dintr-un an precizat xsd:gMonthDay - ex: 10-31 = o zi precizat a dintr-o lun a precizat a xsd:duration - ex: P2000Y10M31DT09H32M7.4312S = durat a n timp

9.7. DERIVARE DE TIPURI

111

9.6.3

Tipuri de date XML

Acestea se potrivesc n mare parte peste tipurile de date precizate n DTD n cazul atributelor. Ele sunt: xsd:ID, xsd:IDREF, xsd:ENTITY, xsd:NOTATION, xsd:IDREFS, xsd:ENTITIES, xsd:NMTOKEN, xsd:NMTOKENS, xsd:language, xsd:Name, xsd:QName, xsd:NCName.

9.6.4

Tipuri de date sir de caractere

xsd:string - o secvent a de 0 sau mai multe caractere Unicode xsd:normalizedString - un sir de caractere n care toate caracterele TAB, salt la linie nou a (CR, LF) sunt nlocuite cu spat ii xsd:token - n sir de caractere n care toate caracterele TAB, salt la linie nou a (CR, LF) sunt nlocuite cu spat ii, spat iile consecutive sunt nlocuite cu un singur spat iu iar spat iile de la nceputul si sf ar situl sirului sunt eliminate.

9.6.5

Tipuri binare

Includerea de valori binare n document XML ar strica buna formare a acestuia; dac a se dore ste a sa ceva se poate trece respectivul cont inut binar n Base 64. Tipurile XSD pentru cont inut binar sunt xsd:base64Binary si xsd:hexBinary.

9.7

Derivare de tipuri

In cazul n care tipurile existente nu sunt pe plac se pot crea altele; tehnicile la care se apeleaz a sunt: restr angerea, reuniunea, enumerarea de valori posibile. Fiecare tip derivat este declarat ca un element xsd:simpleType care are un nume specicat ca valoare de atribut name.

9.7.1

Derivarea prin restr angere

S a presupunem c a valoarea unui element este un ntreg, cuprins ntre 3 (inclusiv) si 100 (exclusiv). Mai degrab a dec at s a ne mult umim cu unul din tipurile ntregi enumerate n sect iunea 9.6.1, putem porni de la unul (de exemplu xs:positiveInteger) si s a oper am restrict ii asupra lui. Exemplu:

112

CAPITOLUL 9. XML SCHEMA

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="myroot" type="myType"/> <xs:simpleType name="myType"> <xs:restriction base="xs:positiveInteger"> <xs:minInclusive value="3"/> <xs:maxExclusive value="100"/> </xs:restriction> </xs:simpleType> </xs:schema> iar documentul XML aferent: <?xml version="1.0" encoding="UTF-8"?> <myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySimpleType1.xsd"> 14 </myroot> Se pot aplica urm atorii operatori de restrict ionare: xsd:minExclusive ce specic a valoarea minim a, exclusiv cea precizat a xsd:maxExclusive ce specic a valoarea maxim a, exclusiv cea precizat a xsd:minInclusive ce specic a valoarea minim a ce poate luat a xsd:maxInclusive ce specic a valoarea maxim a ce poate luat a xsd:enumeration o list a de valori ce poate luat a xsd:whiteSpace arat a cum anume se trateaz a spat iul din interiorul valorii xsd:pattern exprim a o expresie regulat a cu care se compar a expresia dat a xsd:length d anum arul exact de careactere dintr-un string, num arul elementelor dintr-o list a, num arul de octet i dintr-o valoare binar a xsd:minLength, xsd:maxLength - lungimea minim a/maxim a xsd:totalDigits precizeaz a num arul maxim de cifre prezen ntr-un num ar

9.7. DERIVARE DE TIPURI

113

xsd:fractionDigits d anum arul maxim de cifre prezent n partea fract ionar a a unui num ar Pentru exemple concrete, a se vedea [1], capitolul 20.Pentru restrict ionareaprin enumerare, putem avea de exemplu: <xsd:simpleType name="PublisherType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Warner-Elektra-Atlantic"/> <xsd:enumeration value="Universal Music Group"/> <xsd:enumeration value="Sony Music Entertainment, Inc."/> <xsd:enumeration value="Capitol Records, Inc."/> <xsd:enumeration value="BMG Music"/> </xsd:restriction> </xsd:simpleType>

9.7.2

Reuniuni

Se poate crea de asemenea un tip prin reuniunea dintre mai multe tipuri, e ele derivate sau nu. Exemplu: <xs:simpleType name="myType2"> <xs:union> <xs:simpleType> <xs:restriction base="xs:positiveInteger"/> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:duration"></xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>

9.7.3

Liste

S a presupunem c aavem un element YEARS care cont ine o list a de ani: <YEARS>1987 1999 1992 2002</YEARS> Tipul de date asociat ar putea declarat astfel: <xsd:simpleType name="YearList"> <xsd:list itemType="xsd:gYear"/> </xsd:simpleType>

114

CAPITOLUL 9. XML SCHEMA

Pornind de la acest tip se poate obt ine altul, prin restr angere: <xsd:simpleType name="DoubleYear"> <xsd:restriction base="YearList"> <xsd:length value="2"/> </xsd:restriction> </xsd:simpleType>

9.8

Elemente goale

Pentru a crea un element gol (f ar a copii sau subelemente) se declar a acel element, dar f ar a a spune c a avem cont inut de tip xsd:sequence, xsd:all, xsd:choice. Exemplu: <xsd:complexType name="PhotoType"> </xsd:complexType>

9.9

Atribute

S a presupunem c a putem avea un element PHOTO gol care are atribute: <PHOTO ALT="myPhoto" WIDTH="100" HEIGHT="300" SRC="guitar.jpg"/> Declararea atribuelor se face prin: <xsd:complexType name="PhotoType"> <xsd:attribute name="SRC" type="xsd:anyURI"/> <xsd:attribute name="WIDTH" type="xsd:positiveInteger"/> <xsd:attribute name="HEIGHT" type="xsd:positiveInteger"/> <xsd:attribute name="ALT" type="xsd:string"/> </xsd:complexType>

Capitolul 10 API-uri pentru XML: DOM si SAX


10.1 Introducere

Sunt cazuri n care XSL si XPath nu sunt suciente pentru ndeplinirea unei anumite sarcini; de cele mai multe ori trebuie procesat un document XML, cu cod scris manual. Acest lucru este u sor, dat a ind structurarea de care dispune un document XML. Exist a dou a p art i care compun o aplicat ie XML: 1. procesorul de XML (eng: parser) 2. aplicat ia propriu-zis a Un parser se folose ste pentru descompunerea documentului XML n p art ile componente, de exemplu elemente, atribute, comentarii, instruct iuni de procesare, sect iuni CDATA, etc. Mai departe acestea sunt v azute ca ind compuse din etichete de nchidere si deschidere, nume de atribut si valoare, etc. Parserul este componenta cea mai de baz a, dar n acela si timp si cea mai important a parte a unei aplicat ii XML. Este independent a de cont inutul efectiv al documentului, at ata timp c at acesta respect a regulile de bun a formare. Parserul rezolv a probleme de tipul: codicarea documentului, spat ii de nume, declarat ii si referint e de entit a ti, etc, a c aror tratare de c atre programator ar duce la o slab a productivitate. Suplimentar, poate ap area cerint a de validare de c atre un parser fat a de DTD sau XSD sau alt mod de precizare a schemei; ment ion am ns a c a nu se cere ca orice parser de XML s a e si validator. Aplicat ia n sine este cea care beneciaz a de procesarea documentului XML de c atre parser; schema de lucru general a este simpl a: 115

116

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX

1. parserul proceseaz a documentul XML 2. aplicat ia consum a cont inutul furnizat de parser Problema tratat a n acest curs este cum se face comunicarea ntre aplicat ie si parser. Exist a dou a modalitat i: unul bazat pe obiecte si altul bazat pe evenimente. Fiecare variant a dene ste un API1 , apelabil din aplicat ia XML. Interfat a de programare care lucreaz a cu documentul XML v azut ca un set de obiecte (Document Object Model, DOM) este poate cea mai natural a abordare. Se construie ste un arbore de obiecte care corespunde documentului XML; de exemplu pentru listing-ul 10.1 arborele obt inut este cel din gura 10.1. Tabela 10.1: Document XML <?xml version="1.0"?> <curs> <titlu>Tehnologii XML</titlu> <capitol> <nume>Introducere</nume> <sectiune>Scopul cursului</sectiune> <sectiune>Prezentare generala</sectiune> </capitol> <capitol> <nume>Definirea tipului de document</nume> <sectiune>Necesitatea definirii tipului</sectiune> <sectiune>DTD</sectiune> <exercitii/> </capitol> </curs>

Parserul cite ste documentul si construie ste gradual arborele DOM. Nodurile din arbore sunt v azute ca obiecte. Obiectul DOM va reprezenta ntreg documentul n memorie, ceea ce d a posibilitatea c aut arii si oper arii rapide pe document, dar cu un pret pl atit: memoria consumat a. Procesarea bazat a pe evenimente este cea de-a doua abordare. Este un mod natural din perspectiva parserului, dar n prim a faz a poate perceput a ca mai put in util a pentru programator. Dup a ce apare acomodarea cu aceast
1

Application Programming Intrface

10.2. DOM: XML ARBORESCENT Figura 10.1: Arborele asociat documentului XML din exemplul10.1

117

API el poate ales mai des dec at DOM. API-ul rezultat este numit SAX (Simple API for XML). Prin SAX nu se construie ste explicit un arbore ata sat documentului; n schimb, parcurg and documentul se va declan sa un eveniment la ecare deschidere de element, nchidere de element, aparit ie de comentariu, atribut, sect iune CDATA, etc. In felul acesta poate s a verice buna formare a documentului, dar cel mai important se poate react iona la ecare schimbare de context care este considerat a important a; de exemplu, se poate seta ca doar elementele de tip sectiune s a e procesate de c atre aplicat ie. SAX este extrem de rapid, cu consum redus de memorie, dar face parcurgere doar de tip forward-only a documentului. Orice ntoarcere napoi cere redeschiderea documentului XML. Cele dou a API-uri nu sunt n opozit ie, ci servesc unor scopuri diferite. Alegerea unuia sau a altuia din cele dou a modele se face n funct ie de necesit a tile concrete ce se cer rezolvate si de plusurile si minusurile celor dou a API-uri.

10.2

DOM: XML arborescent

Specicat iile W3C pentru DOM sunt mp art ite pe nivele, ecare preciz and funct ionalit a tile cerute si opt ionale. Un parser de XML trebuie s a specice acest nivel pentru care are implement arile funt ionale; de asemenea

118

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX

se mai obi snuie ste includerea de extensii specice produc atorului. La ora actual a exist a recomand ari W3C pentru nivelele 1, 2 si c ateva din modulele de nivel 3, ceea ce nseamn a c a ele sunt complet specicate. DOM permite urm atoarele: crearea de documente si a p art ilor de document (elemente, atribute) navigarea prin document prin parcurgere de arbore mutare, copiere, stergere de elemente ad augare si modicare de atribute De si DOM cont ine cuv antul obiect, el const a din interfet e fat a de care trebuie s a se conformeze ni ste obiecte. Figura 10.2: Setul de interfet e pentru DOM

In cele ce urmeaz a ne vom referi la implementarea Java pentru DOM. Un document XML este reprezentat ca un obiect Document, parte a interfet ei W3C. Metodele sunt:

10.2. DOM: XML ARBORESCENT Tabela 10.2: Metode pentru clasa Document. Metoda Attr createAttribute(String name)

119

Descriere creaz a un obiect reprezent and un atribut Attr createAttributeNS creaz a un atribut (String namespaceURI, String qualiedName) cu nume calicat CDATASection createCDATASection creeaz a un nod CDATA a c arui (String data) valoare este string-ul specicat Comment createComment Creeaz a un nod comentariu (String data) cu textul specicat DocumentFragment Creeaz a un obiect gol de tip createDocumentFragment() DocumentFragment Element createElement(String tagName) Creeaz a un element cu eticheta specicat a Element createElementNS(String creeaz a un element cu nume namespaceURI, String qualiedName) calicat EntityReference createEntityReference creeaz aun obiect (String name) referint a la entitate ProcessingInstruction creeaz a un nod createProcessingInstruction instruct iune de procesare (String target, String data) Text createTextNode(String data) Creeaz a un nod cont in and un text specicat DocumentType getDoctype() returneaz a DTD-ul pentru documentul curent Element getDocumentElement() d a acces la elementul document Element getElementById d a elementul al c arui ID (String elementId) este specicat NodeList getElementsByTagName returneaz a toate elementele cu o (String tagname) etichet a specicat a NodeList getElementsByTagNameNS returneaz a toate elementele (String namespaceURI, String localName) cu nume calicat specicat DOMImplementation getImplementation() returneaz a obiectul DOMImplementation care manipuleaz a obiectul Node importNode(Node importedNode, import a un nod dintr-un alt document boolean deep) n documentul curent Interfat a Node este supertipul oric arui alt tip de date din cauz a c a orice dintr-un document XML este privit ca un nod. Metodele declarate de interfat a

120 sunt:

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX

Tabela 10.3: Metode pentru interfat a Node. Metoda Node appendChild(Node newChild) Descriere Adaug a nodul specicat la s ar situl listei de noduri Node cloneNode(boolean deep) creeaz a o copie a acestui nod NamedNodeMap getAttributes() returneaz a atributele pentru nodul curent dac a acesta este un element NodeList getChildNodes() returneaz a lista nodurilor copil Node getFirstChild() returneaz a primul nod copil Node getLastChild() returneaz a ultimul nod copil String getLocalName() returneaz a partea local a a unui nume complet de nod String getNamespaceURI() returneaz a URI-ul pentru spat iul de nume al nodului curent Node getNextSibling() returneaz a nodul care urmeaz a celui curent String getNodeName() returneaz a numele nodului short getNodeType() returneaz a tipul nodului String getNodeValue() returneaz a valoarea nodului Node getParentNode() returneaz a nodul p arinte String getPrex() returneaz a prexul de spat iu de nume asociat nodului curent Node getPreviousSibling() returneaz a nodul de pe acela si nivel, precedent boolean hasAttributes() spune dac a nodul curent are atribute boolean hasChildNodes() spune dac a nodul curent are copii Node insertBefore(Node newChild, inserez a noul nod nainte de nodul copil Node refChild) referit Node removeChild(Node oldChild) sterge nodul referit si l returneaz a Node replaceChild(Node newChild, nlocuie ste nodul copil al nodului Node oldChild) curent cu un alt nod void setNodeValue(String nodeValue) seteaz a valoarea nodului curent void setPrex(String prex) seteaz a prexul spat iului de nume pentru nodul curent Metoda getNodeType() returneaz a un ntreg asociat nodului curent; n funct ie de tipul nodului, obt inem urm atoarele valori constante denite chiar n interfat a Node: ATTRIBUTE NODE, CDATA SECTION NODE, COMMENT NODE,

10.3. SAX: XML CU EVENIMENTE

121

DOCUMENT FRAGMENT NODE, DOCUMENT NODE, DOCUMENT TYPE NODE, ELEMENT NODE, ENTITY NODE, ENTITY REFERENCE NODE, NOTATION NODE, PROCESSING INSTRUCTION NODE, TEXT NODE. Trebuie spus c a dac a instant iem documentul XML pe baza unui sier si modic am obiectul DOM, nu nseamn a c a se va modica automat si sierul; modic arile vor ap area numai dup a salvarea obiectului DOM napoi n sier. Pentru platforma .NET clasele omoloage sunt n spat iul de nume System.Xml; clasele existente ofer a acelea si servicii ca si cele din Java, cu c ateva extensii introduse de Microsoft; se ofer a compatibilitate complet a cu W3C DOM Level 2 Core.

10.3

SAX: XML cu evenimente

SAX (Simple API for XML) este un API complementar DOM-ului prin care se poate face procesarea unui document XML. Spre deosebire de DOM, nu este standardizat de c atre W3C, ns a principiul pe care se bazeaz a este bine articulat astfel nc at a devenit rapid adoptat de programatori. C a tiva din pionierii XML s-au implicat n proiectul SAX. COmunicarea si urm arirea proiectului s-au f acut n lista de emailuri XML-DEV iar rezultatul nal a fost crearea unui pachet nou de Java, org.xml.sax; totul a fost nalizat n cinci luni. Principiul de lucru este simplu de nteles: parserul va duce la generarea unui ux de noduri de tipuri oarecare. Sosirea ec arui astfel de nod este socotit a un eveniment. De exemplu, se poate cere react ionarea la elementele de tip element cu eticheta nume, care ar procesat a prin: trecerea la r and nou, inserare de tab-uri si schimbare de font, apoi scrierea cont inutului text al elementului. Practic, la ecare eveniment se apeleaz a o metod a (event handler, callback function) denit a convenabil de c atre programator. Acest model are c ateva particularit a ti care trebuie evident iate: viteza mare de lucru: pe m asur a ce se parcurge documentul XML se react ioneaz a la nodurile nt alnite. o act iune este declan sat a at at de repede pe c at este posibil. memorie put in a necesar a: deoarece spre deosebire de DOM, SAX nu construie ste implicit un model al documentului XML (de si poate si este deseori folosit pentru aceasta), memoria alocat a este neglijabil a. Aceasta are un impact important asupra proces arilor ce se fac pe partea de server, accesat a concomitent de mai mult i client i. caracterul serial al proces arii: SAX merge doar nainte, f ar a posibilitatea relu arii de la un punct anterior; dac a se vrea asta, atunci trebuie

122

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX repornit a procesarea; aceast a caracteristic a este datorat a caracterului de lips a de memorie alocat a proces arii SAX.

Caracteristicile de mai sus fac SAX potrivit pentru urm atoarele activit a ti: c autarea ntr-un document a unui anumit cont inut tip arirea formatat a a cont inutului producerea unui alt document XML cu modic ari minore fat a de documentul surs a construirea unui model al documentului (de exemplu DOM) Dar faptul c a SAX nu duce la memorarea cont inutului documentului poate nsemna si sl abiciuni. Este contraindicat SAX n urm atoarele sarcini: reordonarea elementelor documentului rezolvarea referint elor ncruci sate dintre noduri vericarea referint elor de tip IDREF validarea documentului In ciuda acestor limit ari, SAX este o unealt a puternic a. Evenimentele pe care SAX le raporteaz a sunt: deschidere de element nchidere de element parcurgere cont inut de element aparit ia de entit a ti erori de parsare Pentru a nt elege modul de lucru, s a plec am de la documentul XML: <?xml version="1.0"?> <curs> <capitol nume="Introducere"> prezentare generala </capitol> </curs>

10.3. SAX: XML CU EVENIMENTE Prin SAX vom obt ine evenimentele: 1. g asit deschidere de element (curs) 2. g asit deschidere de element (capitol) 3. g asit atribut 4. g asit text 5. g asit nchidere de element (capitol) 6. g asit nchidere de element (curs)

123

La ecare eveniment programatorul poate s a dicteze ce anume se nt ampl a. Desigur, pot ap area diferent e ntre tipurile de evenimente cunoscute, dar ideea de baz a este aceea si. Continu am cu prezentare folosind limbajul Java (.NET nu include SAX, cu toate c a se poate construi unul pornind de la clasele disponibile, sau se poate include un parser open-source). Pentru a implementa un parser bazat pe SAX putem deriva o clas a din DefaultHandler aat a n pachetul org.xml.sax.helpers. Metodele din aceast a clas a sunt date n tabelul 10.4. Tabela 10.4: Metodeele clasei DefaultHandler. Metoda void characters(char[] ch, int start, int length) void endDocument() void endElement(String uri, String localName, String qName) void endPrexMapping(String prex) Descriere proceseaz a caracterele dintr-un element proceseaz a detectarea sf ar sitului de document proceseaz a detectarea sf ar sitului de element

proceseaz a sf ar situl unei map ari de spat iu de nume void error(SAXParseException e) proceseaz a o eroare de parsare recuperabil a void fatalError(SAXParseException e) raporteaz a o eroare fatal a void ignorableWhitespace proceseaz a spat iul neglijabil (char[] ch, int start, int length) (percum cel folosit la identare) void notationDecl(String name, proceseaz a o declarat ie de notat ie String publicId, String systemId) void processingInstruction proceseaz a un PI (String target, String data) InputSource resolveEntity rezol a o entitate extern a (String publicId, String systemId)

124

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX Tabelul 10.4 (continuare)

Metoda void setDocumentLocator (Locator locator) void startDocument() void startElement(String uri, String localName, String qName, Attributes attributes) void startPrexMapping (String prex, String uri) void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) void warning(SAXParseException e)

Descriere seteaz a un obiect Locator pentru evenimentele documentului proceseaz a deschiderea de document manipuleaz a deschiderea unui element

proceseaz a nceputul unei map ari de spat iu de nume manipuleaz a o declarat ie de entitate neparsat a proceseaz a un avertisment de parsare

Un exemplu de metod a care proceseaz a elementele de tip capitol este: public void startElement(String uri, String localName, String qualifiedName, Attributes attributes) { if (qualifiedName.equals("capitol")) { contorCapitol++; } }

10.4

DOM sau SAX?

Cele 2 API-uri nu pot s a se nlocuiasc a reciproc, ele ind complementare. In funct ie de contextul de utilizare (natura proces arii, num arul de proces ari, dimensiunea documentului XML) se face o alegere a unui API, de si p arerile pot mp art ite pentru pentru cazuri mai complexe. Extragem urm atoarele concluzii: dac a ordinea proces arii elementelor este neesent ial a, atunci SAX poate de folos dac a se dore ste analizarea ntregului document, atunci DOM este de preferat, deoarece permite parcurgerea documentului n orice fel. dac a viteza sau memoria consumate sunt importante, atunci SAX; dac a documentul este de mici dimensiuni, sau nu sunt mult client i conectat i

10.4. DOM SAU SAX?

125

la o aplicat ie care s a cear a simultan proces ari de mari dimensiuni, atunci DOM este bun dac a se dore ste doar ltrare, SAX este sucient

126

CAPITOLUL 10. API-URI PENTRU XML: DOM S I SAX

Capitolul 11 XLink si XPointer


11.1 Generalit a ti

XLink (XML Linking Language) reprezint a un mod de creare de hiperleg aturi ntre documentele XML. Diferent a fat a de modul de creare a leg aturilor n HTML este c a orice element XML poate s a devin a un link. XLink suport a linkuri simple (precum n HTML) sau extinse (pentru legarea mpreun a a mai multor resurse). XLink este recomandare W3C din 27 Iunie 2001. XPointer (XML Pointer Language) este un mecanism prin care se permite hiperleg aturilor s a indice spre p art i specice (fragmente) dintr-un document XML. Folose ste expresii asem an atoare cu XPath pentru a naviga n interiorul documentelor XML. Este o recomandare W3C din 25 Martie 2003.

11.2

XLink

In HTML folosim elementul <a> pentru a face o lega atur a la un alt document html. Un alt tip de leg atur a dintre documentul curent si alte resurse este f acut prin intermediul elementului <img>. Totu si, linkurile din HTML au limite: ele pot indica spre un document sau o parte a lui care a fost delimitat a folosind elementul <a> cu atributul name. Spre deosebire de HTML, in XML orice element poate s a cont in a o leg atur a spre alt a resurs a. Leg aturile sunt de dou a tipuri: simple (se face leg atura c atre o singur a resurs a) sau extinse, prin care se dene ste un set de resurse ce vor referite. In acest curs ne vom concentra doar pe linkurile simple - la ora actual a sunt destul de put ine procesoare care pot lucra cu linkurile extinse. Exemplu: 127

128

CAPITOLUL 11. XLINK S I XPOINTER

<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="images/tree.gif" xlink:show="embed" /> Primul atribut stabile ste un spat iu de nume al c arui prex va xlink ce va folosit pentru toate atributele specializate care sunt denite n XLink. Urm atorul atribut, type precizeaz a de ce tip este linkul. Se sugereaz a precizarea acestui atribut, deoarece altfel s-ar putea ca restul elementului s a nu e procesat corect. xlink:href cont ine ca valoare adresa URL a resursei referite, iar xlink:show arat a cum trebuie manipulat linkul: cont inutul sierului tree.gif va nc arcat n acest punct (similar cu comportamentul lui img ntr-un document nc arcat ntr-un browser). Un alt exemplu: <doclink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="anotherdoc.xml" xlink:show="replace" xlink:actuate="onRequest" >apasa aici</doclink> pentru detalii. Pentru atributul show s-a folosit n acest caz valoarea replace, ceea ce nseamn a c a se va face nc arcarea n locul documentului curent, iar aceast a nc arcare se face doar c and utilizatorul apas a click pe link (xlink:actuate). Specicarea resurselor (xlink:href) se face pe baza unui Uniform Resource Identier (URI); exist a dou a moduri de specicare a acestor resurse: una bazat a pe specicarea locat iei resursei (adrese URL - Uniform Resource Locator) iar alta bazat a pe un nume unic si care presupune o tabel care face corespondent a ntre nume si locat ie. Exemple de URL-uri: http://www.w3c.org/Addressing/ http://www.demosite.com:8080/index.htm ftp://ftp.fossil-hunters.org/pub/goodsites.pdf file:///c:/windows URL-urile pot absolute (precum cele de mai sus) sau relative la pozit ia curent a a documentului din care se face referirea; a doua variant a este mai exibil a n cazul n care se face mutarea ntregului director. Se poate folosi,

11.2. XLINK

129

suplimentar, xml:base prin care se precizeaz a un URL x, relativ la care se vor deni celelalte locat ii:

<ul xml:base="http://www.oreilly.com/catalog/learnxml/"> <li><a href="index.html">Main page</a></li> <li><a href="desc.html">Description</a></li> <li><a href="errata/">Errata</a></li> </ul>

Principiul pentru cel de-al doilea mod de specicare a resurselor este simplu: n timp ce locat ia se poate modica, numele resursei r am ane unic. Ca atare, se folose ste un mecanism prin care identicarea locat iei resursei se face prin nume, o alt a component a av and grij a de determinarea locat iei1 . Una din schemele de numire a resurselor este Formal Public Identier (FPI) si a fost descris a n sect iunea 2.3. D am o list a a atributelor XLink si a valorilor lor:

Similar cu ce se nt ampl a n ret ele prin DNS

130

CAPITOLUL 11. XLINK S I XPOINTER Atribut + descriere Valoare xlink:actuate onLoad determin a c and se onRequest ncarc a resursa other Descrierea valorii la nc arcarea documentului la cererea explicit a a utilizatorului (e.g. click) Aplicat ia ar trebui s a inspecteze alt element de marcare din link pentru a determina comp. adecvat Nici un alt element de marcare nu e prezent pentru a ajuta aplicat ia s a determine comp. adecvat Adresa pentru leg atur a Integreaz a resursa n doc. curent se deschide o nou a fereastr a se nlocuie ste documentul curent ca la xlink:actuate ca la xlink:actuate Un link simplu Link extins creeaz a un link locator care indic a spre o resurs a arc cu resurse multiple si diferite c ai de traversare creeaz a un link resurs a indic and spre o anumit a res. Un link de tip titlu

none

xlink:href xlink:show Comportamentul link-ului

xlink:type Tipul linkului

URI embed new replace other none simple extended locator arc resource title

11.3

XPointer

XLink permite referirea unui ntregi resurse (de tip binar, XML, etc). XPointer vine s a completeze aceast a funct ionalitate pentru a permite rederirea unor p art i ale resursei precizate. Forma general a a unuei adrese n care se folose ste XPointer este: url#XPointer De si similar modului n care se fac leg aturile n HTML, combinat ia XLink+XPointer este mult mai exibil a, deoarece permite referirea oric arui element din documentul tint a, nu doar a acelora pentru care s-a stabilit un element <a> cu atributul name. S a considerm documentul XML:

11.3. XPOINTER <?xml version="1.0"?> <personnel> <department id="sales"> <employee> <name>Sarah Bellum</name> <title>Vice President</title> <staff> <employee> <name>Luke Bizzy</name> <title>Manager</title> <staff> <employee> <name>Eddie Puss</name> <title>Sales Clerk</title> </employee> <employee> <name>Mary Anette</name> <title>Sales Clerk</title> </employee> </staff> </employee> <employee> <name>Bubba Gumb</name> <title>Accounts Officer</title> </employee> </staff> </employee> </department> <department id="marketing"> <employee> <name>Tim Burr</name> <title>Vice President</title> <staff> <employee> <name>Laurie Keet</name> <title>Promotions Officer</title> </employee> <employee> <name>Abel Boddy</name> <title>Advertising Officer</title> </employee>

131

132 </staff> </employee> </department> </personnel>

CAPITOLUL 11. XLINK S I XPOINTER

al c arui arbore este dat n gura 11.3. Figura 11.1: Arborele corespunz ator documentului de personal. ([2])

Pentru erferirea la primul element al c arui id este sales se va folosi personel.xml#sales sau personel.xml#id(sales). id() este o funct ie care permite saltul la un element al c arui atribut declarat de tip ID are valoarea precizat a. Fiecare expresie XPointer ncepe cu un termen ce reprezint a o locat ie absolut a care se extinde opt ional cu alti termeni pentru locat ie, unit i prin punct. Termenul absolut ncepe la o anumit a locat ie din document iar restul termenilor duc mai departe, pas cu pas, locat ia referit a. Fiecare termen are forma: nume(args) unde nume este tipul termenului, iar args reprezint a argumentele, desp art ite prin virgul a.

11.3. XPOINTER Exemplu: id(marketing).child(1,employee).child(1,staff)

133

11.3.1

Termeni pentru localizare absolut a

Termenii sunt: id(), root(), origin() si html(). Dup a cum s-a v azut, id() ne pozit ioneaz a pe un element av and un atribut de tip ID cu valoarea precizat a. Termenul root se refer a la ntregul document specicat de URL-ul de baz a. El indic a spre un nod virtual situat naintea elementului r ad acin a; elementul r ad acin a este copil al acestui nod ctiv. Pornind de la acest nod se poate merge mai departe cu: root().child(1,personnel).child(2) Termenul origin() reprezint a elementul de la care se int iaz a o leg atur a. El nu poate folosit mpreun a cu un URL. Este utilizat pentru a conecta elementul de origine cu alt element din acela si document pentru a crea un domeniu (engl: range). Un asemenea domeniu este folosit pentru a reprezenta un set de elemente: selectam <range href="root()..origin()">totul</range> pana in acest punct html() este un termen absolut folosit pentru documentele HTML cu scopul de a localiza primul element <a> pentru care valoarea atributului name coincide cu valoarea dat a ca parametru.

11.3.2

Termeni pentru localizare relativ a

Dup a ce s-a stabilit o locat ie absolu a se poate continua explorarea arborelui DOM XML folosind: child() un nod copil al nodului curent descendant() un descendent al nodului curent in parcurgere DFS ancestor() un nod str amo s al nodului curent following() Un nod dintre cele ce ncepedup a nodul curent preceding() Un nod care ncepe naintea nodului curent fsibling() Un nod frate care urmeaz a nodul curent psibling() un nod frate care precede nodul curent Fiecare din ace sti termeni folosesc ntre 1 si 4 parametri. Lista si ordinea lor este:

134

CAPITOLUL 11. XLINK S I XPOINTER

1. num arul nodului - dac a un termen de localizare poate duce la aparit ia mai multor noduri, e util s a se precizeze care dintre noduri este de interes; numerotarea ncepe de la 1. O valoare pozitiv a num ar a n diret ia nainte, pe c and o valoare negativ a e utilizat a pentru num ararea napoi - de exemplu dac a se vrea utlimul nod, penultimul, etc. 2. tipul nodului - specic a ce tipuri de noduri sunt cerute; dac a valoarea este un nume sau argumentul lipse ste, atunci se consider a element; altfel este nevoie s a se specice una din urm atoarele: #text - un sir de caractere #pi - o instruct iune de procesare #comment - comentarii #element sau * - orice element, indiferent de nume #all - orice nod, indiferent de tip

3. nume de atribut - funct ioneaz a doar pentru elemente; se folose ste atunci c and se cere ca un element s a aibe un atribut (sau orice atribut) - dar nu se poate specica mai mult dec at un atribut; se specic a e numele atributului care trebuie s a e prezent, e * (atribut oarecare). Dac a se folose ste acest parametru, atunci trebuie s a se precizeze si al patrulea parametru - valoarea atributului. 4. valoarea atributului - specic a o valoare pentru un atribut precizat pa punctul anterior, valoare care trebuie reg asit a. Se poate specica o valoare particular a, sau * (orice valoare) sau cuv antul #IMPLIED dac a este vorba de un atribut opt ional. De exemplu: child(1, student, nume, Popescu) aduce primul element copil numit student av and atributul nume cu valoarea Popescu; child(1, student, nume, *) aduce primul element copil numit student av and atributul nume cu orice valoare; child(1, student, nume, #IMPLIED) aduce primul element copil numit student, indiferent dac a are sau nu atribut nume. C ateva observat ii despre termenii folosit i pentru localizare relativ a: 1. n loc de id(sales).child(1,employee).child(1,name) se poate folosi scurt atura id(sales).child(1,employee).(1,name) 2. pentru descendant, un argument negativ nseamn a c a va considera drept prim element pe acela care n mod normal ar ultimul n parcurgerea depth rst search (c autare n ad ancime). 3. following() are ordinea de considerare a nodurilor precum n gura 3.

11.3. XPOINTER Figura 11.2: Ordinea nodurilor pentru following(). ([2])

135

11.3.3

Sub siruri de caractere

Tot ceea ce s-a discutat p an a acum lucreaz a doar cu noduri complete. Pentru sirruri de caractere ns a este uneori necesar a se prelua o parte a lor. Functionalitatea este dat a de metoda string(). Pentru funct ie se specic a ntre dou a si patru argumente; primul argument, de tip numeric spune a c ata aparit ie a unui sir de caractere sau caracter (al doilea argument) se vrea a g asit a. Drept prim parametru se poate folosi si all care nseamn a orice aparit ie a celui de al doilea parametru. Exemplu: string(2, "bubba") g ase ste a doua aparit ie a sirului bubba n textul curent. c autarea este case-sensitive. Putem folosi si stringul vid drept al doilea parametru si atunci se returneaz a caracterul de pe pozit ia corespunz atoare: string(23,""). Al treilea si al patrulea parametru denesc pozit ia de nceput pentru un sir, respectiv lungimea sub sirului de interes. De exemplu, string(1, "Vasco Da Gama", 6, 2) caut a prima aparit ie a stringului Vasco Da Gama, iar dac a aceasta este g asit a se caut a de la al saselea caracter si se aduce un sub sir de caractere de lungime 2: Da.

136

CAPITOLUL 11. XLINK S I XPOINTER

Capitolul 12 Baze de date si XML


Cursul si propune s a prezinte modul n care conlcureaz a dou a tehnologii: XML si bazele de date relat ionale. Referirile si exemplic arile sunt f acute la SQL Server 2005 Express Edition. Desigur, exist a si alte sisteme de gestiune a bazelor de date care prezint a suport pentru XML (Oracle) sau care sunt native XML (eXist, Tamino). Pentru mai multe detalii cititorul poate s a consulte [6] sau [7]. Sunt dou a direct ii de interes pentru lucru cu SQL si baze de date: obt inerea de date sub form a de XML prin SELECT, respectiv memorarea de date de tip XML n baza de date, desigur cu detalierea sprijinului existent.

12.1

Extragerea de date n format XML

O fraz a SQL poate mbog a tit a n Transact SQL cu clauza FOR XML adaugat a la sf arsitul frazei. Clauza este: FOR XML { RAW [(<element>)] [<directives>] [ELEMENTS] | AUTO [<directives>] [ELEMENTS] | EXPLICIT [<directives>] | PATH [(<element>)] [<directives>] [ELEMENTS] } <directives> = [ , TYPE ] [, ROOT (<root>) ] Ment ion am c a rezultatul poate de dou a feluri: document XML (deci bine format) sau fragment XML (un document f ar a elementul r ad acin a). Descriere: 137

138

CAPITOLUL 12. BAZE DE DATE S I XML

RAW: returneaz a un singur element XML pentru ecare nregistrare dat a de SELECT, indiferent de c ate tabele sunt implicate in selectare. Toate c ampurile devin atribute ale elementelor produse. AUTO: se produce o structura de elemente imbricate; apare diferent a fat a de RAW ind pentru cazul join-urilor. Fiecare tabel a din join va crea un nou nivel de imbricare n documentul returnat; ordinea c ampurilor din lista de selet ie ajut a la determinarea structurii documentului XML. EXPLICIT: este modul care asigur a cea mai mare exibilitate, dar de asemenea si cel mai complex. Se bazeaz a pe precizarea unei structuri ierarhice, explicit de c atre utilizator. (<element>): permite precizarea numelui unui element ELEMENTS: c ampurile sunt precizate ca si subelemente n loc de atribute <directives>: precizeaz a TYPE sau ROOT prin care se face o conversie de tip, respectiv adaug a un element r ad acin a fragmentului XML. Vom considera n cele ce urmeaz a dou a tabele, persons si phones cu cerate astfel: CREATE TABLE [dbo].[Persons]( [personId] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](30) NOT NULL, [address] [nvarchar](50) NULL, CONSTRAINT [PK_Persoane] PRIMARY KEY CLUSTERED ( [personId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] respectiv: CREATE TABLE [dbo].[Phones]( [phoneId] [int] IDENTITY(1,1) NOT NULL, [personId] [int] NOT NULL, [phoneNumber] [char](20) NOT NULL, [description] [nvarchar](50) NOT NULL,

12.1. EXTRAGEREA DE DATE IN FORMAT XML

139

CONSTRAINT [PK_Telefoane] PRIMARY KEY CLUSTERED ( [phoneId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Phones] WITH CHECK ADD CONSTRAINT [FK_Phones_Persons] FOREIGN K REFERENCES [dbo].[Persons] ([personId]) ON UPDATE CASCADE ON DELETE CASCADE GO ALTER TABLE [dbo].[Phones] CHECK CONSTRAINT [FK_Phones_Persons] cu datele: 4 Ionescu Brasov 5 Vasilescu Sibiu 6 Popescu Bucuresti respectiv: 14 4 123 acasa 15 4 456 birou 16 5 789 mobil

12.1.1

FOR XML RAW

Consider am fraza select: select personId, [name], [address] from persons cu rezultatul dat mai sus. Ad aug am clauza FOR XML RAW: select personId, [name], [address] from persons for xml raw iar rezultatul este: <row personId="4" name="Ionescu" address="Brasov" /> <row personId="5" name="Vasilescu" address="Sibiu" /> <row personId="6" name="Popescu" address="Bucuresti" />

140

CAPITOLUL 12. BAZE DE DATE S I XML

Observ am c a numele c ampurilor se transform a n nume de atribute, iar valoarea adus a de select este trecut a ca valoare pentru atribute. Orice element se nume ste row; denumirea implicit a poate schimbat a astfel: select personId, [name], [address] from persons for xml raw(person) Remarc am c a avem de-a face cu un fragment XML, deoarece nu avem un unic element r ad acin a. Pentru a ad auga un element r ad acin a cu denumirea implicit a vom scrie: select personId, [name], [address] from persons for xml raw, root cu ie sirea: <root> <row personId="4" name="Ionescu" address="Brasov" /> <row personId="5" name="Vasilescu" address="Sibiu" /> <row personId="6" name="Popescu" address="Bucuresti" /> </root> Denumirea implicit a a elementului r ad acin a se schimb a prin precizarea numelui, ca la schimbarea numelui de elemente de mai sus: select personId, [name], [address] from persons for xml raw(person), root(contacts) cu ie sirea: <contacts> <person personId="4" name="Ionescu" address="Brasov" /> <person personId="5" name="Vasilescu" address="Sibiu" /> <person personId="6" name="Popescu" address="Bucuresti" /> </contacts> Pentru un join ntre cele 2 tabele: select persons.personId, [name], [address], phoneNumber, description from Persons inner join Phones on persons.personId = phones.personId for xml raw obt inem:

12.1. EXTRAGEREA DE DATE IN FORMAT XML <row personId="4" name="Ionescu" address="Brasov" phoneNumber="123" description="acasa" /> <row personId="4" name="Ionescu" address="Brasov" phoneNumber="456" description="birou" /> <row personId="5" name="Vasilescu" address="Sibiu" phoneNumber="789" description="mobil" />

141

Pentru cazul unui left join (se aduc toate persoanele, chiar dac a nu au telefoane), adic a pentru: select persons.personId, [name], [address], phoneNumber, description from Persons left join Phones on persons.personId = phones.personId for xml raw observ am c a lipsesc atributele de telefon si descriere pentru ultuima persoan a: <row personId="4" name="Ionescu" address="Brasov" phoneNumber="123" description="acasa" /> <row personId="4" name="Ionescu" address="Brasov" phoneNumber="456" description="birou" /> <row personId="5" name="Vasilescu" address="Sibiu" phoneNumber="789" description="mobil" /> <row personId="6" name="Popescu" address="Bucuresti" /> Dac a dorim ca atributele s a apar a ca (sub)elemente, vom scrie: select personId, [name], [address] from Persons for xml raw (person), elements cu rezultatul: <person> <personId>4</personId> <name>Ionescu</name> <address>Brasov</address> </person> <person> <personId>5</personId> <name>Vasilescu</name> <address>Sibiu</address> </person> <person>

142

CAPITOLUL 12. BAZE DE DATE S I XML

<personId>6</personId> <name>Popescu</name> <address>Bucuresti</address> </person> Pentru cazul n care se opereaz a o jonct iune pe cele dou a tabele si se folose ste elements vom obt ine: select persons.personId, [name], [address], phoneNumber, description from Persons left join Phones on persons.personId = phones.personId for xml raw, elements cu rezultatul: <row> <personId>4</personId> <name>Ionescu</name> <address>Brasov</address> <phoneNumber>123</phoneNumber> <description>acasa</description> </row> <row> <personId>4</personId> <name>Ionescu</name> <address>Brasov</address> <phoneNumber>456</phoneNumber> <description>birou</description> </row> <row> <personId>5</personId> <name>Vasilescu</name> <address>Sibiu</address> <phoneNumber>789</phoneNumber> <description>mobil</description> </row> <row> <personId>6</personId> <name>Popescu</name> <address>Bucuresti</address> </row>

12.1. EXTRAGEREA DE DATE IN FORMAT XML

143

12.1.2

FOR XML AUTO

Aceast a opt iune produce o structur a imbricat a a rezultatului; este util a pentru cazurile n care se fac jont iuni ntre tabele. Datele de tip detaliu vor aparea ca sub-elemente ale datelor de tip p arinte: select Persons.personId, [name], [address], phoneNumber, [description] from Persons left join Phones on Persons.personId = Phones.personId for xml auto va produce: <Persons personId="4" name="Ionescu" address="Brasov"> <Phones phoneNumber="123" description="acasa" /> <Phones phoneNumber="456" description="birou" /> </Persons> <Persons personId="5" name="Vasilescu" address="Sibiu"> <Phones phoneNumber="789" description="mobil" /> </Persons> <Persons personId="6" name="Popescu" address="Bucuresti"> <Phones /> </Persons> Unii autori ([7]) sugereaz a folosirea clauzei order by pentru a se aduce elementele de tip p arinte grupat, o singur a dat a. Remarc am c a numele de element este luat dupa numele tabelei (sau alias, dac a se foloses ste). Dac a se utilizeaz a elements atunci atributele se vor transforma n elemente, frat i ai elementelor corespunz and tabelelor detaliu: select Persons.personId, [name], [address], phoneNumber, [description] from Persons left join Phones on Persons.personId = Phones.personId for xml auto, elements cu rezultatul: <Persons> <personId>4</personId> <name>Ionescu</name> <address>Brasov</address> <Phones> <phoneNumber>123</phoneNumber> <description>acasa</description>

144

CAPITOLUL 12. BAZE DE DATE S I XML

</Phones> <Phones> <phoneNumber>456</phoneNumber> <description>birou</description> </Phones> </Persons> <Persons> <personId>5</personId> <name>Vasilescu</name> <address>Sibiu</address> <Phones> <phoneNumber>789</phoneNumber> <description>mobil</description> </Phones> </Persons> <Persons> <personId>6</personId> <name>Popescu</name> <address>Bucuresti</address> <Phones /> </Persons>

12.1.3

FOR XML EXPLICIT

Aceast a variant a permite specicarea structurii de XML rezultate. Se poate specica pentru ecare nivel de imbricare continutul, dac a o anumit a dat a apare ca element sau atribut, sau dac a o coloan a poate folosit a ca si criteriu de sortare. Primele dou a coloane dinstr-un astfel de select sunt numite Tag, respectiv Parent si sunt folosite pentru a specica relat ia p arinte-copil. Coloana Tag specic a num arul de etichet a pentru elementul curent; coloana Parent specic a identicatorul elementului p arinte; dac a este 0 sau NULL atunci elementul va pus pe primul nivel; altfel trebuie s a indice spre valori Tag ale altor nregistr ari. Pe l ang a Tag si Parent trebuie s a mai avem si alte c ampuri; ecare c amp are forma: ElementName!TagNumber!AttributeName!Directive care precizeaz a cum anume va ap area ecare dat a selectat a: ElementName d a numele elementului.

12.1. EXTRAGEREA DE DATE IN FORMAT XML TagNumber precizeaz a eticheta pentru elementul curent

145

AttributeName precizeaz a numele de atribut atribut al elementului c aruia i se ata seaz a valoarea dat a ElementName. Directive este un c amp opt ional care se folose ste pentru controlul formatului documentului XML. Poate lua valorile hide, element, xml, cdata. Consider am exemplul: select 1 as Tag, 0 as Parent, personId as [Person!1!personId], [name] as [Person!1!personName], null as [phones!2!phoneNumber], null as [phones!2!phoneDescription] from persons union all select 2 as Tag, 1 as Parent, Persons.personId as [Person!1!personId], Persons.name as [Person!1!personName], phoneNumber as [phones!2!phoneNumber], [description] as [phones!2!phoneDescription] from Persons join Phones on Persons.personId = Phones.personId order by 3, 1 for xml explicit cu rezultatul: <Person personId="4" personName="Ionescu"> <phones phoneNumber="123" phoneDescription="acasa" /> <phones phoneNumber="456" phoneDescription="birou" /> </Person> <Person personId="5" personName="Vasilescu"> <phones phoneNumber="789" phoneDescription="mobil" /> </Person> <Person personId="6" personName="Popescu" /> Pentru mai multe detalii a se consulta bibliograa, [8].

146

CAPITOLUL 12. BAZE DE DATE S I XML

12.1.4

FOR XML PATH

Reprezint a o modalitate mai simpl a de specicare a structurii dec at FOR XML EXPLICIT, dar cu putere de modelare similar a. Exemplu: select personId as "@id", [name] as person_name, [address] as person_address from persons for xml path(person) cu rezultatul: <person id="4"> <person_name>Ionescu</person_name> <person_address>Brasov</person_address> </person> <person id="5"> <person_name>Vasilescu</person_name> <person_address>Sibiu</person_address> </person> <person id="6"> <person_name>Popescu</person_name> <person_address>Bucuresti</person_address> </person> Pentru jonctiune se poate apela la subselect-uri: select personId as "@id", [name] as person_name, [address] as person_address, ( select phoneNumber as phoneNumber, [description] as phoneDescription from Phones where persons.personId = Phones.personId for xml path(phones), type ) from persons for xml path(person) cu rezultatul: <person id="4"> <person_name>Ionescu</person_name>

DE DATE 12.2. UTILIZAREA DE DOCUMENT XML CA SURSA <person_address>Brasov</person_address> <phones> <phoneNumber>123</phoneNumber> <phoneDescription>acasa</phoneDescription> </phones> <phones> <phoneNumber>456</phoneNumber> <phoneDescription>birou</phoneDescription> </phones> </person> <person id="5"> <person_name>Vasilescu</person_name> <person_address>Sibiu</person_address> <phones> <phoneNumber>789</phoneNumber> <phoneDescription>mobil</phoneDescription> </phones> </person> <person id="6"> <person_name>Popescu</person_name> <person_address>Bucuresti</person_address> </person>

147

12.2

Utilizarea de document XML ca surs a de date

In SQL Server 2005 exist a posibilitatea de a folosi un document XML ca un tabel din care se fac select ari. Exemplu: DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc = <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> </Order> </Customer>

148

CAPITOLUL 12. BAZE DE DATE S I XML

<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/> </Order> </Customer> </ROOT> --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT * FROM OPENXML (@idoc, /ROOT/Customer,1) WITH (CustomerID varchar(10), ContactName varchar(20)) Rezultatul este: CustimerID ContactName VINET Paul Henriot LILAS Carlos Gonzlez

12.3

Lucru cu XML ca tip de dat a

SQL Server 2005 are un nou tip de dat a introdus pentru XML, si anume xml. In momentul n care se decide folosirea acestui tip de date trebuie s a se cunoasc a r aspunsul la: 1. vor documentele XML cu schem a sau f ar a? 2. se va stoca un document XML complet sau doar un fragment? 3. se vor asocia una sau mai multe denit ii de schem a tipului de date XML? S a consider am tabela: CREATE TABLE [dbo].[myTable]( [id] [int] IDENTITY(1,1) NOT NULL, [myData] [xml] NOT NULL, CONSTRAINT [PK_myTable] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,

= OFF,

12.3. LUCRU CU XML CA TIP DE DATA ALLOW_PAGE_LOCKS ) ON [PRIMARY] = ON) ON [PRIMARY]

149

Inserarea unui document XML s-ar face cu: INSERT INTO myTable (myData) SELECT * FROM OPENROWSET (BULK D:\studenti.xml, SINGLE_BLOB) AS TEMP Pentru manipularea tipului de date XML avem metodele1 : query(), value(), exist(), nodes(), modify().

12.3.1

Metoda query

Permite folosirea unei expresii XPath pentru reg asirea nodurilor: select myData.query(/studenti/student[prenume="Rafael"]) from myTable Rezultatul este: <student> <nume>Popescu</nume> <prenume>Rafael</prenume> <!-- urmeaza adresa --> <adresa> <judet>Brasov</judet> <oras>Codlea</oras> </adresa> <!-- am terminat adresa --> <grupa numar="1234">Informatica</grupa> <!-- urmeaza partea de limbi straine cunoscute --> <limba_straina>engleza</limba_straina> <limba_straina>franceza</limba_straina> <limba_straina>rusa</limba_straina> <!--nu mai stie alte limbi straine--> <numar_de_la_pantofi>40</numar_de_la_pantofi> <email>ionescu@b.com</email> <telefon tip="mobil" apelabil="seara, dimineata">0712 121212</telefon> </student>
Sunt metode care apart in tipului de date XML, exact ca la relat ie dintre clas a si metode; numele lor este case-sensitive.
1

150

CAPITOLUL 12. BAZE DE DATE S I XML

deci un ntreg nod XML. Alt exemplu: select myData.query(/studenti/student[2]/prenume/text()) from myTable cu rezultatul: Cristina

12.3.2

Metoda value

Metoda value este util a n a extrage valoarea unui nod dup a ce s-a apelat metoda query: DECLARE @xmldoc xml SET @xmldoc = (SELECT myData.query(/studenti/student/adresa) AS node FROM myTable) select @xmldoc SELECT @xmldoc.value(/adresa[1],nvarchar(64)) AS node Rezultat: <adresa> <judet>Brasov</judet> <oras>Codlea</oras> </adresa> <adresa> <judet>Sibiu</judet> <oras>Sibiu</oras> </adresa> BrasovCodlea

12.3.3

Metoda exist

Este folosit a pentru a determina dac a u nanumit nod exist a. Rezultatul este 0 dac a nu exist a si 1 altfel: select id, myData.exist(/studenti/student[nume="Vasilescu"]) from myTable

12.3. LUCRU CU XML CA TIP DE DATA

151

12.3.4

Metoda modify()

Permite modicarea n documente XML. Concret, ea permite inserare, modicare si stergere n documentele XML. Exemplu: pentru inserare vom folosi DECLARE @xmldoc xml SET @xmldoc = (SELECT xml.query(/demographics//city[name="Brisbane"]) FROM demXML) SET @xmldoc.modify(insert <area>100000</area> into (/city)[1]) SELECT @xmldoc Pentru modicare vom avea: DECLARE @xmldoc xml SET @xmldoc = (SELECT xml.query(/demographics//city[name="Brisbane"]) FROM demXML) SET @xmldoc.modify(insert <area>100000</area> into (/city)[1]) SET @xmldoc.modify(replace value of (/city/area/text())[1] with "200000") SELECT @xmldoc Pentru stergere: DECLARE @xmldoc xml SET @xmldoc = (SELECT xml.query(/demographics//city[name="Brisbane"]) FROM demXML) SET @xmldoc.modify(insert <area>100000</area> into (/city)[1]) SET @xmldoc.modify(delete /city/area) SELECT @xmldoc

12.3.5

Metoda nodes()

Metoda nodes() produce instant e de XML care suport a metodele anterioare. DECLARE @xVar XML SET @xVar = <book genre="security" publicationdate="2002" ISBN="0-7356-1588-2"> <title>Writing Secure Code</title> <author> <first-name>Michael</first-name> <last-name>Howard</last-name>

152

CAPITOLUL 12. BAZE DE DATE S I XML </author> <author> <first-name>David</first-name> <last-name>LeBlanc</last-name> </author> <price>39.99</price> </book>

-- select the FIRST and LAST names from within the XML -- where the first-name is/is not David SELECT nref.value(first-name[1], nvarchar(max)) FirstName, nref.value(last-name[1], nvarchar(max)) LastName FROM @xVar.nodes(//author) AS R(nref) --WHERE nref.exist(.[first-name != "David"]) = 1 WHERE nref.exist(.[first-name = "David"]) = 1

12.4

Indexare pe XML

SQL Server 2005 permite crearea de indec si pe tipul de date XML. Se permite crearea a 4 tipuri diferite de indec si: Index XML primar - cont ine c ate un r and pentru ecare nod, organizat ia ca un arbore B. Este de fapt o vedere relat ional a a structurii ierarhice de XML. index cale - este de ajutor atunci c and se face c atarea folosind c ai (principalul mod de referire folosind XPath); se compune din c ai de noduri + valori index proprietate - un index pe cheia primar a tabelei XML + c ai + valori index valoare - similar cu indexul cale, dar valorile sunt indexate naintea c ailor. Este util pentru a face c autare a valorilor n documentul XML, indiferent de calea c atre acestea

Bibliograe
[1] XML 1.1 Bible, Elliote Rusty Harold, Willey Publishing, 3rd edition, 2003 [2] Learning XML, Erik T. Ray, Ed. OReilly, 2001 [3] Mastering XML, Ann Navarro, Charles White, Linda Burman, Ed. Sybex Inc, 1999 [4] XPath: Navigating XML with XPath 1.0 and 2.0 Kick Start, Steven Holzner, Ed. Sams Publishing, 2003 [5] XSL-FO Tutorial, ***, URL: http://www.w3schools.com/xslfo/default.asp [6] XML Data Management: Native XML and XML-Enabled Database Systems, Akmal B.Chaudhri, Awais Rashid, Roberto Zicari, Ed. Addison Wesley, 2003 [7] Beginning XML Databases, Gavin Powell, Wrox Press, 2007 [8] Using FOR XML EXPLICIT, http://www.ianywhere.com/developer/ product manuals/sqlanywhere/0901/en/html/dbugen9/00000534.htm

153

S-ar putea să vă placă și