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 Trsturi ale limbajului XML . . . . . . . . . aa 1.3.1 Formatul datelor . . . . . . . . . . . . 1.3.2 Limbaj de marcare specic domeniului 1.3.3 Acces programatic facil . . . . . . . . . 1.3.4 Creare uoar . . . . . . . . . . . . . . s a 1.3.5 Utilizare uoar Internet . . . . . . . s a n 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 Aplicatii XML . . . . . . . . . . . . . . . . . . 1.6 Tipuri de instrumente XML . . . . . . . . . . 1.7 Compozitia unui document XML . . . . . . . 1.7.1 Declaratia XML . . . . . . . . . . . . . 1.7.2 Elemente . . . . . . . . . . . . . . . . 1.7.3 Atribute . . . . . . . . . . . . . . . . . 1.7.4 Comentarii . . . . . . . . . . . . . . . 1.7.5 Referinte la entiti . . . . . . . . . . . at 1.7.6 Sectiuni de marcare . . . . . . . . . . . 1.7.7 Instructiuni de procesare . . . . . . . . 1.8 Spatii de nume . . . . . . . . . . . . . . . . . 1.9 Buna formare a documentelor XML . . . . . . 1.10 Arborele ataat unui document XML . . . . . s 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 - generaliti . at 2.3 Declaratii DTD . . . . . . . . . . . . . . . 2.4 Comentarii DTD . . . . . . . . . . . . . n 2.5 Declarare de elemente . . . . . . . . . . . 2.5.1 Specicarea de continut oarecare . 2.5.2 Specicarea continutului de tip text 2.5.3 Specicarea elementelor copil . . . 2.5.4 Continut mixat . . . . . . . . . . . 2.5.5 Elemente goale . . . . . . . . . . . 2.5.6 Exemplu . . . . . . . . . . . . . . . 3 DTD - continuare 3.1 Declaratii de entiti . . . . . . . . . at 3.1.1 Entiti interne . . . . . . . . at 3.1.2 Entiti externe . . . . . . . . at 3.2 Declarare de atribute . . . . . . . . . 3.2.1 Generaliti . . . . . . . . . . at 3.2.2 Atribute fr valori implicite . aa 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 ir de caractere . . . . . . s 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 Relatia de familie cu alte noduri 4.3.4 Valoarea de string a unui nod . 4.4 Tipuri de noduri . . . . . . . . . . . . 4.4.1 Nodul rdcin . . . . . . . . . a a a 4.4.2 Nodul element . . . . . . . . . . 4.4.3 Nodul atribut . . . . . . . . . . 4.4.4 Nodul instructiune de procesare 4.4.5 Nodul comentariu . . . . . . . . 4.4.6 Nod text . . . . . . . . . . . . .

CUPRINS 4.4.7 Nod spatiu 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 Functii i operatori XPath . . . . . . . . . . . . . . . s 5.1.1 Operatori i functii pentru tipul boolean . . . s 5.1.2 Operatori i functii pentru tipul numeric . . . s 5.1.3 Functii pentru tipul ir de caractere . . . . . . s 5.1.4 Operatori i functii pentru tipul set de noduri s 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 conditionale . . . . . . . . . . . . . . 5.2.9 Expresii cuanticate . . . . . . . . . . . . . .

6 XSLT 83 6.1 Generaliti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 at 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 pentru elemente . . . . . 91 a 6.3.2 Regula de template implicit pentru noduri text i atria s bute . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 6.3.3 Regula de template implicit pentru instructiuni de a procesare i comentarii . . . . . . . . . . . . . . . . . . 93 s 6.4 Template-uri pentru valori de atribute . . . . . . . . . . . . . 93 6.5 Specicarea ieirii la runtime . . . . . . . . . . . . . . . . . . . 94 s 6.5.1 Inserarea de elemente documentul de ieire cu xsl:element 94 n s 6.5.2 Inserarea de atribute documentul de ieire cu xsl:attribute 94 n s

CUPRINS 6.5.3 Inserarea de PI documentul de ieire cu xsl:processing-instruction 95 n s 6.5.4 Inserarea de comentarii documentul de ieire cu xsl:comment 95 n s 6.5.5 Inserarea de text documentul de ieire cu xsl:text 95 n s 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 tipizrii . . . . . . . . . . . . . a 9.2.2 Sintaza non-XML . . . . . . . . . . . 9.2.3 Scalabilitatea redus . . . . . . . . . a 9.2.4 Nesuportarea spatiilor de nume . . . 9.2.5 Structura inexibil . . . . . . . . . . a 9.2.6 Alte limitri . . . . . . . . . . . . . . a 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 ir de caractere . . . . s 9.6.5 Tipuri binare . . . . . . . . . . . . . 9.7 Derivare de tipuri . . . . . . . . . . . . . . . 9.7.1 Derivarea prin restrngere . . . . . . a 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

i SAX s 115 . . . . . . . . . . . . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . . 117 . . . . . . . . . . . . . . . . . . . . 121

CUPRINS

10.4 DOM sau SAX? . . . . . . . . . . . . . . . . . . . . . . . . . . 124 11 XLink i XPointer s 11.1 Generaliti . . . . . . . . . . . . . . . . . at 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 Subiruri de caractere . . . . . . . s 12 Baze de date i XML s 12.1 Extragerea de date format XML . . . n 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 de a 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 att a limbajului a XML, ct mai ales a tehnologiilor conexe; intentionm de asemenea s trecem a a a revist domeniile de utilizare a acestor tehnologii, strns corelatie cu n a n a a tipurile de aplicatii care folosesc XML. Cursul contine o prezentare a: limbajului XML modului de validare a unui document XML modurilor de procesare a unui document XML adresrii portiunilor din XML a transformrii documentelor XML a legturii dintre XML i serviciile web a s suportul XML oferit de ctre sistemele de baze de date de generatie a nou a

1.2

Prezentare general a

XML (Extensible Markup Language) este un metalimbaj propus de ctre a World Wide Web Consortium (W3C) care are drept scop depirea unor as A probleme legate de limbajele de marcare existente (HTML, LTEX, RTF). XML este un limbaj de marcare, insemnnd c folosete niste constructii a a s 9

10

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

specice - elemente - ce precizeaz modul de structurare a datelor. Spre a deosebire de elementele folosite limbajul HTML, ele nu precizeaz nimic n a relativ la modul care sunt prezentate datele continute. n Limbajul este extensibil; asta nseamn c el permite crearea de elemente a a cadrul unui document XML, dup dorinta programatorului; mai mult n a dect att, un document XML poate include referinte la alte resurse, sau a a alte tipuri de continut. Un exemplu de document XML este dat listing-ul 1.1: n Tabela 1.1: Document XML pentru modelarea unei colectii 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> Observm ca elementele (biblioteca, titlu, editura) sunt denite in mod a convenabil de ctre noi. De asemenea, documentul este evident structurat: a biblioteca detine mai multe crti, care prezint drept caracteristici titlul, a a autorul/autorii, editura. Tot acum remarcm c elementele denesc i sea a s mantica datelor din document. Unul din aspectele remarcabile ale limbajului XML este c el permite sea pararea continutului, a prezentrii i a interactiunii. Aceasta este o diferent a s a major fat de un document HTML de tipul: a a <HTML> <HEAD> <TITLE>Exemplu de HTML</TITLE> </HEAD>

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

11

Remarcm c documentul de mai sus este de asemenea structurat, dar para a tea de continut este mixat cu partea de prezentare: de exemplu tag-urile a <CENTER> i <b> se refer la modul de aare i nu au rol de structurare s a s s a continutului documentului; schimb, elementele <HTML>, <HEAD>, n <BODY> se refer la structura documentului HTML. cazul documentea In lor de tip XML, a, formatarea este precizat separat (documente CSS sau ns a transformri XSLT). a

1.3
1.3.1

Trsturi ale limbajului XML a a


Formatul datelor

Un document XML este reprezentat ca un ir de caractere; s-a depit s as astfel bariera reprezentrilor binare care de cele mai multe ori sunt elese a nt i produse de un set restrns de aplicatii. Accesul la un document XML s a nu depinde de nici o aplicatie particular parte. Este o situatie total a n diferit de cea a unui ier .mdb, care dei contine aceleai date, nu poate a s s s interpretat dect de Access. a Altfel spus, semantica datelor nu mai este continut doar de codul care a prelucreaz datele, ci este dat chiar documentul XML. Aceast facilitate a a n a este cunoscut i sub bumele de auto-descriere, fcnd din documentul XML as a a un tip de date auto-continut.

1.3.2

Limbaj de marcare specic domeniului

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

12

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

fcut s e rapid acceptat i folosit. Dei cele din urm un document XML a a s s n a este destinat unei aplicatii, alegerea adecvat a elementelor poate facilita a dezvoltarea de programe care s foloseasc un asemenea document. a a

1.3.3

Acces programatic facil

Unul din scopurile declarate de la nceput a fost crearea unui mod de comunicatie care s e uor de integrat orice limbaj de programare; aceasta a s n face uoar comunicarea s a ntre productorii de date i aplicatiile de prelucrare a s sau prezentare a lor. Mai mult dect asta, comunicarea a ntre aplicatii devine mult mai simpl, chiar dac se folosesc platforme diferite. Avem aici vedere a a n nu doar aplicatiile create cu ultimele tehnologii, ci i cele de tip motenit s s (engl: legacy) care de cele mai multe ori folosesc protocoale i tehnologii s proprietare, greu de extins si de interfatat. Datorit caracterului structurat al unui document XML procesarea lui a este mult uurat. Regulile care denesc buna formare a unui document s a XML fac parcurgerea unui asemenea document mult mai facil dect a unui a a document HTML, de exemplu.

1.3.4

Creare uoar s a

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

1.3.5

Utilizare uoar Internet s a n

Designerii limbajului XML l-au vzut ca un standard de interoperabilia tate, care s poat folosit peste infrastructura de comunicatie existent a a a (Internet). La ora actual, XML interactioneaz mod transparent cu proa a n tocolul HTTP sau alte protocoale majore de comunicare utilizate curent. Un alt motiv pentru care XML este considerat prietenos fat de Internet este a faptul c poate utilizat majoritatea limbajelor folosite dezvoltarea de a n n aplicatii Web; pe lng suportul oferite de limbajele server-side, amintim i a a s de AJAX - care se bazeaz pe o comunicare cu serverul folosind JavaScript a i XML ca mod de transmitere al mesajelor. s

1.4. TEHNOLOGII INRUDITE

13

1.3.6

Modelul semistructurat

Stocarea datelor este o problem rezolvat de ctre sistemele de gestiune a a a a bazelor de date. Dar modelarea relational a datelor impune un model rigid, a specicat apriori i asupra cruia este greu de intervenit ulterior. XML-ul, pe s a de alt parte, este mai adecvat utilizrii a a ntr-un mediu descentralizat, cu surse de date multiple i cu date a cror structur variaz. Desigur, exist trucuri s a a a a prin care un SGBD relational suport structur variabil, dar rezolvrile nu a a a a fac dect s simuleze abilitile intrinseci ale unui document XML. La ora a a at actual se remarc tot mai mult folosirea unor SGBD-uri cu suport nativ a a pentru retinerea documentelor de tip XML.

1.4

Tehnologii nrudite

XML vine it de o familie de standarde nsot nrudite ce asigur o utilizare i a mai uoar contexte diferite. Tehnologiile majore care se folosesc context s a n n 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 urmtoare.O prezentare a succint este dat cele ce urmeaz. a a n a

1.4.1

XSL

Un document XML poate s e preluat i transformat a s ntr-un alt continut A - e el HTML, L TEX, RTF, alt document XML sau chiar continut binar. Aceste tipuri de transformri se a zona a dou aplicatii: a a n a XSLT = XSL Transformations XSL-FO = XSL Formatting Objects XSLT este un limbaj de tip recursiv, care specic transformrile ce trea a buie aplicate diferitelor sectini de document XML pentru a obtine alte rezul tate. Pe lng partea de formatare vizual a datelor, XSLT poate s fac i a a a a as schimbarea ordinii elementelor sau combinarea datelor. Este folosit special n pentru obtinerea 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 se plaseaz un anumit text relatie cu alte elea a n mente de pe pagin. De asemenea poate ataa stiluri i fonturi elementelor a s s dintr-o pagin. Este folosit deseori pentru producerea de documente PDF. a

1.4.2

XPath, XLink, XPointer

XPath este folosit la adresarea elementelor dintr-un document XML, pe baza relatiilor ierarhice existente. Poate folosit att limbajele de proa n gramare clasice (de exemplu pentru selectarea unor noduri care satisfac un anumit crieriu) ct i de ctre alte tehnologii (de exemplu XSLT, pentru a s a identicarea abloanelor). s XLink permite unui element s devin o legtur ctre un alt document. a a a a a Mai mult, ea permite denirea de legturi extinse (de tip bidirectional i a s ntre mai multe documente). XPointer permite adresarea de continut din interiorul altui document XML; astfel, se poate face referire la un continut particular al unui document (al 4-lea element, de exemplu) sau la un domeniu ntreg dintr-un document, fr ca aceasta s impun modicarea intr-un fel anume al documentului aa a a ctre care se face referire. a

1.4.3

DTD, XSD

DTD (Document Type Denition) i XSD (XML Schema Denition) pres cizeaz care este structura acceptat pentru un document XML. Se specic a a a astfel ce elemente pot aprea a ntr-un document XML i ce pot contine acess tea. timp ce un document DTD are un format aparte, un document XSD In este de tip XML, deci poate procesat cu unelte dedicate XML.

1.5

Aplicatii XML

Pentru a da o idee despre paleta larg de aplicatii care XML este implia n cat facem o enumerare (incomplet) a principalelor directii i implementri: a s a prezentarea ctre utilizator a continutului a formatare de continut pentru browsere: XHTML - Extensible HTML formatare de continut pentru browsere din mediul mobil: WML Wireless Markup Language

1.6. TIPURI DE INSTRUMENTE XML grac vectorial: SVG a a formulare electronice: XForms reprezentarea tipurilor de continut expresii matematice: MathML formule chimice: CML - Chemical Markup Language notatie muzical: MusicML a reprezentarea unor cuvinte ce sunt pronuntate: VoiceXML

15

prezentri multimedia pentru Web: SMIL - Synchronized Multia media Integration Language componente pentru interfata grac cu utilizatorul: XAML (Ex a tensible Application Markup Language) stocarea documentelor de tip oce: OpenDocument folosit in OpenOce descriere de resurse Web: difuzare de continut 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 servicii Web: SOAP - Simple Object Access Protocol n procese de afaceri: BPEL4WS - Business Process Execution Language for Web Services, ce denete procesele de afaceri care s interactioneaz cu procese exterioare a

1.6

Tipuri de instrumente XML

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

16

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

parsere - numite i procesoare sau analizoare; sunt nite componente care s s folosesc structura intrinsec a unui document XML i permit operatiile a s pe elemente (gsirea unui element anume, inserarea sau modicarea de a elemente, etc). De asemenea parserele sunt folosite pentru a determina dac un document este bine format (vezi sectiunea 1.9) sau valid (vezi a sectiunea 2.1). Scopul lor este de a folosit de ctre aplicatii. a aplicatii de vizualizare - din aceast categorie avem browserele (Firefox, a Internet Explorer) sau aplicatiile de desenare (SVGViewer) care dau o viziune asupra documentului XML; se bazeaz pe parsere incluse. a

1.7

Compozitia unui document XML

Un document XML este compus din: 1. declaratie (sau prolog) 2. elemente 3. atribute 4. comentarii 5. referinte la entiti at 6. sectiuni de marcare 7. instructiuni de procesare Inainte de a trece la detalierea acestor constituenti, facem precizarea c a limbajul XML este de tip case-sensitive; astfel, <autor> nu este echivalent cu <Autor>.

1.7.1

Declaratia XML

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

1.7. COMPOZITIA UNUI DOCUMENT XML

17

Nu este permis omiterea numrului de versiune, scrierea de spatiu a a ntre <, ? i cuvntul xml, schimbarea literelor mari cu mici sau inserarea de spatiu s a ntre ? de la nal i simbolul >. Declaratia de XML, dac este prezent, s a a trebuie s e prima entitate din document, nu poate precedat nici mcar a a a de spatii. Drept valoare pentru version se poate specica 1.0 sau 1.1. Documentul trebuie s respecte intern canoanele versiunii precizate, altfel se va declara a eroare de ctre parser i orice actiune pe document este a s ntrerupt. a Alte pseudo-atribute1 care se pot specica pentru acest preambul sunt: 1. encoding - specic un subset al setului de caractere Unicode care a este folosit pentru scriere documentului. Valorile UTF-8 i UTF-16 s sunt cele mai des alnite i suportate de ctre toate procesoarele de nt s a XML, dar se mai pot specica i ISO-8859-1 sau ISO-8859-2 sau altele s valide. Dac nu se specic nici un tip de codicare, implicit se va a a considera valoarea UTF-8. UTF-8 se va folosi un singur byte pentru In caractere ASCII (cu numr de ordine cuprins a ntre 0 i 127), 3 octeti s pentru seturi de caractere mai putin folosiet (silabe hangul i caractere s Han) i 2 octeti pentru majoritatea altor caractere. s 2. standalone - atribut optional binar (cu valorile yes i no) care spe s cic dac acest document face referire la alte documente care contin a a denitii ale unor alte elemente, atribute sau entiti. De exemplu, dac at a un document XML depinde de un alt document DTD extern, atunci se va specica valoarea no. Prin lips acest atribut va avea valoarea a yes.

1.7.2

Elemente

Un element este unitatea structural a unui document XML. Datele sunt a scrise sub forma unor perechi etichet de deschidere - etichet de a a nchidere ntre care se a text sau alte sub-elemente. Relatia este deci de continere. a Intr-un document XML exist un unic element care nu are nici un element a printe, numit element rdcin. a a a a S considerm un exemplu de document XML: a a <?xml version="1.0" encoding="ISO-8859-2"?> <cursuri> <curs titlu="Tehnologii XML">
Acestea nu sunt propriu-zis nite atribute, deoarece declaratia de XML nu este un s 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 denete rdcina documentului; el contine un element s a a copil (sub-elemente) curs. Elementul curs contine dou elemente copil a numite capitol, .a.m.d. Observm c ecare astfel de element este denit s a a printr-o etichet de deschidere i una de chidere care are exact acelai a s n s nume i mod de scriere a literelor, precedat de caracterul /. s Numele unui element poate s contin litere, cifre, minus, dou puncte, a a a caracter de subliniere; trebuie s a nceap cu liter sau cu caracter de sublia a niere; nu se permite s a nceap cu irul xml (indiferent de modul de scriere a s al literelor) deoarece acest identicator este rezervat. Intre numele propriuzis al elementului i caracterul < nu se permite spatiu. Nu se accept spatiu s a interiorul numelui unui element. n Continutul unui element poate s e orice ir de caractere care respect a s a codicarea dat atributul encoding. Dac continut avem caracterele &, a n a n <, > atunci ei trebuie substituiti cu referinte la entitate (vezi 1.7.5) sau cu sectiuni CDATA (1.7.6). Eticheta de chidere trebuie s e scris cu aceleai caractere ca i n a a s s eticheta de deschidere (XML este case-sensitive). Eticheta de nchidere se scrie sub forma </etichetaelement>; nu se admite spatiu imediat nainte sau dup simbolul slash. a Un element poate s nu contin nici un text - acest caz este un elea a n ment gol; de exemplu, pentru situatia de mai sus putem considera c ecrui a a capitol putem ataa optional o sectiune de exercitii; pentru cazul care i s n nu avem o sectiune de acest tip, putem simboliza prin: <exercitii></exercitii> sau echivalent: <exercitii/>

1.7. COMPOZITIA UNUI DOCUMENT XML

19

Nu se admite ca ntre simbolul / i > sau s e spatiu; ultimul s a n caz, se poate lsa un spatiu a nainte de caracterul /. O alt regul de baz pentru scrierea elementelor este c elementele se a a a a pot imbrica, dar nu se pot suprapune; altfel spus, daca elementul a contine elementul b, atunci b trebuie s se a nchid a naintea lui a. Este permis ca s mixm textul cu alte elemente continutul altui elea a n ment, atta timp ct regulile de mai sus nu sunt alcate: a a nc <result> The <highlight>company</highlight> is centered on... </result>

1.7.3

Atribute

Atribute denite de utilizator Un atribut permite declararea unei proprieti at mpreun cu valoarea asoa ciat. Ele se denesc pentru elemente, doar interiorul etichetei de deschia n dere; au forma: nume="valoare" sau nume=valoare Spre deosebire de atributele din limbajul HTML, valorile trebuie s e delia mitate de apostroafe sau ghilimele. Un element poate avea oricte atribute, a dar un nume de atribut nu poate s apar de mai multe ori cadrul aceluiai a a n s element. Valoarea atributului trebuie precizat (chiar dac e stringul vid). a a Plecnd de la exemplul 1.1 de la pagina 10, putem rescrie precum a n listing-ul 1.2. Numele atributelor se d dup aceleai reguli ca la elemente. a a s Remarcm c unele cazuri, atributele i valorile lor pot prelua rolul elea a n s mentelor. Pe lng cele denite de utilizator, XML pune la dispozitie a trei atria a nc bute predenite: xml:space, xml:lang, xml:id. Atributul xml:space cazul care exist mai multe spatii albe consecutive, acestea pot In n a considerate redundante sau pot avea o semnicatie special i ar trebui a s pstrate ca atare. Atributul xml:space poate avea dou valori: default i a a s 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. COMPOZITIA UNUI DOCUMENT XML

21

Un procesor (parser) XML pstreaz spatiile i le d mai departe aplicatiei, a a s a indiferent de valoarea atributului xml:space. Aplicatia este cea care va in terpreta acest atribut; dac este default se va considera c spatiile multiple a a adiacente nu sunt relevante i de obicei aplicatia va face colapsarea lor la unul s singur. Pentru valoarea preserve parserul comunic faptul c spatiile ar trea a bui pstrate, altfel spus, c spatiile sunt semnicative. Relevanta spatiilor a a depinde de aplicatia destinatie sine: pentru un compilator ele nu sunt im n portante, dar au relevant pentru un editor de cod surs. Deoarece un broa a wser colapseaz automat spatiile, atunci cnd un document XML se a a ncarc a browser atributul xml:space va ignorat. n Elementele care sunt descendenti ai unui element care are precizat acest atribut vor moteni atributul cu tot cu valoare, dac nu cumva se face o s a precizare explicit pentru un element anume. a Atributul xml:lang Atributul xml:lang descrie limba (i optional de ara) care este scris s t n continutul 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 pentru continutul elementului a <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 aplicatie (de exemplu un motor de cutare) ar putea folosi i raporta doar elementele al cror continut a s a este scris ntr-o anumit limb, conform preferintelor utilizatorului. a a Atributul xml:id Exist o propunere de permite specicarea unui identicator unic pentru a ecare element. Pentru aceasta s-ar folosi atributul xml:id, iar pe baza valorii lui s-ar putea face referinte (din interior sau din exterior) la elemente din document. Trebuie a inut cont de faptul c este doar o recomandare, iar la ora ns t a actual parserele de XML nu suport toate acest atribut; altfel spus, pua a tem scrie un document in care noduri diferite s aib aceeai valoare pentru a a s xml:id, iar arcarea nc ntr-un browser larg utilizat s nu duc la raportare a a 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 ce va ignorat de ctre un procesor a a a XML. Ea este delimitat de <!-- i --> i se poate scrie pe mai multe linii. a s s Comentariile se folosesc pentru scriere de documentatii sau pentru eliminarea temporar a anumitor zone. a Tabela 1.6: Comentariu XML n <!--sectiunea urmatoare trebuie sa fie mutata --> <inregistrare>continut</inregistrare>

Deoarece comentariile nu sunt elemente, ele pot aprea i a s nainte de deschiderea elementului rdcin, ct i dup el. Totui nu se pot pune a a a a s a s naintea declaratiei de XML. Un parser de XML poate s dea mai departe unei aplicatii continutul a unui comentariu, dar nu este obligatoriu s o fac. a a

1.7.5

Referinte la entiti at

Dup cum se vede, exist anumite simboluri (mai mic, mai mare, apostrof, a a ghilimele) care au deja o semnicatie cadrul unui document XML: ele sunt n folosite pentru elemente sau valori de atribute. Dac se dorete folosirea a s acestor simboluri continutul textual al unui element sau ca valoare de n atribut, vor aprea erori de interpretare; spre exemplu, cnd un procesor a a XML gsete un simbol < va considera c urmeaz o etichet. a s a a a Ca atare, ele trebuie s e substituite i acest lucru se face cu nite a s s referinte la entiti (aliasuri). O astfel de referint are forma &entitate;. at a Deoarece simbolul & este folosit pentru referinte la entitate (deci este i el s un simbol rezervat XML), pentru gurarea lui se va folosi o alt referint. a a Tabelul 1.7 contine referintele la entitate predenite. Exemplul 1.8 arat a cum se folosesc cadrul unui continut de document. n Mai mult dect att, exist posibilitatea crerii unor componente care pot a a a a reutilizate interiorul unui document XML. Aceste componente (numite n

1.7. COMPOZITIA UNUI DOCUMENT XML Tabela 1.7: Entitile la referint predenite at a Simbol Entitate < &lt; > &gt; &quot; &apos; & &amp;

23

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

entiti) care au un nume unic atatat pot ulterior referite. Pentru denirea at s de entiti (interne sau externe), a se vedea sectiunea 3.1. at

1.7.6

Sectiuni de marcare

Sunt cazuri care vrem s includem n a ntr-un document prti a ntregi care nu trebuie procesate ca i continut XML, ci luate aa cum sunt. Este cazul s s n care avem text ce contine multe aparitii ale caracterelor din sectiunea 1.7.5. Dei se poate face substituirea ecrui caracter conform celor artate, exist s a a a o variant mai simpl, bazat pe folosirea sectiunilor de marcare (numite i a a a s sec tiuni CDATA). Sintaxa unei astfel de sectiuni este <![CDATA[ . . . ]]>. locul punctelor In se va pune textul care va redat de ctre parser ad-literam. a O astfel de sectiune se poate pune oriunde este accepat continut de tip text; se folosete deseori la includerea de cod surs formatat. s a

1.7.7

Instructiuni de procesare

Instructiunile de procesare nu sunt destinate parserului de XML ci au drept scop precizarea unor actiuni care trebuie ndeplinite de ctre un nivel a superior. O asemenea instructiune ncepe cu <? i se termin cu ?>. Un s a parser XML este obligat s trimit mai departe aplicatiei aceast instructiune a a a

24

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML Tabela 1.9: Sectiune 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. Instructiunile de procesare pot avea drept efect lansarea unei aplicatii auxiliare, care este determinat de ceea ce urmeaz imediat dup a a a <?. Tabela 1.10: Instrutiune de procesare pentru stil <?xml-stylesheet type="text/xml" href="formatter.xsl"?>

Singura combinatie care nu se poate folosi interiorul unei instructiuni n rest pot de procesare este ?>, care semnic sfritul instructiunii. In a as folosite orice caractere, chiar i cele care mod normal ar produce probleme s n unui procesor de XML: Tabela 1.11: Alt exemplu de instructiune de procesare <?php echo "Bellu & comp: <<Viitorul suna bine>>"; ?>

1.8. SPATII DE NUME

25

1.8

Spatii de nume

Dnd posibilitatea de a crea un element sau atribut cu orice nume, exist a a o mare ans ca acelai nume s e folosit locuri diferite (din acelai docus a s a n s ment sau nu) cu semnicatii diferite. Avem a posibilitatea de a deni nite ns s spatii de nume (eng: namespaces) care s permit precizarea contextului a a n care este folosit un anumit element sau atribut. Exemplu: s presupunem c se concep documente XML pentru cataloage a a de muzic; sunt dou tipuri surse de provenient a pieselor muzicale - soliti a a a s sau grupuri, respectiv dou tipuri de creatie muzical - respectiv cntece a a a individuale i albume; pentru primul caz vom folosi elementul artist, iar s pentru creatie - titlu. Problema apare dac vrem s tratm diferentiat a a a cazurile respective, de exemplu vrem s selectm doar titlurile care apartin a a grupurilor. Tabela 1.12: Utilizare de elemente cu spatii 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 spatii de nume (grup i s solist), crora li se ataeaz un URI. Dac URI-ul este un URL, atunci a s a a nu este obligatoriu ca acesta s corespund unei locatii zice. a a Un astfel de spatiu de nume poate specicat i pentru un atribut; de s asemenea, spatiul de nume se poate deni chiar elementul pentru care se n specic spatiul de nume, dar nu mai tarziu. a a Calicarea numeDeSpatiu:element sau numeDeSpatiu:atribut se numete s nume calicat (engl: Qualied Name, QName). Declaratiile de spatiu de nume care dup xmlns urmeaz dou puncte i titlul unui spatiu de nume n a a a s

26

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML Tabela 1.13: Spatiu 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 spatiu de nume poate i implicit, dac nu se specic titlul spatiului s a a de nume. Tabela 1.14: Declaratie de spatiu de nume implicit <?xml version="1.0" encoding="UTF-8"?> <contacte> <client xmlns="http://discografie.com"> <nume>...</nume> <adresa>...</adresa> </client> <furnizor>...</furnizor> </contacte> exemplul 1.14, spatiul de nume implicit este cu adresa http://discografie.com, In denit att pentru elementul contacte ct i pentru elementele nume i a a s s adresa. Elementul furnizor a nu mai face parte din acelai spatiu de ns s nume.

1.9

Buna formare a documentelor XML

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

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 aduc corectii asupra documentelor a a XML, aa cum se ampl cazul unui browser. s nt a n Scrierea unui parser de XML devine acest caz mult mai uoar dect a n s a a unui parser de HTML; plus un asemenea procesor de XML poate folosit n pe orice document care respect regulile de bun formare. a a 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 aib un singur element rdcin a a a a a orice etichet de deschidere trebuie s aib o a a a nchidere asociat; elea mentele goale trebuie s aib o a a nchidere corect a elementele trebuie s e imbricate corect a valorile atributelor se delimiteaz prin ghilimele sau apostroafe a numele de elemente i atribute trebuie formate cu un anumit set de s caractere Remarcm c nu se cere prezenta declaratiei XML. Toate regulile enua a merate denesc un document ca ind bine format - deci, de fapt, ca ind un document XML. Este destul de uor de gsit ratiunea aceastor cerinte; de exemplu, pentru s a cea de a doua regul (care nu este obligatorie limbajul de marcare HTML) a n putem considera situatia: <p>Paragraf 1 <p>Paragraf 2 Aa cum este denit limbajul HTML, reiese c cele dou elemente paras a a momentul aurii, graf sunt de acelai nivel, i nu unul continut altul. In s s n s a un browser adaug el la sfritul ecrui paragraf eticheta de a as a nchidere </p>. Situatia este cu totul alta ntr-un document XML. Deoarece XML nu forteaz folosirea etichetelor dintr-o anumit colectie, parserul va trata neu a a tru declaratia de mai sus i va elege c al doilea paragraf este continut s nt a n primul (i asta numai dac am i s a s nchiderile de elemente corespunztoare) a o interpretare cu totul deosebit de cea de la HTML. a

28

CAPITOLUL 1. INTRODUCERE IN TEHNOLOGII XML

1.10

Arborele ataat unui document XML s

Modul de reprezentare a datelor ntr-un document XML element rdcin a a a care contine elemebnte care contin la rndul lor elemente, etc, ne duce cu a gndul la o reprezentare des alnit informatic: cea a unui arbore, a a nt a n a crui rdcin corespunde elementului rdcin, copii lui sunt elementele desa a a a a a a cendete ale rdcinii, etc. De exemplu, pentru documentul XML din listingul a a 1.15 reprezentarea arborescent este cea din gura 1.10. a 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 de valoarea pentru atributul a version declaratia de XML. XML 1.0 este construit pe baza standardului n Unicode 2.0, pe cnd XML 1.1 intentioneaz s nu mai e dependent de o a a a anume versiune de Unicode. Concret, numele de elemente sau de atribute pot s e scrise cu caractere de alt tip dect cele bazate pe alfabetul latin a a afar de asta, s-au mai introdus alte tipuri (de exemplu cambodgian). In a a de caractere pentru care nu exista suport XML 1.0; dar impactul lor este n neglijabil. Pentru moment se recomand declararea versiunii 1.0, deoarece a sunt putine procesoare de XML care pot accept version="1.1". a

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 un document bine format. Aceasta d posibilitatea autorilor de a a a-i structura dup dorint documentele. Problema apare momentul s a a n n care avem de-a face cu mai multe surse de documente XML, dar care trebuie procesate de o aceeai aplicatie. s Cum ne asigurm de faptul c o aplicatie va putea elege de ecare a a nt dat documentele pe care le primete? Dac documentul provine de la un a s a alt utilizator, cum putem s ne asigurm c s-au folosit aceleai denumiri a a a s de etichete i atribute, i c acestea respect un format comun pentru toat s s a a a colectia de documente? Altfel spus: cum specicm gramatica documentului? Exact ca i a s n limbile naturale care beneciaz de seturi de reguli gramaticale care explic a a cum se ajunge la o form corect de exprimare, la fel avem mecanisme a a 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 comun: denesc schema pentru un don cument XML; validatoarele de XML pot s proceseze documentul a mpreun a cu aceast schem i s spun dac documentul respect schema. a as a a a a Pe lng caracteristica de bun formare a unui document XML (a se a a a vedea 1.9), mai adugm i pe aceea de validitate: spunem c un document a a s a XML este valid dac este bine format i se conformeaz unei scheme ataate. a s a s Un set de documente valid fat de o schem poate trece mai departe la o a a aplicatie care s fac uz de datele continute. Lipsa unor scheme poate duce, a a n schimb, la haos i gestionare greoaie. Este echivalentul denirii unei structuri s zice ntr-o baz de date, structur care trebuie s e replicat a a a 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; dei are destui concurenti, este larg folosit. s

2.2

Document Type Denition - generaliti at

O denitie a tipului de document const a ntr-o serie de declaratii. Aces tea precizeaz elementul rdcin al unui document, elementele, atributele, a a a a precum i relatiile dintre ele. De exemplu, se poate preciza c elementele de s a tip client trebuie s contin un atribut idClient, trei elemente copil: nume, a a adresa de livrare, adresa de facturare i optional elemente de observatii. s Fiecare document XML valid trebuie s specice un document DTD fat a a de care se va face validarea. Acest document DTD se poate specica e n interiorul documentului XML, e exterior, folosinduse o referint. De n a cele mai multe ori documentele DTD se scriu cu set de caractere codicate ASCII sau UTF-8; dac se folosete o alt codicare, atunci documentul a s a DTD ncepe cu un o declaratie asemntoare cu cea de la XML: a a <?xml encoding="ISO-8859-2"?> S considerm exemplul unui document XML care contine: a a <?xml version="1.0" encoding="utf-8" ?> <helloSchema> Vreau o schema!</helloSchema> Schema o putem include ntre declaratia de XML i elementul rdcin astfel: s a a a <!DOCTYPE helloSchema [ <!ELEMENT helloSchema (#PCDATA)> ]>

2.3. DECLARATII DTD

33

(schema nu este senzitiv la modul de rupere a rndurilor, dar face distinctie a a ntre litere mici i mari). s La fel de bine am putea salva schema ntr-un ier separat (de exemplu s acelai director, cu numele mySchema.dtd); acesta va contine: n s <!ELEMENT helloSchema (#PCDATA)> Referirea la schem s-ar face atunci prin: a <!DOCTYPE helloSchema SYSTEM "mySchema.dtd"> Detaliile de sintax vor lmurite sectiunile urmtoare; tot ceea ce trea a n a buie eles acum este c am denit gramatica documentului - acesta trebuie nt a s contin elementul rdcin helloSchema, iar continutul acestui element a a a a a este un ir de caractere ce va procesat de ctre parser (PCDATA provine de la s a Parsed Character Data). Dac a ncercm s adugm un atribut la elementul a a a a rdcin, atunci se va semnala eroare de ctre un parser care face i validare, a a a a s deoarece acest atribut nu este specicat schema documentului. n

2.3

Declaratii DTD

Un document XML cu pretentii de validitate exprimat form de a n a DTD va include o declaratie de document dup declaratia de XML. Aceast a a declaratie poate s includ denitia DTD, s fac referire la un document a a a a DTD extern sau ambele. O declaratie DTD1 are forma: <!DOCTYPE numeElementRadacina SYSTEM adresa URL a subsetului DTD extern [ subset DTD intern ]> Printr-o asemenea declaratie se arat c documentul XML este o instant a a a a tipului denit de DTD. Un document XML poate s aib doar o singur a a a declaratie DOCTYPE. Specicatorul SYSTEM se declar atunci cnd documentul a a XML este inut undeva extern (pe acelai site de pe care provine documentul t s XML sau un altul, sau ntr-o locatie specicabil fat de documentul XML), a a i plus dac este folosit interiorul unei comuniti sau grup restrns. s n a n at a URL-ul poate s e absolut sau relativ, asa cum se exemplic listing-ul a a n 2.1. Dac DTD-ul este specicat extern, pseudo-atributul standalone din a declaratia documentului XML trebuie s e prezent i s aib valoarea no. a s a a
A nu se confunda declaratia DTD cu denitia DTD i declaratia de element/atribut: s un document XML va referi un DTD prin intermediul unei declaratii DTD, un document sau o sectiune DTD contine declaratii care denesc structura documentului XML.
1

34

CAPITOLUL 2. DTD Tabela 2.1: Declaratii 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 DTD-ului, aa cum s-a exema s plicat sectinea 2.2; acest caz, specicatorul SYSTEM i URL-ul pot n n s lipsi. Aa cum arat sintaxa pentru declaratia XML, este chiar permis ca s s a a avem ambele moduri de declarare: att referint extern, ct i continere a a a a s n interior. O situatie care avem ambele declaratii simultan este cea care exist n n a elemente comune care se vor trece subsetul extern, pentru documente XML n nrudite i elemente specice (ce se vor declara deci intern). De exemplu avem s rdcina contacte care a a ntr-un caz contine nume i adresa, iar alt caz nume s n n i numar telefon. Elementul comun (declaratia pentru nume) ar trecut s ierul contacte.dtd, iar structura rdcinii i elementele specice (adresa, s a a s respeciv numrul de telefon) vor declarate documentele corespunztoare, a n a asa cum este dat listing-ul 2.2. n Indiferent de varianta pentru care se opteaz, nu este permis ca un elea ment s e declarat de dou ori - altfel se declar eroare de validare. a a a Cuvntul SYSTEM din declaratia DTD poate substituit cu PUBLIC, pena tru cazul care documentul DTD referit este disponibil public, nu doar la n nivel de comunitate. Este cazul care asociatii mari pot standardiza don cumentele DTD conformitate cu un domeniu de activitate. Documentele n XML care beneciaz de DTD-uri publice pot scrise de persoane din afara a asociatiilor respective; este de asemenea de presupus c documentul DTD a nu va modicat ulterior, deoarece s-ar ajunge la invalidarea documentelor XML valide pn atunci. a a Pentru cazul unor DTD-uri publice mai trebuie precizat i numele DTDs ului: <!DOCTYPE numeleElementuluiRadacina PUBLIC

2.3. DECLARATII DTD

35

Tabela 2.2: Mixare de declaratie extern i intern as 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 acelai lucru ca cazul declarrii DTD-ului ca ind de s n a tip SYSTEM. Nume DTD reprezint numele public al documentului de denire a a tipului, pe care anumite procesoare XML pot cuta l a ntr-un depozit de denitii. Numele DTD-ului poate s contin caractere alfanumerice ASCII, a a spatii, caractere de rnd nou i caracterele: -()+,/:=?;!*#@$ %. Exist a s a cteva conventii care se respect pentru scrierea acestor nume. Prexul nua a melui se formeaz astfel: a dac DTD-ul este un standard ISO, atunci identicatorul public a ncepe cu identicatorul ISO. dac DTD-ul este aprobat de o organizatie non-ISO, atunci numele a ncepe cu caracterul + dac DTD-ul nu e aprobat de ctre nici o organizatie, atunci numele a a lui ncepe cu caracterul Aceste prexe sunt urmate de dou caractere slash (//), apoi de numele a entitii care a denit DTD-ul, dublu slash, tipul de document pe care at l descrie, apoi de un identicator de limb, conform standardului ISO-639. a De exemplu, pentru un document HTML se poate s avem declaratia a DTD astfel: <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN DTD/xhtml1-transitional.dtd> ceea ce arat c este un standard care nu e a ocial acceptat de o organizatie, a a nc este propus de ctre World Wide Web Consortium (W3C) i se refer la doa s a cumente XHTML versiunea 1.0 (deci e de ateptat ca documentul s e de s a fapt XHTML). Tot de aici deducem c elementul rdcin este html. a a a a

2.4

Comentarii DTD n

Este posibil i chiar indicat s se includ comentarii s a a ntr-un document DTD. Acestea pot specica scopul care s-a denit documentul, eventualele n drepturi de copiere, sau pot delimita sectiuni ale documentului. Includerea unui comentariu se face acelai mod ca la XML sau HTML: n s <!-- 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 ataat s unor documente valide va trebui s declarm ecare element ce se poate a a folosi; altfel spus, tot ceea ce nu este explicit declarat este interzis a se folosi. Pentru ecare element declarm care sunt atributele pe care le poate avea, a sub-elementele care compun, care este ordinea elementelor copil, de cte l a ori trebuie/pot s apr ecare din ele. a aa Cea mai natural abordare este pornirea de la elementul rdcin (oricum a a a a este specicat declaratia DTD i trebuie s apar n s a a ntrun document XML) i dezvoltarea documentului cu elemente aate tot mai adnc arbore. Se s a n ajunge la un proces iterativ, care DTD-ul este specicat pe msur ce n a a se adaug date la documentul XML. Mentionm c exist i aplicatii care a a a a s pornind de la un document XML deduc (construiesc) mod automat docun mentul DTD asociat. Forma general de specicare a unui element este: a <!ELEMENT numeElement specificatorElement> Declaratia este senzitiv la tipul caracterelor. Specicatorii de element a vor prezentatti cele ce urmeaz. Declaratia poate scris pe mai multe n a a rnduri, dar nu poate s contin comentarii. a a a

2.5.1

Specicarea de continut oarecare

Cea mai permisiv declaratie DTD este aceea care spune c un element a a poate avea orice tip de continut, e el ir de caractere, alte elemente, sau s mixri ale acestora. Acest lucru se face prin scrierea specificatorElement a 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 specicm ANY, nu se permite s se foloseasc drept continut al a a a a lui exempluElement un element care nu a fost declarat. Astfel, dac pstrm a a a

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

Dei ANY este un mod permis de declarare a unui element, ar trebui evis tat folosirea lui masiv, pentru c s-ar ajunge la aberatii semantice prin a a a includerea unor elemente ca i copii ai altor elemente cu care nu se a s a n relatie. Este a modul care se poate porni un document DTD, dup care ns n a se pot face ranri succesive. a

2.5.2

Specicarea continutului de tip text

Elementele pot contine date dou moduri: ca valori de atribute sau n a direct ntre elementul de deschidere i s nchidere. Pentru primul caz vom da modul de declarare sectiunea 3.2. Pentru al doilea caz putem avea n

2.5. DECLARARE DE ELEMENTE

39

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

Dac pentru documentul XML de mai jos s-ar folosi acelai DTD, atunci a s am avea eroare: continutul elementului exempluElement nu poate s e un a alt element, ci strict numai un ir de caractere: s <exempluElement> <exempluElement> Document invalid </exempluElement> </exempluElement> De notat c specicatorul #PCDATA nu impune nici o restrictie asupra a textului; nu avem nici un mecanism prin care s specicm c textul dat a a a trebuie s aibe un anumit format (de exemplu dou cuvinte separate prin a a virgul i spatiu, sau dat calendaristic formatul zz/ll/aaaa) sau o lunas a a n gime minim/maxim admis. a a a

2.5.3

Specicarea elementelor copil

De cele mai multe ori, un element contine alte elemente. DTD permite specicarea urmtoarelor detalii relativ la dispunerea acestor elemente: a care sunt elementele copil ale unui element care este ordinea care apar elementele copil n faptul c un element copil este optional sau trebuie s apar cel putin a a a o dat sau poat s apar de oricte opri, inclusiv niciodat a a a a a a care sunt subelementele ntre care se pot face alegeri, la un moment dat

40

CAPITOLUL 2. DTD

Pentru cazul declarrii elementelor copil, specificatorElement se suba stituie cu lista elementelor copil desprtite prin virgul. Aceast list este a a a a scris a ntre paranteze: <!ELEMENT parinte (copil1, copil2, ...)> List specic urmtoarele: a a a 1. elementul numit parinte trebuie s contin toate elementele copil; a a 2. ordinea elementelor copil este cea specicat - nu se admit permutri a a ale lor. S presupunem c dorim s declarm un element numit persoana pentru a a a a care s specicm obligatoriu numele i prenumele, sub form de elemente a a s a ce contin text: Tabela 2.7: Element cu dou elemente copil a <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> </persoana> Declaratia DTD pentru elementul persoana ar trebui s e: a <!ELEMENT persoana (nume, prenume)> unde, rete, nume i prenume se declar ca avnd continut de tip PCDATA: s s a a <!ELEMENT nume (#PCDATA)> <!ELEMENT prenume (#PCDATA)> Declaratia pentru persoana va invalida un document care contine: <persoana> <prenume>Rafael</prenume> <nume>Ionescu</nume> </persoana> Vom arta ulterior cum anume se specic o list de elemente care pot aprea a a a a orice ordine. n S considerm c pentru ecare persoana, mai vrem s permite adugarea a a a a a unor elemente numite observatie, dup elementul prenume. Vom considera a cele trei cazuri care pot aprea: a

2.5. DECLARARE DE ELEMENTE 1. avem cel mult o observatie; 2. avem cel putin o observatie; 3. avem oricte observatii, posibil niciuna. a

41

Pentru primul caz vom specica optionalitatea sub folosind caracterul ? dup numele elementului observatie: a <!ELEMENT persoana (nume, prenume, observatie?)> acest context, sunt valide att ce s-a scris exemplul 2.7, ct i ce este In a n a s listing-ul 2.8. n Tabela 2.8: Includerea elementului de observatie <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> <observatie>glumet</observatie> </persoana> Pentru al doilea caz cel putin o observatie va trebui s folosim simbolul a + dup cel al elementului observatie: a <!ELEMENT persoana (nume, prenume, observatie+)> Pentru aceast declaratie, exemplu 2.7 devine invalid, dar exemplul 2.8 este a acceptat, precum i elementul persoana din exemplul 2.9: s Tabela 2.9: Element persoana cu mai multe observatii <persoana> <nume>Ionescu</nume> <prenume>Rafael</prenume> <observatie>glumet</observatie> <observatie>optimist</observatie> </persoana> Pentru ultimul caz - cel care se permite precizarea elementului observatie n de oricte ori sau omiterea lui, avem declaratia DTD: a

42

CAPITOLUL 2. DTD

<!ELEMENT persoana (nume, prenume, observatie*)> Aceast declaratie va valida exemplele 2.7, 2.8, 2.9. a Se permite folosirea multiplicatorilor ?, +, * pentru mai multe elemente copil ale aceluiai element: s <!ELEMENT persoana(nume, prenume+, observatie*, adresa?)> Notm ca nu avem nici un mecanism prin care s limitm (ca minim sau a a a maxim) numrul de aparitii ale unui element copil. Multiplicatorii pot a folositi ca sux i pentru grupri date de paranteze. De exemplu, dac vrem s a a s modelm o colectie care ecare intrare este o pereche de elemente, vom a a n folosi declaratia: <!ELEMENT colectie (valoare1, valoare2)+ > DTD permite ca pentru un element, un copil s e o variant din mai a a multe posibile. De exemplu, putem considera c pentru a lua legtura cu o a a persoan, putem apela la adres de email sau numar de telefon; dac una a a a din aceste modaliti este specicat, ne putem declara multumiti. Alegerea at a se specic dup schema: a a <!ELEMENT numeElement (optiune1 | optiune2 | ....)> De remarcat c numai o optiune poate folosit. a a Pentru cazul nostru avem: <!ELEMENT contact (email | telefon)> S considerm urmtoare declaratie DTD: a a a <!ELEMENT persoana (nume|prenume)+ > Printre altele, aceasta ne permite ca s avem element persoana care poate a avea dou elemente copil (nume i prenume) specicate orice ordine. Dar de a s n asemenea ne permite s omitem elementul prenume, sau s repetm oricare a a a din cele dou elemente de oricte ori, ceea ce nu e corect. De fapt, declaratia a a de mai sus se traduce prin: elementul persoana trebuie s contin mcar a a a un nume sau un prenume, iar ordinea i numrul pentru mai multe astfel de s a elemente sunt indiferente. Pentru a cere specicarea celor dou elemente orice ordine vom folosi a n declaratia: <!ELEMENT persoana ( (nume, prenume) | (prenume, nume) ) >

2.5. DECLARARE DE ELEMENTE

43

Remarcm gruparea perechilor de elemente prin paranteze - nivelul de ima bricare al elementelor prin folosire de paranteze poate orict de mare, cu a conditia ca parantezele s se a nchid i deschid corect. as a Solutia dat este limitat, a, deoarece dac un element ar contine n a a ns a elemente copil, atunci declaratia DTD ar trebui specicate toate cele n! n combinatii, ceea ce e nepractic. Iat un exemplu mai complex folosind grupri i multiplicatori, preluat a a s din [1]: <!ELEMENT PRODUCER ( (GIVEN_NAME, (MIDDLE_NAME | MIDDLE_INITIAL)*, SURNAME?) | ((MIDDLE_NAME | MIDDLE_INITIAL)+, SURNAME) | SURNAME )>

2.5.4

Continut mixat

Un element poate s contin att text, ct i elemente. Declaratiile de a a a a s mai sus nu sunt suciente pentru acest lucru, dar prin combinarea unor prti a ale lor se obtine efectul dorit: <!ELEMENT numeDeElement1 (#PCDATA | numeDeElement2)*> Dat ind folosirea multiplicatorului *, structura este extrem de ne adia ngr t: elementul interior poate s lipseasc sau s apar de oricte ori, continutul a a a a a a de tip text poate s se ae orice pozitie fat de elementul copil, iar elea n a mentul declarat poate s e chiar gol. De retinut a c nu putem permuta a ns a #PCDATA i numeDeElement2 declaratia anterioar. s n a Acest tip de continut se folosete deseori cnd se introduc elemente ce s a scot evident anumite portiuni. De exemplu, putem avea: n a <paragraf> Acesta este un text cu <sublineniere>sublinieri</sublineniere> si <ingrosat>text ingrosat<ingrosat> </paragraf>

2.5.5

Elemente goale

Exist posibilitatea de a folosi elemente fr continut; e aceste elemente a aa au datele continute atribute, e au rol decorativ (de exemplu pentru n ruperea de rnduri sau introducerea unor elemente grace - a se vedea elea mentele <br /> i <hr /> din (X)HTML). s Pentru a declara un element care nu are continut se folosete: s

44 <!ELEMENT numeElement EMPTY>

CAPITOLUL 2. DTD

2.5.6

Exemplu

Se consider documentul XML de mai jos: a <?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 sectiunile anterioare. Vom pune deci preambulul documentului anterior: n <!DOCTYPE contacte SYSTEM "contacte.dtd"> iar ierul contacte.dtd, aat acelai director cu documentul XML va s n s contine: <?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 Declaratii de entiti at

Aa cum s-a spus partea de prezentare a continutului unui document s n XML, avem posibilitatea de a declara nite componente (sau entiti) care s at s e ulterior referite. Avem astfel de entiti deja denite pentru anumite a at simboluri: <, &, etc. Putem a s ns a mbogim documentul XML cu entiti, at at care pot face referint la un buci de text, iere externe format XML a at s n sau nu (text simplu sau chiar format binar). Orice document XML contine mcar o entitate - aa numita entitate a s document, format din declaratia de XML, declaratia de tip de document, a elementul rdcin. Aceast entitate nu are nume, spre deosebire de alt a a a a a entitate care poate creat suplimentar. a Entitile se declar DTD. Pot interne - declarate complet DTD at a n n i externe - referite DTD, dar cu continut aat la un URL. De asemenea, s n mai avem un criteriu - formatul entitii: astfel avem entiti procesabile1 at at 2 care sunt compatibile cu XML i neprocesabile - a cror includere ar strica s a buna formare a documentului XML.

3.1.1

Entiti interne at

Entitile interne sunt alias-uri care se denesc pentru portiuni de text. at Putem avea astfel entiti de tip caracter sau de tip text. at Pentru entitile de tip caracter, este vorba utilizarea unui substitut penat tru codurile ISO ale unor caractere ce nu se a setul standard ASCII. De a n
1 2

Engl: parsed entities Engl: unparsed entities

47

48

CAPITOLUL 3. DTD - CONTINUARE

` exemplu, dac vrem s obtinem caracterul E, putem proceda astfel: e foloa a sim referinta &#2003 , e declarm o entitate caracter cu un nume sugestiv: a <!ENTITY Egrave "&#200;"> text referirea la acest caracter s-ar face cu: &Egrave; iar parserul va In l ` nlocui cu caracterul E. Un exemplu de entitate text este dat mai jos: <!ENTITY semnatura "Lucian Sasu"> Peste tot unde apare: &semnatura; documentul XML, parserul va intern veni i va s nlocui cu secventa de text dintre ghilimele. O asemenea entitate intern poate s contin chiar i elemente XML, a a a s scrise pe mai multe rnduri; resc, trebuie ca prin includerea elementului s a a nu se afecteze validitatea documentului XML. De exemplu, dup procesarea a 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

Entiti externe at

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

Codul a fost luat de pe Internet, cutnd dupa ISO entity set a a

3.1. DECLARATII DE ENTITATI <!ENTITY numeEntitate SYSTEM URI>

49

Cuvntul SYSTEM poate a nlocuit cu PUBLIC. URI denete locatia resursei, s iar aceasta se presupune a o colectie de elemente prin a crei includere nu a se va afecta validitatea documentului XML. S presupunem de exemplu c a a avem un ier numit contact.txt continnd: s a <nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> Notm c acesta nu este un document XML (nu are element rdcin). Dea a a a a clararea unei entiti care s indice spre aceast resurs, precum i utilizarea at a a a s 4 ei se poate face prin : <?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 arcat Internet Explorer5 este (fragment): nc n <mesaj> Salutari si numai bine <nume>Lucian Sasu</nume> <adresa>Universitatea Transilvania Brasov</adresa> </mesaj> O entitate extern procesabil poate s e chiar un document XML, dar nu a a a are voie s posede o denitie de tip de document; validarea ei se va face la a includere documentul care refer, pe baza DTD-ului referentului. n l a sfrit, putem declara o entitate extern care nu este compatibil cu In a s a a continutul unui document XML. Exemplul clasic este cel al declarrii unei a resurse de tip imagine care va ulterior referit: a <!ENTITY logo SYSTEM ./images/logo.gif NDATA gif>
Trebuie spus c documentul XML obtinut nu este valid dac nu se face declararea a a celor dou elemente aate ierul contact.txt. a n s 5 Parserul folosit de ctre Mozilla Firefox versiunea 2 nu face arcarea entitilor a nc at externe.
4

50

CAPITOLUL 3. DTD - CONTINUARE

Evident, arcarea unui ier binar de tip gif ar distruge orice pretentie de nc s bun formare a doucmentului XML, motiv pentru care orice parser va lsa a a aplicatia de care a fost apelat s proceseze corespunztor resursa. Specica a a torul NDATA arat c resursa declarat nu este compatibil XML, iar gif din a a a a nalul declaratiei va precizat ulterior ntr-o declaratie de tip NOTATION (a se vedea sectiunea 3.2.3).

3.2
3.2.1

Declarare de atribute
Generaliti at

Elementele pot contine date sub forma valorilor de atribute. Pentru e care element ce suport atribute se poate specica DTD lista numelor a n atributelor i pentru ecare atribut, tipul valorii i eventuala valoare implis s cit. Declaratia DTD pentru un atribut este: a <!ATTLIST numeElement numeAtribut tipAtribut optiune> unde numeElement determin elementul pentru care se denete atributul, a s numeAtribut este numele atributului ce se denete, tipAtribut reprezint s a tipul de date al atributului, iar optiune specic ce se ampl dac vrem s a nt a a a omitem atributul din element.Vom considera exemplele imediat urmtoare n a c optiunea este atribuirea unei valori implicite, deci optiune se a nlocuiete s cu valoarea implicit, delimitat de ghilimele sau apostroafe. a a Pentru cazul care un element are mai multe atribute, atunci e se n va scrie cte o declaratie DTD pentru ecare atribut, e se combin a a ntr-o singur declaratie ATTLIST. Exemplu: dac considerm documentul XML: a a a <contacte> <persoana nume="Ionescu" prenume="Rafael"/> </contacte> atunci o variant de document DTD asociat este: a <!DOCTYPE contacte[ <!ELEMENT contacte <!ELEMENT persoana <!ATTLIST persoana <!ATTLIST persoana ]> (persoana+ )> EMPTY> nume CDATA "nume nespecificat"> prenume CDATA "prenume nespecificat">

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

3.2. DECLARARE DE ATRIBUTE

51

posibilitilor este dat sectiunea 3.2.3. Aa cum am mentionat, cele dou at a n s a declaratii ATTLIST se pot scrie astfel: <!ATTLIST persoana nume CDATA "nume nespecificat" prenume CDATA "prenume nespecificat"> Spre deosebire de declaratiile pentru sub-elemente, atributele nu sunt obli gatoriu s apar ordinea specicat. a a n a Aceste atribute cu valori implicite sunt des folosite XHTML. De exemn plu, pentru un tabel se poate prevedea faptul c marginea are grosimea 0, a iar distanta ntre celule este nul. a

3.2.2

Atribute fr valori implicite a a

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

52 Specicatorul #IMPLIED

CAPITOLUL 3. DTD - CONTINUARE

Exist cazuri care am vrea ca un anumit atribut s e prezent; dar a n a dac nu este precizat, atunci nu avem cum s furnizm o valoare implicit a a a a care s e bun pentru toate cazurile. Pentru aceasta se folosete cuvntul a a s a #IMPLIED. S presupunem de exemplu c pentru o persoan vrem s permitem spea a a a cicarea 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 alte situatii se cere ca un atribut, dac este prezent, s nu poat avea In a a a o alt valoare dect una aprioric specicat. Sintaxa general este: a a a a <!ATTLIST numeElement numeAtribut tipAtribut #FIXED valoareFixa> De exemplu, s presupunem c pentru ecare judet avem un document a a XML cu contacte; pentru elementul rdcin vom avea un atribut numit a a a judet care s e xat, functie de provenienta documentului. Pentru Braov a n s 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 de tipuri de date mult mai boa gat dect cazul elementelor. Sunt 10 tipuri de date care se pot specica a a n pentru un atribut: CDATA, NMTOKEN, NMTOKENS, ID, IDREF, IDREFS, enumerare, ENTITY, ENTITIES, NOTATION. Tipul CDATA De departe cel mai popular (i permisiv) tip de atribut, tipul CDATA (chas racter data) este precizat pentru cazul in care valorile pot orice caractere, mai putin semnele de mai mic, ampersand i simbolurile folosite pentru deli s mitarea valorii acelui atribut. Aceste caractere se vor scrie folosind entitile at la referint predenite (a se vedea sectiunea 1.7.5). a Tipul NMTOKEN Tipul NMTOKEN (name token) restrictioneaz valoarea unui atribut: aceasta a trebuie s respecte urmtoarele: contine doar cifre, litere, caracterul minus, a a caracterul de subliniere, punct, dou puncte. Principala restrictie resimtit a a este c nu pot contine spatiu. a Exemplu: pentru declaratia <!ATTLIST element atribut NMTOKEN #IMPLIED> urmtorul element este valid: a <element atribut=valoare_simpla/> pe cnd: a <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 spatii s-a introdus tipul NMTOKENS. Astfel, exemplul anterior este valid dac tipul pentru atribut este NMTOKENS. a

54 Tipul ID

CAPITOLUL 3. DTD - CONTINUARE

Un atribut declarat de tip ID va trebui s aibe o valoare unic acel a a n document. Valoarea pentru un asemenea atribut trebuie s a nceap cu liter a a sau caracter de subliniere i poate contine litere, caractere de subliniere i s s cifre. De cele mai multe ori pentru un astfel de atribut se specic #REQUIRED, a niciodat #FIXED. a Tipul IDREF Valoarea unui atribut declarat de tip IDREF este un ID care se regete as s acelai document. Este des folosit pentru a simboliza legtura de la copii n s a a la printi. Exemplicm aceasta prin modelarea listei de personal dintr-o a a fabric, care orice angajat (cu exceptia unora, e) este subordonat unui a n s unic angajat. Vom conveni ca pentru cei care nu sunt subordonati nimnui a s modelm ca ind proprii lor e. a i a s <?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 relatie de tip multi la unu. Mai adugm c situatia a a a celor care nu sunt subordonati nimnui poate reprezentat i altfel: se cere a as ca atributul idRef de tip IDREF s e nu #REQUIRED, ci #IMPLIED; acest a n caz ei cei mari nu vor avea atributul idSef. s Tipul IDREFS Pentru cazul care valoarea unui atribut poate s contin mai multe n a a valori de tip ID separate prin spatii. Pentru exemplul precedent, putem vedea relatia invers: un angajat are un atribut cu valorile continnd identicatorii a

3.2. DECLARARE DE ATRIBUTE

55

celor pe care are ca subordonati directi. Atunci documentul de mai sus i 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 relatie de tip unu-la-multi. De asemenea acest tip ne permite s modelm relatii de tip multi la a a multi. Exemplicm mai jos pentru cazul relatiei dintre entitile crti i a at a s autori: o carte poate scris de mai multi autori, un autor poate s scrie a a mai multe crti. a <?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 situatii care vrem ca valorile unui atribut s e alese dintr-o list a n a a prestabilit. DTD d posibilitatea enumerrii valorilor eligibile, din care se a a a poate specica doar una. Formatul general este: <!ATTLIST numeElement numeAtribut (valoare1 | valoare2 | ...) specificator> Exemplu: <sectiune vizibilitate=vizibil>....</sectiune> pentru care declaratia DTD ar : <!ATTLIST sectiune vizibilitate (vizibil | ascuns) vizibil> Tipul ENTITY Pentru atribute putem da valori specicate ca entiti. S reconsiderm at a a declaratia de entitate extern: a <!ENTITY logo SYSTEM ./images/logo.gif NDATA gif> acest context putem cere unui atribut s aib drept valoare o entitate In a a declarat: a <!ATTLIST image source ENTITY #REQUIRED> i atunci e valid a se specica: s <image source=logo/> Parserul va nlocui logo cu calea denit anterior pentru entitate. Este a responsabilitatea aplicatiei care preia rezultatul parsrii s manipuleze a a n mod adecvat ierul images/logo.gif. Modul de manipularea tipului de s entitate (gif, precizat nalul declaratiei de entitate) trebuie s e precizat n a ntr-o declaratie 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 continut mai multe valori ENTITY separate prin spatii. 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 i pentru tipul ENTITY, trebuie precizat prin declaratie de tip NOTATION s formatul datelor de tip gif. Tipul NOTATION Pentru cazul care documentul XML refer entiti externe incompatin a at bile cu canoanele formatului XML, ar de dorit s se precizeze aplicatiei care a apeleaz parserul cum anume vor procesate entitile. Aceasta se poate a at face de exemplu prin precizarea tipului resursei (majoritatea browserelor tiu s s manipuleze continut de tip jpg, gif, pdf) sau prin precizarea aplicatiei care a se va folosi pentru procesarea lor. Forma general este: a <!NOTATION numeTip SYSTEM idExtern> unde numeTip apare nalul unei declaratii de tip ENTITY pentru entiti n at externe neprocesabile, iar idExtern d o indicatie despre modul de procesare a al entitii. Exemplu: at <!NOTATION gif SYSTEM image/gif> unde image/gif reprezint descriere MIME standard. a Se poate folosi identicatorul PUBLIC loc de SYSTEM (discutia ind n asemntoare cu cea de la referirea la un DTD extern); astfel, putem avea: a a

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 portiunilor unui document XML sau pentru efectuarea de calcule pe baza continutului XML. Ca functionalitate este asemntor cu instructiunea a a SELECT din limbajul SQL. Dup cum se va vedea, limbajul nu este de tip a XML i se bazeaz pe structura de arbore a documentului (a se vedea arbos a rele din gura 4.1 asociat documentului XML din listing-ul 4.1). Acest arbore este format din noduri, care includ: comentarii, instuctiuni de procesare, sectiuni CDATA, elemente, atribute, chiar i declaratia de XML. s Avem un nod rdcin a a a naintea oricrui continut al documentului; plecnd a a de la acest nod se poate regsi orice nod sau grup de noduri, pe baza caraca terizrii lor. Selectarea nodurilor se face pe baza unor expresii de localizare. a Mai general, se pot deni expresii care s e evaluate de XPath. a XPath are dou utilizri majore: regsirea nodurilor (ulterior acestea vor a a a procesate afara XML-ului, de ctre cod scris n a ntr-un limbaj de programare oarecare) i ca auxiliar pentru XSLT unde precizeaz abloanele i s as s permite adresarea diferitelor prti dintr-un nod. a Exist dou versiuni de XPath: 1.0 publicat ca recomandare W3C a a n noiembrie 1999 i versiunea 2.0 dat tot ca recomandare 23 ianuarie 2007. s n Un exemplu simplu de expresie XPath pentru listingul anterior este: /curs/capitol/nume care va returna o colectie format din dou noduri: a a <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 dintr-o serii de expresii care sunt evaluate; dup evaluare a a trebuie s se returneze un rezultat de un anumit tip, specic XPath. Exist a a 4 tipuri de date denite pentru versiunea 1.0 de XPath: numeric ir de caractere s logic set de noduri

4.2.1

Tipul numeric

Exemplu: expresia /studenti/student[2] care se refer la al doilea elea ment student aat sub rdcin folosete expresia XPath 2 pentru precizaa a a s rea numrului de ordine. Aceast expresie se evalueaz la valoarea continut. a a a a Un tip numeric reprezint numere virgul mobil, conform standara n a a dului IEEE 754; ca atare poate reprezenta numere ntregi i rationale, NaN s (Not-a-Number), , 0. Nu se poate folosi notatia tiintic, deci 2.0E +3 s a nu este recunoscut ca 2000. Numerele pot folosite ca argument pentru functii matematice predenite XPath sau combinatii cu operatori ma n n tematici.

4.2.2

Tipul ir de caractere s

Este un alt tip de dat, prin care se reprezint orice ir de zero sau mai a a s multe caractere Unicode. Un astfel de ir de caractere se delimiteaz prin s a apostroafe sau ghilimele. Exemplu: pentru a determina toti studentii care sunt din Brasov vom folosi: /studenti/student[adresa="Brasov"] Aici am folosit tipul ir de caractere pentru a specica literalul Brasov. s Pentru cazul care se folosesc interiorul irului de caractere delimitaton n s rii de ir, se pot substitui cu referintele la entiti predenite introduse s at n sectiunea 1.7.5.

4.3. NODURI - CARACTERISTICI

63

4.2.3

Tipul logic

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

4.2.4

Tipul set de noduri

Seturile de noduri reprezint punctul de interes major XPath. O exprea n sie XPath poate evaluat la o multine ce contine 0, 1 sau mai multe noduri; a procesarea acestei colectii poate fcut apoi dintr-un alt limbaj. Putem a a folosi expresii care se evalueaz la setul tuturor nodurilor de un anumit tip, a sau un set de noduri poate s rezulte urma unei operattii de ltrare. De a n exemplu expresia //hobby va produce o list de dou hobby-uri declarate. a a

4.3

Noduri - caracteristici

Fiecare nod din document are proprietile: nume, ordine document, at n relatia de familie cu alte noduri i valoarea de string. s

4.3.1

Numele nodului

Cele mai multe noduri (dar nu toate) au nume. Exist trei feluri de nume: a numele calicat: este de fapt QName, sau Qualied Name aa cum s e denit sectiunea 1.8 - numele elementului eventual prexat de n numele de spatiu; de exemplu contracte:persoana, unde contracte reprezint un spatiu de nume. a numele local este numele calicat fr prexul dat de spatiul de nume; aa pentru exemplul anterior este persoana. numele expandat - dac nodul este asociat cu un spatiu de nume, atunci a numele expandat este o pereche, constnd din URI-ul ataat spatiului a s de nume i numele local al nodului. s

4.3.2

Ordinea documentului

Nodurile din document au o pozitie relativ fat de altele. De exemplu a a elementu rdcin este a a a naintea elementelor copil. ce priveste atributele, In se specic faptul c ele sunt a a naintea elementelor copil continute. Datorit a a faptului c atributele pot permutate (chiar prezenta unui DTD), nu ns a n

64

CAPITOLUL 4. XPATH

exist nici o ordine presatbilit a acestora, ordinea de raportare depinznd a a a de implementarea aplicatiei XPath.

4.3.3

Relatia de familie cu alte noduri

Pe lng ordinea dat de document avem relatii complexe a a a ntre noduri: unele noduri sunt copii ai altor noduri, altii sunt vzuti ca frati, sau ca a strmoi - toate derivnd din structurarea documentului. a s a

4.3.4

Valoarea de string a unui nod

Orice nod are i un text asociat; de exemplu, textul unui nod de tip s comentariu este ceea ce urmeaz dup <!-- pn la a a a a nchiderea asociat. a Valoarea acestora va precizat la prezentarea ecrui tip de nod parte. a a n

4.4

Tipuri de noduri

XPath vede ntregul document XML ca o colectie de noduri, organizate sub forma unui arbore. Exist 7 tipuri de noduri pe care le recunoate XPath a s 1.0: 1. nod rdcin a a a 2. nod element 3. nod atribut 4. nod instructiune de procesare 5. nod comentariu 6. nod text 7. nod spatiu de nume

4.4.1

Nodul rdcin a a a

Nodul rdcin reprezint primul nod din arborele XPath. El se refer a a a a a prin expresia XPath / i contine de fapt tot documentul XML. Nu trebuie s fcut confuzie a a ntre nodul rdcin i elementul rdcin. Orice cale XPath a a as a a a care ncepe cu caracterul / semnic pornirea de la acest nod rdcin. a a a a In XPath 2.0 numele de nod rdcin s-a a a a nlocuit cu cel de nod document.

4.4. TIPURI DE NODURI

65

Numele local al nodului rdcin este irul vid i nu are un nume expana a a s s dat. 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 sfrit a s mpreun cu a tot ce se a a ntre acestea. Referirea unui asemenea nod se face att pornind a de la nodul rdcin, c i de la alte noduri. Un exemplu de expresie XPath a a a as care aduce un nod plecnd de la nodul rdcin este /studenti. a a a a Numele local al unui nod element este eticheta nodului. Numele calicat este eticheta prexat cu identicatorul spatiului de nume iar numele expana dat este URI-ul asociat spatiului de nume plus eticheta. Valoarea de string este concatenarea valorilor pentru toate nodurile text continute (direct sau ca descendenti indirecti).

4.4.3

Nodul atribut

Un nod element care are atribute este vzut ca nod printe al ecrui atria a a but ( viziunea XPath; este diferit de viziunea DOM, unde aceast relatie n a a nu exist). Se pot referi aceste noduri atribut, iar valoarea lor poate folosit a a e interiorul XPath, e n ntr-un limbaj de programare. Nu exist noduri a atribut corespunztoare declaratiilor de spatii de nume. Pentru a obtine vaa loarea atributului nume din primul elementr student al documentului XML anterior se poate folosi /studenti/student[1]/@nume. Prexul de spatiu de nume al atributului este cel declarat atribut, n nu se preia cel de la elementul contintor. De exemplu pentru xml:id este a xml. Valoarea string este valoarea normalizat a atributului (normalizare a nseamn eliminarea spatiilor de la a nceputul i sfritul irului i substituirea s as s s mai multor spatii consecutive cu unul singur - dac nu cumva stringul este a considerat CDATA).

4.4.4

Nodul instructiune de procesare

De asemenea se pot referi i nodurile instructiune de procesare (noduri s PI). Deoarece aceste instructiuni de procesare nu sunt destinate parseru lui de XML, ele sunt vzute ca un simplu ir de caractere care a s ncepe de dup <? i se termin cu ?>. Nu exist modaliti directe de accesare a a s a a at pseudo-atributelor type i href din instructiunea de procesare exemplis

66

CAPITOLUL 4. XPATH

cat1 . Pentru determinarea listei tuturor elementelor de procesare se folosete a s //processing-instruction(). Numele local al unui nod PI este inta declarat (ceea ce urmeaz dup <? t a a a pn la primul spatiu). Deoarece o instructiune de procesare nu are spatiu de a a nume, numele expandat i calicat contin ca parte de spatiu de nume null. s Valoarea de string este tot ce se a a ntre inta declarat i partea de t as nchidere cazul de mai sus este type="text/css" href="mystyle.css". ?>. In

4.4.5

Nodul comentariu

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

4.4.6

Nod text

XPath aloc noduri continutului de tip text al elementelor. De exemplu, a pentru primul element adresa din listing-ul 4.1 avem un nod text: Brasov. Dac elementul contine sub-elemente, instructiuni de procesare sau comena tarii atunci pot rezulta mai multe elemente text pentru un singur element. De exemplu, dac avem: a <p>text 1<br/>text 2</p> atunci vor rezulta dou noduri text continnd text1 i text2. Multimea a a s nodurilor text din document se obtine cu: //text(). Un nod text nu are nume local, QName sau nume expandat. Valoarea lui string este irul de caractere continut. s

4.4.7

Nod spatiu de nume

Nodurile spatii de nume nu sunt direct vizibile precum nodurile ante rioare. Fiecare element are un set de spatii de nume, cte unul pentru ecare a prex de spatiu de nume care este accesibil elementului. Chiar i pentru ele s mentele pentru care nu se folosete un spatiu de nume avem implicit declarat s xml, conform XML Namespaces Recommendation. Un element are cte un a nod spatiu de nume pentru: 1. ecare atribut care declar un spatiu de nume a
Dar se pot folosi functii care lucreaz pe iruri de caractere pentru a face parsarea a s irului s
1

4.4. TIPURI DE NODURI

67

2. ecare atribut al unui element contintor al crui nume a a ncepe cu xmlns: 3. ecare atribut numit xmlns denit pentru element sau un element printe a 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 i orice element care are prexul xsl va avea un nod spatiu de nume cu vas loarea http://www.w3.org/1999/XSL/Transform. Avem i spatiul de nume s implicit cu URI-ul http://www.w3.org/1999/xhtml care se folosete pentru s sfrit, mai avem un spatiu de nume, orice element care nu are prex. In a s anume cel implicit din XML care afecteaz toate elementele; acesta are URIa ul http://www.w3.org/XML/1998/namespace. Numele local al unui nod spatiu de nume este prexul su (posibil vid). a URI-ul spatiului de nume pentru un nod spatiu de nume este ntotdeauna vid.

68

CAPITOLUL 4. XPATH

4.5
4.5.1

Expresii de localizare
Exemplicare

Expresiile de localizare reprezint partea de interes maxim din XPath. Pe a baza lor se pot selecta diferite continuturi din document (noduri, elemente, comentarii, etc). De exemplu, pentru a determina adresa primului student din documentul XML dat listing-ul 4.1 se poate folosi expresia XPath: n /studenti/student[1]/adresa/text() sau echivalent /child::studenti/child::student[position()=1]/child:: adresa/child::text() Interpretarea primei ci de mai sus este urmtoarea: a a se pornete de la nodul rdcin XML; acesta nu are nume, se res a a a fer prin / i are drept descendenti toate nodurile din document: a s declaratia de XML, instrunctiunea de procesare, etc, aa cum se vede s gura 4.1; n se coboar elementul studenti aat sub rdcin; a n a a a din acest element se coboar la nivelul urmtor, de unde se alege primul a a copil de tip element, numit student; din acest element se caut elementul copil numit adresa; a din nodul de adresa se preia continutul de tip text. Alte exemple: Expresie XPath /studenti /studenti/student //limba straina //@nivel

Rezultat selecteaz elementul rdcin a a a a selecteaz cele dou elemente student a a 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 din pai (mai sus: studenti, stua s dent[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 rdcin, iar acest caz a a a n calea ncepe cu / sau // i spunem c avem de-a face cu o cale absolut. s a a Dac nu se a ncepe cu aceste caractere atunci avem de-a face cu o cale relativ, a care pleac de la nodul curent - numit nod context. Dup cum se observ, a a a am folosit ca separator de pai caracterul /, care leag un printe de nodul s a a continut; se mai poate folosi // care se refer att la descendeti directi, a a ct i la cei indirecti. a s

4.5.3

Axe XPath

Exist 13 axe XPath 1.0: a n 1. axa ancestor este referint la toti ascendentii unui nod. Aceti ascendeti a s pornesc de la printe i includ i nodul rdcin; aduce tipurile de noa s s a a a duri: rdcin, elemente; a a a 2. axa ancestor-or-self este referint la colectia format din nodul cona a text i toti ascendetii si; aduce tipurile de noduri: rdcin, elemente. s a a a a 3. axa attribute refer lista atributelor unui element; aduce doar noduri a de tip atribut; 4. axa child reprezint lista tuturor elementelor copil; este axa implicit; a a va aduce noduri de tip: elemente, comentarii, PI-uri, text 5. axa descendant d acces la lista tuturor descendetilor (directi sau a indirecti); aduce tipuri de nod: elemente, comentarii, PI-uri, noduri text 6. axa descendant-or-self reprezinta lista format din nodul curent a precum i descendetii de orice nivel ai nodului curent; aduce tipurile de s noduri: orice afar de atribute i spatii de nume. n a s 7. axa following reprezint toate nodurile din document care apar dup a a nodul context; aduce tipurile de nod: orice afar de rdcin, atrin a a a a bute sau spatii de nume

70

CAPITOLUL 4. XPATH 8. axa following-sibling d acces la lista urmtoarelor noduri frate, a a adic noduri aate la acelai i cu acelai printe nivel cu contextul a s s s a curent, care urmeaz ordinea de document; tipurile de nod aduse i a n sunt: orice afar de rdcin, atribute sau spatii de nume; n a a a a 9. axa namespace d nodurile spatii de nume pentru nodul context; aduce a doar noduri de tip spatiu de nume;

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

Tabela 4.2: Prescurtri pentru axe a Referirea se poate face relativ la: nodul rdcin, dac expresia XPath a a a a ncepe cu / nodul curent, dac se a ncepe cu altceva dect / a Atunci cnd / (un caracter) se folosete ca separator de pai este folosit a s s a legtura printe-u; astfel, studenti/student se refer la descendentul dia a a rect student al nodului studenti. Dac se folosete // ca separator, (stua s denti//student) atunci se refer la orice descendent student al lui studenti, a indiferent c este descendent direct sau tranzitiv. a

4.5. EXPRESII DE LOCALIZARE

71

4.5.4

Teste pentru noduri

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

4.5.5

Predicate XPath

Un predicat permite ltrarea nodurilor care se returneaz de ctre o exa a presie de localizare. Un predicat se include ntre paranteze drepte c si reprezint o expresie logic a crui evaluare decide dac se va returna nodul dat a a a a de expresie sau nu. De exemplu, dac dorim s returnm toate elementele student pentru a a a care elementul adresa are continutul 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 strine cunoscute de ctre toti cei care se nua a mesc Popescu se folosete: s /studenti/student[@nume="Popescu"]/limba_straina Pe lng posibilitatea de a compara continutul unor elemente sau atribute a a cu iruri de caractere sau continutul altor noduri, este posibil s folosim s a functii XPath; de exermplu, pentru selectarea primei limbi strine pentru cel a de-al doilea student se poate folosi:

72

CAPITOLUL 4. XPATH

/studenti/student[position()=2]/limba_straina[position()=1] formul care se poate scrie ca a /studenti/student[2]/limba_straina[1] O list a functiilor disponibile XPath 1.0 va dat a n a ntr-o sectine viitoare. Pentru cazul care se dorete precizarea mai multor predicate, acest n s lucru se poate face prin scrierea lor unul dup cellalt. De exemplu, dac a a a ne intereseaz toti studentii care tiu limba german la nivel bine putem a s a scrie: /studenti/student[limba_straina/text()=germana][limba_straina/ @nivel=bine] Acelai efect se obtine prin unirea predicatelor folosind operatorul and: s /studenti/student[limba_straina/text()=germana and limba_straina/ @nivel=bine] Se pot combina cile de localizare folosind caracterul | (pipe). Rezultatul a este reuniunea nodurilor care satisfac oricare din ci. Se pot conecta oricte a a ci, iar evaluarea uneia nu afecteaz niciun fel evaluarea celorlalte. a a n Este de asemenea permis imbricarea predicatelor. De exemplu, putem a selecta toate elementele student care au element hobby pentru care exist un a frate precedent numit adresa: /studenti/student[hobby[preceding-sibling::adresa]]

Capitolul 5 XPath (continuare)


5.1 Functii i operatori XPath s

Reamintim c exist 4 tipuri de date XPath 1.0: a a n numeric ir de caractere s logic set de noduri Pentru ecare exist un set de operatori i functii dedicate. Vom considera a s cele ce urmeaz urmtorul document XML: n a a <?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 i functii pentru tipul boolean s

Operatorii logici booleeni sunt:

avnd semnicatiile cunoscute. De exemplu, dac dorim s selectm studentii a a a a care au luat cel putin nota 9 la examen, vom folosi: /studenti/student[examen/@nota>=9] Functiile booleene sunt: boolean() care convertete argumentul la o valoare boolean; astfel s a avem cazurile: 1. dac parametrul este de tip boolean atunci se returneaz exact a a valoarea lui 2. dac parametrul este de tip numeric, atunci dac numrul este 0 a a a atunci se returneaz false, altfel pentru numr nenul true a a 3. dac parametrul este de tip ir de caractere, atunci dac este irul a s a s vid se returneaz false, altfel true a 4. dac parametrul este de tip set de noduri atunci se returneaz a a false dac setul este vid, true altfel. a true(), false() sunt functii care nu primesc parametru i returneaz s a valorile de adevr omonime. Sunt folosite de exemplu XSLT, unde a n valorile returnate pot date unor variabile lang() returneaz true dac valoarea atributului xml:lang pentru a a elementul curent este setat la parametrul trimis functiei. a not() este folosit pentru a produce negarea parametrului de tip boolean transmis functiei.

5.1. FUNCTII SI OPERATORI XPATH

75

5.1.2

Operatori i functii pentru tipul numeric s

Exist urmtorii operatori care se pot folosi pentru tipul numeric: a a + pentru adunare - pentru scdere a * pentru nmultire div pentru artire mp mod pentru restul artirii mp ntregi Functiile care lucreaz cu numere sunt: a floor() - d partea a ntreag inferioar a unui numr; de exemplu a a a floor(3.14)=3, floor(-3.14)=-4; ceiling() - d partea a ntreag superioar a unui numr; de exema a a plu, ceiling(3.14) este 4, ceiling(-3.14)=-3; pentru a obtine lista studentilor care au luat note cu valori ntregi la examen se poate folosi: /studenti/student[floor(examen/@nota)=ceiling(examen/@nota)] round() rotunjete nota la cel mai apropiat s ntreg; e.g. round(3.1) produce 3, round(3.5)=4, round(-3.1)=-3 sum() determin suma numerelor care sunt date ca argument; de exema plu, suma notelor obtinute la examene este: sum(/studenti/student/examen/@nota) number() produce o valoare numeric pentru argumentul care i se d; a a number(3.14) va produce numrul 3.14. a

5.1.3

Functii pentru tipul ir de caractere s

XPath 1.0 nu are operatori care s functioneze cu iruri de caractere, dar a s posed functii: a concat(string string1, string string2, ...) este folosit pena tru concatenarea irurilor de caractere transmise ca parametri. De s exemplu pentru concatenarea numelui i prenumelui celui de al doilea s student, cu spatiu desprtitor vom folosi: a

76

CAPITOLUL 5. XPATH (CONTINUARE) concat(/studenti/student[2]/nume, " ", /studenti/student[2]/prenume) contains(string string1, string string2) - returneaz true dac a a string1 contine string2; de exemplu, pentru a gsi studentii al cror a a nume contine particula escu putem folosi: /studenti/student[contains(nume, "escu")] normalize-space(string string1) - aplicat unui string va duce la: a eliminarea spatiilor de nceput i de sfrit, colapsarea mai multor s as spatii adiacente la unul singur. De exemplu, dac dorim s gsim toti a a a studentii numiti Popescu, dar elementul nume poate s contin i a a s spatii nainte sau dup nume, atunci expresia XPath: a /studenti/student[nume="Popescu"] nu va aduce primul student, deoarece continutul elementului nume este de fapt Popescu. Pentru a se obtine rezultatul dorit se folosete: s /studenti/student[normalize-space(nume)="Popescu"] starts-with(string string1, string string2) - functia returneaz a true dac primul string a ncepe cu al doilea string(string string1) convertete argumentul dat la ir de caracs s tere string-length(string string1) - se returneaz numrul de caraca a tere din parametru substring(string string1, number offset, number length) - se returneaz un subir al primului argument, care a s ncepe de la pozitia dat de al doilea argument i are length caractere a s substring-after(string string1, string string2) - se returneaz a un sux al primului argument, care se a dup prima aparitie a celui a a de al doilea parametru primul; eventual se returneaz stringul vid n a substring-before(string string1, string string2) se returneaz a un prex al primului argument aat naintea primei aparitii a celui de al doilea argument primul. n

5.1. FUNCTII SI OPERATORI XPATH

77

translate(string string1, string string2, string string3) este folosit pentru a obtine un ir de caractere plecnd de la primul a s a argument, substituind caracterele din al doilea argument cu cele care se a al treilea argument. Mai exact, primul caracter din al doilea a n 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 comparatie case-insensitive se poate folosi: translate(@materie, ABCDEFGHIJKLMNOPQRSTUVWXYZ, abcdefghijklmnopqrstuvwxyz)=programare orientata pe obiecte

5.1.4

Operatori i functii pentru tipul set de noduri s

Operatorii folositi pentru lucrul cu seturi de noduri sunt: |, reprezentnd reuniunea cilor date de expresiile precizate; de exema a plu, XSLT se poate folosi: n <xsl:template match="name | day"> ... </xsl:template> iar zona de aplicare a ablonului este orice sub-element care se numete s s name sau day al elementului curent. / este folosit pentru a delimita paii de localizare sau poate preciza s locul de unde ncepe cutarea (rdcin), iar // specic modul de a a a a a cutare (la orice nivel, a ncepnd din nodul context). a Functiile care lucreaz cu seturile de noduri sunt: a count(node-set) returneaz numrul de noduri din setul de noduri; a a de exemplu, pentru a determina numrul de elemente de tip student se a folosete: s count(/studenti/student) Pentru a determina media general pentru grupul de studeti se foa losete: s

78

CAPITOLUL 5. XPATH (CONTINUARE) sum(/studenti/student/examen/@nota) div count(/studenti/ student/examen) id(string ID) returneaz lista de elemente care au atributul id cu a valoarea specicat. De obicei se folosete pentru documentele XML a s la care se specic prin DTD c exist atribut de tip ID: a a a <!ATTLIST student id ID #REQUIRED> Se recomand prudent folosirea acestei functii deoarece anumite a a n procesoare de XPath nu ncarc DTD-urile externe. a last() returneaz numrul de elemente din elementul curent; de exema a plu dac se dorete aducerea ultimului element, se poate folosi: a s /studenti/student[last()] local-name(node-set) returneaz numele local (i.e. necalicat) pena tru un nod. De exemplu, //*[local-name()=nume] aduce toate elementele care au numele local nume. name(node-set) returneaz numele calicat al unui nod, adic numele a a de spatiu de nume, dou puncte i apoi numele local. a s namespace-uri(node-set) este utilizat pentru a obtine lista de URI uri asociate unui nod sau element position() d pozitia nodului context cadrul printelui. a n a

5.2

XPath 2.0

Noutile aduse de XPath 2.0 sunt: at 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 ce poate contine noduri sau valori atomice; a n plus fat de seturile de noduri din XPath 1.0, o secvent poate s a a a contin i valori atomice. Suport conceptul de ordine i pot obtinute as a s

5.2. XPATH 2.0

79

pe baza unor expresii noi introduse; spre deosebire de seturile de noduri accept i valori repetate. as Exemplu: (1, 2, 3) sau (1 to 3) reprezint o aceeai secvent. a s a expresia for - permite iterarea continutului unei colectii expresia if folosit pentru selectie a expresiile some i every s reuniuni, intersectii, diferente Modelul de date este preluat aproape complet de la XPath 1.0, cu deosebirea c loc de nod rdcin se folosete numele de nod document. a n a a a s

5.2.1

Expresii primare

Expresiile primare sunt cele mai simple expresii; sunt de tipurile: literal variabil a apel de functie item de context expresie cu paranteze Un literal este o valoare de tip atomic. Exist dou tipuri de literali a a numeric i ir de caractere. Pentru cei ir de caractere se accept dublarea s s s a caracterelor sau , dac apar interiorul literalului i coincid cu cei de a n s delimitare a valorii. Variabilele reprezint expresii a cror evaluare produce o valoare. Valoaa a rea unei variabile se obtine cu $numeVariabila. Parantezele se folosesc, precum cazurile alnite general pentru n nt n stabilirea ordinii de efectuare a operatiilor. De asemenea se pot folosi pentru denotarea secventelor:(1, 2, 3) este secventa de 3 numere, deosebit de a ((1, 2), 3) care este format dintr-o secvent i un numr. a a s a Apelurile de funtii sunt de asemenea considerate expresii XPath 2.0, n iar valoarea lor este valoarea returnat de apel. a Un item de context este pur i simplu ., putnd reprezenta nodul curent s a (precum XPath 1.0); dar poate de asemenea s reprezinte o secvent, n a a precum n: (1 to 100)[. mod 10 = 0] care produce secventa 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 scdere i schimbare de semn a s * pentru nmultire div pentru artire mp idiv pentru artire mp mod pentru modulo Operatorul - trebuie s e prexat i urmat de caracter spatiu, altfel a s s-ar putea interpreta ca parte dintr-un nume; deci, x - y i nu x-y. Se poate s folosi pentru scderea a dou valori de tip dat atunci se obtine valoare de a a a tip durat de timp (xs:dayTimeDuration). a Operatorul idiv cere ca operanzii dati s e de tip a ntreg.

5.2.3

Expresii de localizare XPath 2.0

Au aceeai form ca XPath 2.0: s a n axa :: test-nod [predicat1][predicat2]... Axele sunt aceleai din versiunea precedent; axa namespace este considerat s a a nvechit i se va elimina ulterior. as

5.2.4

Expresii secvent a

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

5.2. XPATH 2.0

81

Secventele pot combinate folosind reuniunea, intersectia, scderea de a alte secvente. Trebuie retinut c aceti operatori produc eliminarea duplica a s telor, deci rezultatul este similar cu conceptul de set de noduri. Dac a, b, c, d sunt noduri, atunci: a a, b union c, d duce la crearea secventei a, b, c, d. Pentru intersetie se folosete operatorul intersect. Rezultatul aplicrii s a operatorului poate secventa vid (). a Scderea a dou secvente se face cu operatorul except. a a

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 comparrii expresiilor de tip secvent, se folosesc =, !=, <, a a >, <=, >=, dar sensurile lor sunt un pic denaturate fat de cele intuitive. De a exemplu, expresia (1, 2) = (2, 3) este evaluat la true deoarece 2 apare a ambele secvente. n

5.2.6

Expresii logice

Pentru crearea de expresii logice se folosesc operatorii and i or, precum s i functia not(). s

82

CAPITOLUL 5. XPATH (CONTINUARE)

5.2.7

Expresii for

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

5.2.8

Expresii conditionale

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

5.2.9

Expresii cuanticate

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

Capitolul 6 XSLT
6.1 Generaliti at

Extensible Stylesheet Language (XSL) este format din trei limbaje: XPath - limbaj pentru adresarea pc tilor de continut dintr-un docua ment XML XSL Transformations (XSLT) - pentru transformarea documentelor XML continut de tip text n XSL Formatting Objects (XSL-FO) - pentru formatarea vizual a doa cumentelor XML Intr-o transformare XSLT, un procesor de XSLT citete att un ier s a s XML ct i un document XSLT; pe baza indicatilor din documentul XSLT a s se opereaz transformri asupra documentului XML, rezultatul ind un al a a treilea document (e el XML sau nu). De cele mai multe ori, XSLT este folosit pentru a obtine iere (X)HTML, sau un XML intermediar ce poate s apoi transformat altceva, de exemplu PDF. Intuitiv, procesul de n n transformare este redat gura 6.1. n Rdcinile limbajului XSLT stau programarea functional; de asemea a n a nea se folosete mecanism de pattern-matching bazat pe XPath. Limbajul s este unul declarativ, bazat pe transformarea de pattern-uri (sectiuni de do cument); pe baza unor expresii functionale se arat care este noul continut ce a trebuie generat. Abordarea este una de tip divide et impera, iar prin combinarea rezultatelor obtinute pentru diferite pattern-uri se obtine documentul de ieire nal. s Versiunea curent de XPath este 2.0, dat sub form de recomandare a a a W3C 23 ianuarie 2007. n 83

84

CAPITOLUL 6. XSLT Figura 6.1: Procesul transformrii unui document XML prin XSLT () a

6.2

Mecanismele XSLT

Un procesor XSLT se bazeaz pe arborele XPath al unui document XML a (e sucient ca documentul s e bine format, nu e necesar i validarea lui). a as XSLT opereaz prin transformarea unui nod altceva (cel mai des, alte a n noduri XML). Un document XSLT contine nite reguli pentru template-uri (abloane). s s O astfel de regul este compus dintr-o expresie de localizare XPath i ieirea a a s s care trebuie s e produs cnd procesorul gsete un nod care respect a a a a s a localizarea dat de XPath. a Un document de stil XSLT este un document XML ce respect un voa cabular anume. Elementul rdcin este e stylesheet, e transform; se a a a folosete spatiul de nume xsl avnd drept URI asociat http://www.w3.org/ s a 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 spatiu de nume se folosete pentru orice element XSLT - asta s ajut procesorul de XSLT s aleag elementele pe care le va procesa. Orice a a a nu este prexat cu xsl: se consider c va face parte din ieirea produs. a a s a

6.2. MECANISMELE XSLT

85

S considerm documentul XML din listing-ul 6.1. Listingul 6.2 contine a a un document XSLT care se aplic peste lista de studenti. a 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 ieire de tip text s <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 aplicrii XSLT-ului peste XML este: a

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

CAPITOLUL 6. XSLT

procesorul XLST parcurge documentul XML i gsete elementul rdcin s a s a a a care se conformeaz expresiei de localizare din primul element xsl:template. a procesorul XSLT se conformeaz regulii: se scrie Inceputul listei de a studenti, apoi se continu cu aplicarea template-urilor pentru nodurile a continute - cele dou noduri student (este un apel recursiv, care va ge a nera executarea unui alt template), apoi se va scrie la sfrit Sfarsitul as listei de studenti din elementul curent (/studenti) regsim un alt tip de element, student a pentru care se aplic al doilea template din documentul xslt (e resc, a deoarece contextul nodul context avem un nod care se potrivete cu n s match="student"). Pentru ecare element student se aeaz continutul s a atributului nume, apoi continutul elementului adresa, desprtite prin a virgul. a Alt exemplu: plecnd de la acelai XML, vom aplica transformarea dat a s a listing-ul 6.3. Ieirea va cea din listing-ul 6.4. n s

6.2.1

Template-uri

Un element de tip xsl:template denete un nod cruia i se va aplica o s a anumit regul. Are atributele match, mode, priority i name. a a s Atributul match pentru orice element template are ca valoare o expresie XPath care specic cui i se va aplica acel template. Se poate folosi tot ceea a ce s-a prezentat la sectiunea de XPath: ci relative, ci absolute, referiri la a a axe i locatii, predicate, etc. Pe baza acestor expresii de localizare se face s identicarea nodurilor pentru care se va aplica template-ul curent. Atributul mode este optional, permitnd procesarea selectiv a unui tem a a plate, dac la elementul <xsl:apply-templates> se specic aceeai valoare a a s de atribut.

6.2. MECANISMELE XSLT

87

Tabela 6.3: Document XSLT ce produce ieire HTML s <?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: Ieirea HTML corespunztoare XSLT-lui din listing-ul 6.3 s a <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 folosete pentru template-uri care au nume, deci care s nu se aplic pe baza potrivirii locului nodului cu expresia XPath, ci sunt a apelate manual. Atributul priority are ca valoare un numr real (implicit 1) care specic a a prioritatea aplicrii regulii. a

6.2.2

Elementul xsl:value-of

Calculul valorii ce se va aa se face cu elementul xsl:value-of. Atribus tul select specic formula de calcul pentru elementul curent; acesta poate a s e o cale XPath, sau apel de functii XPath. Continutul efectiv depinde a de tipul de nod pe care se aplic. Valorile pentru ecare tip de nod sunt: a pentru un nod element, continutul este concatenarea tuturor caracte relor (mai putin cele de parsare) pentru nodul rdcin este valoarea sa, adic concatenarea tuturor vaa a a a lorilor de string pentru nodurile de tip text nod de tip text, este chiar continutul su a nod atribut - este valoarea atributului nod spatiu de nume - URI-ul spatiului de nume nod instructiune de procesare - textul dintre inta declarat (exclusiv) t a i s nchiderea ?> nod comentariu - valoarea este chiar textul continut

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 vrem s scriem pentru a a ecare student o list a limbilor pe care le cunoate, putem scrie XSLT-ul a s din listing-ul 6.5. Ieirea asociat XLST-ului din 6.5 este dat listingul s a a n 6.6. De multe ori se poate evita folosirea acestui element, folosind-se schimb n template-urile. Acelai efect se obtine prin XSLT-ul din listing-ul 6.7. s

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 denete nite reguli de template-uri implicite care sunt incluse s s n orice document XSLT. Prima regul implicit se refer la nodul rdcin i a a a a a as elemente i aplic template-uri la orioce nod copil. A doua regul se refer s a a a la nodurile text i atribute. Acestea 2 s mmpreun a nseamn c chiar i un a a s document XSLT care contine doar element xsl:stylesheet va produce o ieire continnd textul elementelor din documentul XML. s a

6.3.1

Regula de template implicit pentru elemente a

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

92

CAPITOLUL 6. XSLT

Tabela 6.7: Procesare echivalent cu 6.5, dar fr for-each a aa

<?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 pentru noduri text a i atribute s

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

6.3.3

Regula de template implicit pentru instructiuni a de procesare i comentarii s

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

6.4

Template-uri pentru valori de atribute

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

94

CAPITOLUL 6. XSLT

6.5

Specicarea ieirii la runtime s

De cele mai multe ori se cunosc numele elementelor i al atributelor care s compun documentul de iesire. unele cazuri, a numele elementelor, s In ns atributelor, instructiunilor de procesare nu este cunoscut, sau vrem s pro a ducem din mers comentarii, sau s producem text a crui formatare s a a a se pstreze. Pentru aceasta s-au introdus: xsl:element, xsl:attribute, a xsl:processing-instruction, xsl:comment, xsl:text.

6.5.1

Inserarea de elemente documentul de ieire cu n s xsl:element

Dac avem nevoie de detalii din documentul XML, pe baza crora se a a creeaz efectiv un nume de element putem folosi xsl:element; aceasta, dup a a cum am mai spus, se ampl cnd vocabularul documentului rezultat nu nt a a este cunoscut aprioric, ci construit pe baza continutului 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 documentul de ieire cu n s xsl:attribute

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

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

95

Evident, orice atribut se nainte de a ncepe generarea continutului elemen tului.

6.5.3

Inserarea de PI documentul de ieire cu xsl:processing-instructi n s

Instructiunea xsl:processing-instruction insereaz o instructiune de a procesare documentul de ieire. se specic inta PI-ului pruin valoan s a t rea atributului name. Continutul PI-ului devine continutul instructiunii de procesare. Exemplu: <xsl:template match=PROGRAM> <xsl:processing-instruction name=gcc> -O4 </xsl:processing-instruction> </xsl:template>

6.5.4

Inserarea de comentarii documentul de ieire n s cu xsl:comment

Elementul xsl:comment insereaz un comentariu documentul de ieire. a n s 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 documentul de ieire cu xsl:text n s

Eleemntul xsl:text va produce textul dat ca i continut documentul s n de ieire. Dei pare redundant, textul scris ind oricum trecut documentul s s n de ieire, are un set de avantaje: s pstreaz exact spatiile continute; un procesor de XSLT va elimina a a spatiile din documentul XSLT permite includerea de caractere < i & fr folosirea referintelor la ens aa titi predenite. at

96

CAPITOLUL 6. XSLT

6.6

Moduri

S presupunem c se dorete procesarea unui nod din document, dar a a s n locuri diferite acesta va trebui s arate diferit. Solutia este de a da ecrei a a reguli un mod spcic, care va selectat de ctre utilizator. Acest mod se a specic prin intermediul atributului mode pentru xsl:template, iar invoa carea unui template cu un mod anume se face prin specicarea aceluiai s mod la apelul xsl:apply-templates. Un mod este materializat ca un ir de s 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 acelai target: s <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], sectiunile: 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 mai 2001, ind n unul din limbajele schem XML. O schem XML este descrierea unui docua a ment XML, de obicei sub forma constrngerilor pe care trebuie s le satisfac a a a o instant XML1 . Un document schem XML este un document XSD (XML a a Schema Denition), adic un ier avnd extensia .xsd; acesta va folosit a s a pentru validare.

9.2

Minusuri ale lui DTD

DTD are i el ca scop validarea documentelor XML. Dei extrem de pos s pular, are cteva probleme evidente: a

9.2.1

Lipsa tipizrii a

Dac considerm un element cu continut de tip text, este imposibil s a a a precizm care sunt restrictiile care trebuie satiscute de acesta; vom specia a ca doar #PCDATA, asta nsemnnd orice ir alfanumeric. Ar de dorit s a s a putem preciza c a ntr-un element avem posibilitatea de a specica o dat caa lendaristic, sau un numr aat a a ntre anumite praguri, sau un ir de caractere s care satisface un anumit model.
1

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

101

102

CAPITOLUL 9. XML SCHEMA

9.2.2

Sintaza non-XML

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

9.2.3

Scalabilitatea redus a

Este dicil combinarea de documente DTD. Exist posibiliti limitate a a at de folosire att a DTD-urilor interne ct i externe, dar se ajunge rapid la a a s cod greu de gestionat i de eles. s nt

9.2.4

Nesuportarea spatiilor de nume

Am vzut din prezentrile anterioare (XSLT, XSL-FO) c se folosesc maa a a siv spatiile de nume. Acestea se denesc printr-un prex (numele efectiv al acestui prex este putin important, putnd varia) i un URI (care este de a s DTD se pot deni numele de elemente cu prex, fapt partea important). In a dar nu se poate preciza uor c acesta poate s e variabil, dar cu un URI s a a xat.

9.2.5

Structura inexibil a

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

Dac a acelai document XML vrem s folosim elementul name care s a ns n s a a contin elementele first, last, middle atunci avem o problem: structura a a precizat anterior nu permite asta. Fie folosim spatii de nume, e schimbm a a complet numele elementului ca s reecte contexte diferite, nu avem o solutie a elegant la problem. a a

9.2.6

Alte limitri a

Cteva limitri care nu sunt att de evidente: a a a ordinea elementelor dat de DTD este xat; a a

9.3. XSD

103

nu se poate preciza cu uurint numrul maxim de aparitii ale unui s a a element; dac se face asta, atunci se stabilete i ordinea de aparitie a a s s elementelor. Ordinea, de cele mai multe ori, este irelevant, primnd a a structura documentului. Exist solutii la aceste probleme, dar ele sunt caracterizate prin explozie a combinatorial a numrului de linii ce trebuie scrise, ceea ce rezult cod a a a n greu de gestionat i dezvoltat. s Din ceea ce se spune mi sus s-ar putea deduce c DTD este o solutie ce a nu ar trebui adoptat. a nu este chiar aa, XSD vine doar s a Ins s a ntregeasc a anumite lipsuri ale DTD; alegerea schemei de validare se face functie de n problema efectiv. La ora actual DTD este o optiune des alnit. a a nt a

9.3

XSD

S considerm documentul XML de mai jos: a a <?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> Remarcm c elementul rdcin pentru schem este xsd:schema. Prexul a a a a a a xsd este asociat URL-ului http://www.w3.org/2001/XMLSchema. Se poate folosi i alt prex loc de xsd, de exemplu xs, dar URL-ul este important a s n se preciza de ecare dat la fel. Declararea de element se face prin intermea diul lui xsd:element care precizeaz ca valoare a atributului name numele a elementului denit, iar prin atributul type tipul de date permis: ir de cas ractere. Nu se permite ca elementul helloSchema s contin subelemente, a a dar poate gol. S presupunem c documentul XSD anterior este salvat cu numele hellosa a chema.xsd. Legarea documentului XML de cel XSD vederea validrii se n a face prin ataarea atributului xsi:noNamespaceSchemaLocation la elemens tul rdcin; valoarea acestuia va URL-ul documentului xsd, iar prexul a a a 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 sectiunea 9.6. Elementele de tip simplu pot s contin orice n a a afar de alte elemente. Elementele de tip compus pot contine atribute i n a s alte elemente. S considerm documentul XML: a a <?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> Fiierul xsd referit ar putea : s <?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 un singur element de nivel superior - SONG. Doar acest tip de a elemente pot folosite ca element rdcin pentru documentul XML. Tipul a a a elementului este SongType, tip denit ca ind complex; cazul de fat se n a denete ca o secvent de elemente de tip simplu (TITLE, COMPOSER, etc) s a care trebuie s e prezente ca singurele elemente copil i ordinea dat. Se a s n a pot insera, desigur, spatii i caractere de linie nou s a ntre elemente. Pot exista a cazuri care numrul de aparitii ale unui element este ns n a minorat/majorat, de exemplu pot exista mai multi compozitori pentru un cntec. Se pot preciza atributele minOccurs i maxOccurs pentru ecare a s element, valoarea lor ind cte un a ntreg mai mare sau egal ca 0. Atributul maxOccurs poate de asemenea s ia valoarea unbounded pentru a indica un a numr orict de mare de aparitii. a a Exemplu: <xsd:element name="COMPOSER" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> Se pot preciza astfel: oricte aparitii, inclusiv niciuna a oricte aparitii, maxim n a oricte aparitii, minim m a oricte aparitii, minim m i maxim n a s element optional (minOccurs=0 maxOccurs=1) Ce s-ar ampla dac elementele COMPOSER i PRODUCER ar trebui s nt a s a contin elementul NAME, de tip simplu? altfel spus, dac ar trebui s scriem: a a a <COMPOSER> <NAME>Henri Belolo</NAME> </COMPOSER> i s <PRODUCER> <NAME>Jacques Morali</NAME> </PRODUCER>

106

CAPITOLUL 9. XML SCHEMA

atunci vom deni tipurile compuse ComposerType i ProducerType: s <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 i PRODUCER se denesc innteriorl tipului s n SongType ca: <xsd:element name="COMPOSER" type="ComposerType" maxOccurs="unbounded"/> <xsd:element name="PRODUCER" type="ProducerType" minOccurs="0" maxOccurs="unbounded"/> Pentru eliminarea redundantei se poate deni un singur tip complex, numit de exemplu PersonType iar acesta s e folosit ca tip de date pentru a a COMPOSER i PRODUCER. Codul asociat are minime modicri fat de s a a cel de mai sus. S presupunem acum c dorim ca tipul NAME s arate astfel: a a a <NAME> <GIVEN>Victor</GIVEN> <FAMILY>Willis</FAMILY> </NAME> Am putea scrie urmtoarele: a <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

Observm a c tipul NameType se folosete doar pentru denirea tipului a ns a s PersonType, reutilizarea lui ind nul. Ne punem problema dac nu s-ar a a putea reduce domeniul de vizibilitate al unui tip, astfel at s e valabil nc a doar cadrul tipului ce are nevoie de el. Putem crea tipuri anonime: n <?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 care se vrea ca un element s e cu continut mixat, n a 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 privete aspectul ordinii elementelor copil. exemplele date s In mai sus s-a denit de ecare dat i ordinea care apar sub-elementele. De as n cele mai multe ori, a, ordinea este putin relevant. ns a Exsit trei moduri de grupare: xsd:all, xsd:choice, xsd:sequence. a

9.5.1

Grupul xsd:all

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

9.5.2

Grupul xsd:choice

Grupul xsd:choice arat c din elementele precizate exact unul singur a a trebuie s apar lista nal. a a n 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 i maxOccurs care s precizeaz de cte ori pot aprea elementele specicate list, ecare din a a a n a elemente ind independent de alegerile anterioare.

9.5.3

Grupul xsd:sequence

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

9.6. TIPURI SIMPLE

109

9.6

Tipuri simple

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

9.6.1

Tipuri numerice

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

110

CAPITOLUL 9. XML SCHEMA

7. xsd:long - ntregi pe 8 octeti, cu semn 8. xsd:int - ntregi pe 4 octeti, cu semn 9. xsd:short - ntregi pe 2 octeti, 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 octeti, fr semn, 0 aa 13. xsd:unsignedInt - ntreg pe 4 octeti, fr semn, 0 aa 14. xsd:unsignedShort - ntreg pe 2 octeti, fr semn, 0 aa 15. xsd:unsignedByte - ntreg pe 1 octet, fr semn, 0 aa 16. xsd:positiveInteger - un ntreg strict mai mare det 0 a

9.6.2

Tipuri pentru reprezentarea timpului

xsd:dateTime - ex: 1999-05-31T13:20:00.000-05:00 reprezentnd un a anumit moment UCT n xsd:date - ex: -0044-03-15 = o anumit zi a 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 zi dintr-o lun a a oarecare xsd:gMonth - ex: 01, 02, . . . , 11, 12 = o anumit lun dintr-o a a zi oarecare xsd:gYear - ex: -0002, -0001, 0001, 0002, 0003 = un an precizat xsd:gYearMonth - ex: 1999-12 = o lun precizat dintr-un an precizat a a xsd:gMonthDay - ex: 10-31 = o zi precizat dintr-o lun precizat a a 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 mare parte peste tipurile de date precizate DTD n n cazul atributelor. Ele sunt: xsd:ID, xsd:IDREF, xsd:ENTITY, xsd:NOTATION, n xsd:IDREFS, xsd:ENTITIES, xsd:NMTOKEN, xsd:NMTOKENS, xsd:language, xsd:Name, xsd:QName, xsd:NCName.

9.6.4

Tipuri de date ir de caractere s

xsd:string - o secvent de 0 sau mai multe caractere Unicode a xsd:normalizedString - un ir de caractere care toate caracterele s n TAB, salt la linie nou (CR, LF) sunt a nlocuite cu spatii xsd:token - n ir de caractere care toate caracterele TAB, salt la s n linie nou (CR, LF) sunt a nlocuite cu spatii, spatiile consecutive sunt nlocuite cu un singur spatiu iar spatiile de la nceputul i sfritul s as sirului sunt eliminate.

9.6.5

Tipuri binare

Includerea de valori binare document XML ar strica buna formare a n acestuia; dac se dorete aa ceva se poate trece respectivul continut binar a s s Base 64. Tipurile XSD pentru continut binar sunt xsd:base64Binary i n s xsd:hexBinary.

9.7

Derivare de tipuri

cazul care tipurile existente nu sunt pe plac se pot crea altele; tehIn n nicile la care se apeleaz sunt: restrngerea, reuniunea, enumerarea de valori a a 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 restrngere a

S presupunem c valoarea unui element este un a a ntreg, cuprins ntre 3 (inclusiv) i 100 (exclusiv). Mai degrab dect s ne multumim cu unul s a a a din tipurile ntregi enumerate sectiunea 9.6.1, putem porni de la unul (de n exemplu xs:positiveInteger) i s operm restrictii asupra lui. s a a 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 urmtorii operatori de restrictionare: a xsd:minExclusive ce specic valoarea minim, exclusiv cea precizat a a a xsd:maxExclusive ce specic valoarea maxim, exclusiv cea precizat a a a xsd:minInclusive ce specic valoarea minim ce poate luat a a a xsd:maxInclusive ce specic valoarea maxim ce poate luat a a a xsd:enumeration o list de valori ce poate luat a a xsd:whiteSpace arat cum anume se trateaz spatiul din interiorul a a valorii xsd:pattern exprim o expresie regulat cu care se compar expresia a a a dat a xsd:length dnumrul exact de careactere dintr-un string, numrul a a a elementelor dintr-o list, numrul de octeti dintr-o valoare binar a a a xsd:minLength, xsd:maxLength - lungimea minim/maxim a a xsd:totalDigits precizeaz numrul maxim de cifre prezen a a ntr-un numr a

9.7. DERIVARE DE TIPURI

113

xsd:fractionDigits dnumrul maxim de cifre prezent partea fractionar a a n a a unui numr a Pentru exemple concrete, a se vedea [1], capitolul 20.Pentru restrictionareaprin 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 presupunem cavem un element YEARS care contine o list de ani: a a a <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 obtine altul, prin restrngere: a <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 (fr copii sau subelemente) se declar acel aa a element, dar fr a spune c avem continut de tip xsd:sequence, xsd:all, aa a xsd:choice. Exemplu: <xsd:complexType name="PhotoType"> </xsd:complexType>

9.9

Atribute

S presupunem c putem avea un element PHOTO gol care are atribute: a a <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 i s SAX


10.1 Introducere

Sunt cazuri care XSL i XPath nu sunt suciente pentru n s ndeplinirea unei anumite sarcini; de cele mai multe ori trebuie procesat un document XML, cu cod scris manual. Acest lucru este uor, dat ind structurarea de s a care dispune un document XML. Exist dou prti care compun o aplicatie a a a XML: 1. procesorul de XML (eng: parser) 2. aplicatia propriu-zis a Un parser se folosete pentru descompunerea documentului XML s n prtile componente, de exemplu elemente, atribute, comentarii, instructiuni a de procesare, sectiuni CDATA, etc. Mai departe acestea sunt vzute ca a ind compuse din etichete de nchidere i deschidere, nume de atribut i s s valoare, etc. Parserul este componenta cea mai de baz, dar acelai timp a n s i cea mai important parte a unei aplicatii XML. Este independent de s a a continutul efectiv al documentului, atta timp ct acesta respect regulile de a a a bun formare. Parserul rezolv probleme de tipul: codicarea documentului, a a spatii de nume, declaratii i referinte de entiti, etc, a cror tratare de ctre s at a a programator ar duce la o slab productivitate. a Suplimentar, poate aprea cerinta de validare de ctre un parser fat de a a a DTD sau XSD sau alt mod de precizare a schemei; mentionm a c nu se a ns a cere ca orice parser de XML s e i validator. a s Aplicatia sine este cea care beneciaz de procesarea documentului n a XML de ctre parser; schema de lucru general este simpl: a a a 115

116

CAPITOLUL 10. API-URI PENTRU XML: DOM SI SAX

1. parserul proceseaz documentul XML a 2. aplicatia consum continutul furnizat de parser a Problema tratat acest curs este cum se face comunicarea a n ntre aplicatie i parser. Exist dou modalitati: unul bazat pe obiecte i altul bazat pe s a a s evenimente. Fiecare variant denete un API1 , apelabil din aplicatia XML. a s Interfata de programare care lucreaz cu documentul XML vzut ca un a a set de obiecte (Document Object Model, DOM) este poate cea mai natural a abordare. Se construiete un arbore de obiecte care corespunde documentului s XML; de exemplu pentru listing-ul 10.1 arborele obtinut 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 citete documentul i construiete gradual arborele DOM. Nos s s durile din arbore sunt vzute ca obiecte. Obiectul DOM va reprezenta a ntreg documentul memorie, ceea ce d posibilitatea cutrii i operrii rapide n a a a s a pe document, dar cu un pret pltit: memoria consumat. a a Procesarea bazat pe evenimente este cea de-a doua abordare. Este un a mod natural din perspectiva parserului, dar prim faz poate perceput n a a a ca mai putin util pentru programator. Dup ce apare acomodarea cu aceast a a
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 dect DOM. API-ul rezultat este numit SAX a (Simple API for XML). Prin SAX nu se construiete explicit un arbore ataat documentului; s s n schimb, parcurgnd documentul se va declana un eveniment la ecare desa s chidere de element, nchidere de element, aparitie de comentariu, atribut, sectiune CDATA, etc. felul acesta poate s verice buna formare a docu In a mentului, dar cel mai important se poate reactiona la ecare schimbare de context care este considerat important; de exemplu, se poate seta ca doar a a elementele de tip sectiune s e procesate de ctre aplicatie. a a 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 API-uri nu sunt opozitie, ci servesc unor scopuri diferite. a n Alegerea unuia sau a altuia din cele dou modele se face functie de nea n cesitile concrete ce se cer rezolvate i de plusurile i minusurile celor dou at s s a API-uri.

10.2

DOM: XML arborescent

Specicatiile W3C pentru DOM sunt artite pe nivele, ecare pre mp ciznd functionalitile cerute i optionale. Un parser de XML trebuie s a at s a specice acest nivel pentru care are implementrile funtionale; de asemenea a

118

CAPITOLUL 10. API-URI PENTRU XML: DOM SI SAX

se mai obinuiete includerea de extensii specice productorului. La ora s s a actual exist recomandri W3C pentru nivelele 1, 2 i cteva din modulele a a a s a de nivel 3, ceea ce nseamn c ele sunt complet specicate. a a DOM permite urmtoarele: a crearea de documente i a prtilor de document (elemente, atribute) s a navigarea prin document prin parcurgere de arbore mutare, copiere, tergere de elemente s adugare i modicare de atribute a s Dei DOM contine cuvntul obiect, el const din interfete fat de care s a a a trebuie s se conformeze nite obiecte. a s Figura 10.2: Setul de interfete pentru DOM

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

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

119

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

120 sunt:

CAPITOLUL 10. API-URI PENTRU XML: DOM SI SAX

Tabela 10.3: Metode pentru interfata Node. Metoda Node appendChild(Node newChild) Descriere Adaug nodul specicat a la sritul listei de noduri as Node cloneNode(boolean deep) creeaz o copie a acestui nod a NamedNodeMap getAttributes() returneaz atributele pentru nodul a curent dac acesta este un element a NodeList getChildNodes() returneaz lista nodurilor copil a Node getFirstChild() returneaz primul nod copil a Node getLastChild() returneaz ultimul nod copil a String getLocalName() returneaz partea local a unui nume a a complet de nod String getNamespaceURI() returneaz URI-ul pentru spatiul a de nume al nodului curent Node getNextSibling() returneaz nodul care urmeaz celui curent a a String getNodeName() returneaz numele nodului a short getNodeType() returneaz tipul nodului a String getNodeValue() returneaz valoarea nodului a Node getParentNode() returneaz nodul printe a a String getPrex() returneaz prexul de spatiu de nume a asociat nodului curent Node getPreviousSibling() returneaz nodul de pe acelai a s nivel, precedent boolean hasAttributes() spune dac nodul curent are atribute a boolean hasChildNodes() spune dac nodul curent are copii a Node insertBefore(Node newChild, inserez noul nod a nainte de nodul copil Node refChild) referit Node removeChild(Node oldChild) terge nodul referit i returneaz s s l a Node replaceChild(Node newChild, nlocuiete nodul copil al nodului s Node oldChild) curent cu un alt nod void setNodeValue(String nodeValue) seteaz valoarea nodului curent a void setPrex(String prex) seteaz prexul spatiului de nume a pentru nodul curent Metoda getNodeType() returneaz un a ntreg asociat nodului curent; n functie de tipul nodului, obtinem urmtoarele valori constante denite chiar a interfata Node: ATTRIBUTE NODE, CDATA SECTION NODE, COMMENT NODE, n

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 dac instantiem documentul XML pe baza unui ier i a a s s modicm obiectul DOM, nu a nseamn c se va modica automat i ierul; a a s s modicrile vor aprea numai dup salvarea obiectului DOM a a a napoi ier. n s Pentru platforma .NET clasele omoloage sunt spatiul de nume System.Xml; n clasele existente ofer aceleai servicii ca i cele din Java, cu cteva extena s s a sii introduse de Microsoft; se ofer compatibilitate complet cu W3C DOM a a 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 ctre W3C, a principiul pe care se bazeaz este a ns a bine articulat astfel at a devenit rapid adoptat de programatori. nc Civa din pionierii XML s-au implicat proiectul SAX. COmunicarea at n i urmrirea proiectului s-au fcut lista de emailuri XML-DEV iar rezuls a a n tatul nal a fost crearea unui pachet nou de Java, org.xml.sax; totul a fost nalizat cinci luni. n Principiul de lucru este simplu de nteles: parserul va duce la generarea unui ux de noduri de tipuri oarecare. Sosirea ecrui astfel de nod este a socotit un eveniment. De exemplu, se poate cere reactionarea la elementele a de tip element cu eticheta nume, care ar procesat prin: trecerea la rnd a a nou, inserare de tab-uri i schimbare de font, apoi scrierea continutului text s al elementului. Practic, la ecare eveniment se apeleaz o metod (event a a handler, callback function) denit convenabil de ctre programator. a a Acest model are cteva particulariti care trebuie evidentiate: a at viteza mare de lucru: pe msur ce se parcurge documentul XML se a a reactioneaz la nodurile alnite. o actiune este declanat att de a nt s a a repede pe ct este posibil. a memorie putin necesar: deoarece spre deosebire de DOM, SAX nu a a construiete implicit un model al documentului XML (dei poate i s s s este deseori folosit pentru aceasta), memoria alocat este neglijabil. a a Aceasta are un impact important asupra procesrilor ce se fac pe partea a de server, accesat concomitent de mai multi clienti. a caracterul serial al procesrii: SAX merge doar a nainte, fr posibilitaaa tea relurii de la un punct anterior; dac se vrea asta, atunci trebuie a a

122

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

Caracteristicile de mai sus fac SAX potrivit pentru urmtoarele activiti: a at cutarea a ntr-un document a unui anumit continut tiprirea formatat a continutului a a producerea unui alt document XML cu modicri minore fat de doa a cumentul surs a construirea unui model al documentului (de exemplu DOM) Dar faptul c SAX nu duce la memorarea continutului documentului a poate nsemna i slbiciuni. Este contraindicat SAX urmtoarele sarcini: s a n a reordonarea elementelor documentului rezolvarea referintelor ncruciate dintre noduri s vericarea referintelor de tip IDREF validarea documentului ciuda acestor limitri, SAX este o unealt puternic. In a a a Evenimentele pe care SAX le raporteaz sunt: a deschidere de element nchidere de element parcurgere continut de element aparitia de entiti at erori de parsare Pentru a elege modul de lucru, s plecm de la documentul XML: nt a a <?xml version="1.0"?> <curs> <capitol nume="Introducere"> prezentare generala </capitol> </curs>

10.3. SAX: XML CU EVENIMENTE Prin SAX vom obtine evenimentele: 1. gsit deschidere de element (curs) a 2. gsit deschidere de element (capitol) a 3. gsit atribut a 4. gsit text a 5. gsit a nchidere de element (capitol) 6. gsit a nchidere de element (curs)

123

La ecare eveniment programatorul poate s dicteze ce anume se ampl. a nt a Desigur, pot aprea diferente a ntre tipurile de evenimente cunoscute, dar ideea de baz este aceeai. a s Continum cu prezentare folosind limbajul Java (.NET nu include SAX, a cu toate c se poate construi unul pornind de la clasele disponibile, sau a se poate include un parser open-source). Pentru a implementa un parser bazat pe SAX putem deriva o clas din DefaultHandler aat pachetul a a n org.xml.sax.helpers. Metodele din aceast clas sunt date tabelul 10.4. a a n 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 caracterele dintr-un element a proceseaz detectarea sfritului de document a as proceseaz detectarea sfritului de element a as

proceseaz sfritul unei mapri de a as a spatiu de nume void error(SAXParseException e) proceseaz o eroare de parsare recuperabil a a void fatalError(SAXParseException e) raporteaz o eroare fatal a a void ignorableWhitespace proceseaz spatiul neglijabil a (char[] ch, int start, int length) (percum cel folosit la identare) void notationDecl(String name, proceseaz o declaratie de notatie a String publicId, String systemId) void processingInstruction proceseaz un PI a (String target, String data) InputSource resolveEntity rezol o entitate extern a a (String publicId, String systemId)

124

CAPITOLUL 10. API-URI PENTRU XML: DOM SI 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 un obiect Locator a pentru evenimentele documentului proceseaz deschiderea de document a manipuleaz deschiderea unui element a

proceseaz a nceputul unei mapri a de spatiu de nume manipuleaz o declaratie a de entitate neparsat a proceseaz un avertisment de parsare a

Un exemplu de metod care proceseaz elementele de tip capitol este: a a 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 se a nlocuiasc reciproc, ele ind complementare. a functie de contextul de utilizare (natura procesrii, numrul de procesri, In a a a dimensiunea documentului XML) se face o alegere a unui API, dei prerile s a pot artite pentru pentru cazuri mai complexe. mp Extragem urmtoarele concluzii: a dac ordinea procesrii elementelor este neesential, atunci SAX poate a a a de folos dac se dorete analizarea a s ntregului document, atunci DOM este de preferat, deoarece permite parcurgerea documentului orice fel. n dac viteza sau memoria consumate sunt importante, atunci SAX; dac a a documentul este de mici dimensiuni, sau nu sunt mult clienti conectati

10.4. DOM SAU SAX?

125

la o aplicatie care s cear simultan procesri de mari dimensiuni, a a a atunci DOM este bun dac se dorete doar ltrare, SAX este sucient a s

126

CAPITOLUL 10. API-URI PENTRU XML: DOM SI SAX

Capitolul 11 XLink i XPointer s


11.1 Generaliti at

XLink (XML Linking Language) reprezint un mod de creare de hia perlegturi a ntre documentele XML. Diferenta fat de modul de creare a a legturilor HTML este c orice element XML poate s devin un link. a n a a a XLink suport linkuri simple (precum HTML) sau extinse (pentru legarea a n mpreun a mai multor resurse). XLink este recomandare W3C din 27 Iunie a 2001. XPointer (XML Pointer Language) este un mecanism prin care se permite hiperlegturilor s indice spre prti specice (fragmente) dintr-un document a a a XML. Folosete expresii asemntoare cu XPath pentru a naviga interiorul s a a n documentelor XML. Este o recomandare W3C din 25 Martie 2003.

11.2

XLink

In HTML folosim elementul <a> pentru a face o legatur la un alt doa a cument html. Un alt tip de legtur dintre documentul curent i alte resurse a a s este fcut prin intermediul elementului <img>. Totui, linkurile din HTML a s au limite: ele pot indica spre un document sau o parte a lui care a fost delimitat folosind elementul <a> cu atributul name. a Spre deosebire de HTML, in XML orice element poate s contin o a a legtur spre alt resurs. Legturile sunt de dou tipuri: simple (se face a a a a a a legtura ctre o singur resurs) sau extinse, prin care se denete un set de a a a a s acest curs ne vom concentra doar pe linkurile resurse ce vor referite. In simple - la ora actual sunt destul de putine procesoare care pot lucra cu a linkurile extinse. Exemplu: 127

128

CAPITOLUL 11. XLINK SI XPOINTER

<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="images/tree.gif" xlink:show="embed" /> Primul atribut stabilete un spatiu de nume al crui prex va xlink ce s a va folosit pentru toate atributele specializate care sunt denite XLink. n Urmtorul atribut, type precizeaz de ce tip este linkul. Se sugereaz prea a a cizarea acestui atribut, deoarece altfel s-ar putea ca restul elementului s a nu e procesat corect. xlink:href contine ca valoare adresa URL a resur sei referite, iar xlink:show arat cum trebuie manipulat linkul: continutul a ierului tree.gif va arcat acest punct (similar cu comportamentul s nc n lui img ntr-un document arcat nc 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 acest caz valoarea replace, ceea ce n nseamn c se va face arcarea locul documentului curent, iar aceast a a nc n a arcare se face doar cnd utilizatorul apas click pe link (xlink:actuate). nc a a Specicarea resurselor (xlink:href) se face pe baza unui Uniform Resource Identier (URI); exist dou moduri de specicare a acestor resurse: a a una bazat pe specicarea locatiei resursei (adrese URL - Uniform Resource a Locator) iar alta bazat pe un nume unic i care presupune o tabelare face a s c corespondenta ntre nume i locatie. s 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 pozitia curent a documentului din care se face referirea; a doua variant este mai a a exibil cazul care se face mutarea a n n ntregului director. Se poate folosi,

11.2. XLINK

129

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

<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: timp ce locatia se poate modica, numele resursei rmne unic. n a a Ca atare, se folosete un mecanism prin care identicarea locatiei resursei s se face prin nume, o alt component avnd grij de determinarea locatiei1 . a a a a Una din schemele de numire a resurselor este Formal Public Identier (FPI) i a fost descris sectiunea 2.3. s a n Dm o list a atributelor XLink i a valorilor lor: a a s

Similar cu ce se ampl retele prin DNS nt a n

130

CAPITOLUL 11. XLINK SI XPOINTER Atribut + descriere Valoare xlink:actuate onLoad determin cnd se a a onRequest ncarc resursa a other Descrierea valorii la arcarea documentului nc la cererea explicit a utilizatorului a (e.g. click) Aplicatia ar trebui s inspecteze a alt element de marcare din link pentru a determina comp. adecvat Nici un alt element de marcare nu e prezent pentru a ajuta aplicatia s determine comp. adecvat a Adresa pentru legtur a a Integreaz resursa doc. curent a n se deschide o nou fereastr a a se nlocuiete documentul curent s ca la xlink:actuate ca la xlink:actuate Un link simplu Link extins creeaz un link locator a care indic spre o resurs a a arc cu resurse multiple i diferite s ci de traversare a creeaz un link resurs a a indicnd spre o anumit res. a a 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 completeze aceast functionalitate pentru a permite redea a rirea unor prti ale resursei precizate. a Forma general a unuei adrese care se folosete XPointer este: a n s url#XPointer Dei similar modului care se fac legturile HTML, combinatia XLink+XPointer s n a n este mult mai exibil, deoarece permite referirea oricrui element din doa a cumentul int, nu doar a acelora pentru care s-a stabilit un element <a> cu t a atributul name. S considerm documentul XML: a

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 SI XPOINTER

al crui arbore este dat gura 11.3. a n Figura 11.1: Arborele corespunztor documentului de personal. ([2]) a

Pentru erferirea la primul element al crui id este sales se va folosi a personel.xml#sales sau personel.xml#id(sales). id() este o functie care permite saltul la un element al crui atribut declarat de tip ID are a valoarea precizat. a Fiecare expresie XPointer ncepe cu un termen ce reprezint o locatie a absolut care se extinde optional cu alti termeni pentru locatie, uniti prin a punct. Termenul absolut ncepe la o anumit locatie din document iar restul a termenilor duc mai departe, pas cu pas, locatia referit. Fiecare termen a are forma: nume(args) unde nume este tipul termenului, iar args reprezint a argumentele, desprtite prin virgul. a 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() i html(). s Dup cum s-a vzut, id() ne pozitioneaz pe un element avnd un atribut a a a a de tip ID cu valoarea precizat. a Termenul root se refer la a ntregul document specicat de URL-ul de baz. El indic spre un nod virtual situat a a naintea elementului rdcin; a a a elementul rdcin este copil al acestui nod ctiv. Pornind de la acest nod a a a se poate merge mai departe cu: root().child(1,personnel).child(2) Termenul origin() reprezint elementul de la care se intiaz o legtur. a a a a El nu poate folosit mpreun cu un URL. Este utilizat pentru a conecta a elementul de origine cu alt element din acelai document pentru a crea un s 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 ca parametru. a

11.3.2

Termeni pentru localizare relativ a

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

134

CAPITOLUL 11. XLINK SI XPOINTER

1. numrul nodului - dac un termen de localizare poate duce la aparitia a a mai multor noduri, e util s se precizeze care dintre noduri este de a interes; numerotarea ncepe de la 1. O valoare pozitiv numr a a a n diretia nainte, pe cnd o valoare negativ e utilizat pentru numrarea a a a a napoi - de exemplu dac se vrea utlimul nod, penultimul, etc. a 2. tipul nodului - specic ce tipuri de noduri sunt cerute; dac valoarea a a este un nume sau argumentul lipsete, atunci se consider element; s a altfel este nevoie s se specice una din urmtoarele: a a #text - un ir de caractere s #pi - o instructiune de procesare #comment - comentarii #element sau * - orice element, indiferent de nume #all - orice nod, indiferent de tip

3. nume de atribut - functioneaz doar pentru elemente; se folosete atunci a s cnd se cere ca un element s aibe un atribut (sau orice atribut) - dar a a nu se poate specica mai mult dect un atribut; se specic e numele a a atributului care trebuie s e prezent, e * (atribut oarecare). Dac se a a folosete acest parametru, atunci trebuie s se precizeze i al patrulea s a s parametru - valoarea atributului. 4. valoarea atributului - specic o valoare pentru un atribut precizat pa a punctul anterior, valoare care trebuie regsit. Se poate specica o vaa a loare particular, sau * (orice valoare) sau cuvntul #IMPLIED dac este a a a vorba de un atribut optional. De exemplu: child(1, student, nume, Popescu) aduce primul element copil numit student avnd atria butul nume cu valoarea Popescu; child(1, student, nume, *) aduce primul element copil numit student avnd atributul nume cu orice a valoare; child(1, student, nume, #IMPLIED) aduce primul element copil numit student, indiferent dac are sau nu atribut nume. a Cteva observatii despre termenii folositi pentru localizare relativ: a a 1. loc de id(sales).child(1,employee).child(1,name) se poate fon losi scurttura id(sales).child(1,employee).(1,name) a 2. pentru descendant, un argument negativ nseamn c va considera a a drept prim element pe acela care mod normal ar ultimul parn n curgerea depth rst search (cutare adncime). a n a 3. following() are ordinea de considerare a nodurilor precum gura n 3.

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

135

11.3.3

Subiruri de caractere s

Tot ceea ce s-a discutat pn acum lucreaz doar cu noduri complete. a a a Pentru irruri de caractere a este uneori necesar a se prelua o parte a lor. s ns Functionalitatea este dat de metoda string(). Pentru functie se specic a a ntre dou i patru argumente; primul argument, de tip numeric spune a cta as a aparitie a unui ir de caractere sau caracter (al doilea argument) se vrea a s gsit. Drept prim parametru se poate folosi i all care a a s nseamn orice a aparitie a celui de al doilea parametru. Exemplu: string(2, "bubba") gsete a doua aparitie a irului bubba a s s textul curent. cutarea este case-sensitive. n a Putem folosi i stringul vid drept al doilea parametru i atunci se returs s neaz caracterul de pe pozitia corespunztoare: string(23,""). a a Al treilea i al patrulea parametru denesc pozitia de s nceput pentru un ir, respectiv lungimea subirului de interes. De exemplu, string(1, "Vasco s s Da Gama", 6, 2) caut prima aparitie a stringului Vasco Da Gama, iar dac a a aceasta este gsit se caut de la al aselea caracter si se aduce un subir de a a a s s caractere de lungime 2: Da.

136

CAPITOLUL 11. XLINK SI XPOINTER

Capitolul 12 Baze de date i XML s


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

12.1

Extragerea de date format XML n

O fraz SQL poate a mbogit Transact SQL cu clauza FOR XML at a n adaugat la sfrsitul frazei. a a Clauza este: FOR XML { RAW [(<element>)] [<directives>] [ELEMENTS] | AUTO [<directives>] [ELEMENTS] | EXPLICIT [<directives>] | PATH [(<element>)] [<directives>] [ELEMENTS] } <directives> = [ , TYPE ] [, ROOT (<root>) ] Mentionm c rezultatul poate de dou feluri: document XML (deci bine a a a format) sau fragment XML (un document fr elementul rdcin). aa a a a Descriere: 137

138

CAPITOLUL 12. BAZE DE DATE SI XML

RAW: returneaz un singur element XML pentru ecare a nregistrare dat de SELECT, indiferent de cte tabele sunt implicate in selectare. a a Toate cmpurile devin atribute ale elementelor produse. a AUTO: se produce o structura de elemente imbricate; apare diferenta fat de RAW ind pentru cazul join-urilor. Fiecare tabel din join a a va crea un nou nivel de imbricare documentul returnat; ordinea n cmpurilor din lista de seletie ajut la determinarea structurii docua a mentului XML. EXPLICIT: este modul care asigur cea mai mare exibilitate, dar de a asemenea i cel mai complex. Se bazeaz pe precizarea unei structuri s a ierarhice, explicit de ctre utilizator. a (<element>): permite precizarea numelui unui element ELEMENTS: cmpurile sunt precizate ca i subelemente loc de atria s n bute <directives>: precizeaz TYPE sau ROOT prin care se face o conversie a de tip, respectiv adaug un element rdcin fragmentului XML. a a a a Vom considera cele ce urmeaz dou tabele, persons i phones cu cerate n a a s 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 FORMAT XML IN

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

Considerm fraza select: a select personId, [name], [address] from persons cu rezultatul dat mai sus. Adugm clauza FOR XML RAW: a a 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 SI XML

Observm c numele cmpurilor se transform nume de atribute, iar vaa a a a n loarea adus de select este trecut ca valoare pentru atribute. Orice element a a se numete row; denumirea implicit poate schimbat astfel: s a a select personId, [name], [address] from persons for xml raw(person) Remarcm c avem de-a face cu un fragment XML, deoarece nu avem un a a unic element rdcin. Pentru a aduga un element rdcin cu denumirea a a a a a a a implicit vom scrie: a select personId, [name], [address] from persons for xml raw, root cu ieirea: s <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 elementului rdcin se schimb prin precizarea nua a a a a melui, ca la schimbarea numelui de elemente de mai sus: select personId, [name], [address] from persons for xml raw(person), root(contacts) cu ieirea: s <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 obtinem:

12.1. EXTRAGEREA DE DATE FORMAT XML IN <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 nu au telea foane), adic pentru: a select persons.personId, [name], [address], phoneNumber, description from Persons left join Phones on persons.personId = phones.personId for xml raw observm c lipsesc atributele de telefon i descriere pentru ultuima persoan: a a s 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 dorim ca atributele s apar ca (sub)elemente, vom scrie: a a a 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 SI XML

<personId>6</personId> <name>Popescu</name> <address>Bucuresti</address> </person> Pentru cazul care se opereaz o jonctiune pe cele dou tabele i se folosete n a a s s elements vom obtine: 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 FORMAT XML IN

143

12.1.2

FOR XML AUTO

Aceast optiune produce o structur imbricat a rezultatului; este util a a a a pentru cazurile care se fac jontiuni n ntre tabele. Datele de tip detaliu vor aparea ca sub-elemente ale datelor de tip printe: a 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 folosirea clauzei order by pentru a se aduce elea mentele de tip printe grupat, o singur dat. Remarcm c numele de a a a a a element este luat dupa numele tabelei (sau alias, dac se foloseste). a s Dac se utilizeaz elements atunci atributele se vor transforma elea a n mente, frati ai elementelor corespunznd tabelelor detaliu: a 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 SI 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 variant permite specicarea structurii de XML rezultate. Se a a poate specica pentru ecare nivel de imbricare continutul, dac o anumit a a dat apare ca element sau atribut, sau dac o coloan poate folosit ca i a a a a s criteriu de sortare. Primele dou coloane dinstr-un astfel de select sunt numite Tag, respeca tiv Parent i sunt folosite pentru a specica relatia printe-copil. Coloana s a Tag specic numrul de etichet pentru elementul curent; coloana Parent a a a specic identicatorul elementului printe; dac este 0 sau NULL atunci a a a elementul va pus pe primul nivel; altfel trebuie s indice spre valori Tag a ale altor nregistrri. a Pe lng Tag i Parent trebuie s mai avem i alte cmpuri; ecare cmp a a s a s a a are forma: ElementName!TagNumber!AttributeName!Directive care precizeaz cum anume va aprea ecare dat selectat: a a a a ElementName d numele elementului. a

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

145

AttributeName precizeaz numele de atribut atribut al elementului a cruia i se ataeaz valoarea dat ElementName. a s a a Directive este un cmp optional care se folosete pentru controlul a s formatului documentului XML. Poate lua valorile hide, element, xml, cdata. Considerm exemplul: a 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 SI XML

12.1.4

FOR XML PATH

Reprezint o modalitate mai simpl de specicare a structurii dect FOR a a a 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>

12.2. UTILIZAREA DE DOCUMENT XML CA SURSA DE DATE <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 posibilitatea de a folosi un document XML ca a un tabel din care se fac selectri. a 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 SI 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 introdus pentru XML, i anume a s momentul care se decide folosirea acestui tip de date trebuie s xml. In n a se cunoasc rspunsul la: a a 1. vor documentele XML cu schem sau fr? a aa 2. se va stoca un document XML complet sau doar un fragment? 3. se vor asocia una sau mai multe denitii de schem tipului de date a XML? S considerm tabela: a a 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 regsirea nodurilor: a 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 apartin tipului de date XML, exact ca la relatie dintre clas i a s metode; numele lor este case-sensitive.
1

150

CAPITOLUL 12. BAZE DE DATE SI 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 extrage valoarea unui nod dup ce s-a apelat a n a 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 pentru a determina dac u nanumit nod exist. Rezultatul a a a este 0 dac nu exist i 1 altfel: a as 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 documente XML. Concret, ea permite inserare, n modicarei stergere documentele XML. s n 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 tergere: s 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 instante de XML care suport metodele ante a rioare. 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 SI 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 indeci pe tipul de date XML. Se s permite crearea a 4 tipuri diferite de indeci: s Index XML primar - contine cte un rnd pentru ecare nod, organizatia a a ca un arbore B. Este de fapt o vedere relational a structurii ierarhice a de XML. index cale - este de ajutor atunci cnd se face ctarea folosind ci a a a (principalul mod de referire folosind XPath); se compune din ci a de noduri + valori index proprietate - un index pe cheia primar tabelei XML + ci a a + valori index valoare - similar cu indexul cale, dar valorile sunt indexate naintea cilor. Este util pentru a face cutare a valorilor doa a n cumentul XML, indiferent de calea ctre acestea a

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