luni, 3 noiembrie 2008

XPATH & XQUERY

Atat XPath, cat si XQuery, sunt standarde/limbaje care permit accesarea datelor dorite din interiorul fisierelor xml, fiecare folosind o sintaxa proprie, dupa cum urmeaza:

XPath este un „limbaj” ce permite regasirea unor parti dintr-un fisier XML precum si „navigarea” prin fisiere XML. Documentele XML au o structura arborescenta, datorita relatiei „tata-fiu” a nodurilor din acel document, ceea ce permite limbajului XPath sa poata sa acceseze diferite elemente din cadrul documentelor XML. Acesta este si scopul principal al acestui limbaj. Pentru a permite accesarea diferitelor elemente ale documentului XML, XPath foloseste o sintaxa foarte asemanatoare cu cea utilizata pentru accesarea fisierelor intr-un sistem de fisiere UNIX (ex: „/grupa/studenti/student/nume” pentru fisierul XML de mai jos). XPath nu respecta structura documentelor XML (nu este un fisier XML).
Numele limbajului se trage de la faptul ca utilizeaza „cai” (PATHS) pentru identificarea elementelor XML.

XQuery este o recomandare W3C si a fost creat pentru a permite interogarea documentelor XML si extragerea unor componente ale acestora (elemente sau atribute). Cea mai buna definire a XQuery este obtinuta prin analogia cu SQL. Astfel, XQuery este pentru XML ceea ce este SQL pentru bazele de date. Acest limbaj se bazeaza pe XPath, cele doua limbaje folosind acelasi model al datelor si suportand aceiasi operatori si aceleasi functii. XQuery este suportat de catre toate motoarele mari ce actioneaza pe baze de date (IBM, Oracle, Microsoft, etc.)



1. Sintaxa

In cadrul XPath exista sapte tipuri de noduri: element (nodurile documentului), atribut (asociat unui nod), text, namespace, instructiuni de procesare, comentariu si radacina documentului (root). Datorita structurii arborescente a documentelor XML, intre nodurile acestuia se stabilesc relatii de rudenie (ex: parinte, copil, urmas, etc.).
Selectarea unui nod se face prin urmarea unei cai XPath. Aceste cai pot fi absolute si atunci incep cu „/” sau pot fi relative si atunci NU incep cu „/”. In primul caz, calea catre destinatie porneste din radacina documentului, iar in cel de-al doilea, calea porneste din nodul curent.
Pentru selectarea nodurilor dorite se folosesc urmatoarele elemente de sintaxa:
- [cond] - conditia de selectie
- * - toate nodurile
- @att - specifica ca att este un atribut al nodului
- text() - copiii de tip text ai nodului curent
- node() - copiii de tip nod ai nodului curent
- . - nodul curent
- .. - nodul parinte
- / - nodul radacina
- // - nodul radacina si toti descendentii sai

XQuery
Cateva notiuni de baza ale sintaxei:
• XQuery este un limbaj case-sensitive
• Elementele, atributele si variabilele XQuery trebuiesc sa fie nume XML valide
• Valorile XQuery trebuiesc puse fie intre ghilimele, fie intre apostrofuri
• O variabila XQuery se defineste folosind $NUME, unde NUME este numele variabilei respective (ex: $doc)
• Comentariile XQuery sunt delimitate de (: si de :)

Expresiile XQuery au o structura de FLWOR, care este un acronim pentru „For, Let, Where, Order by, Return”. Aceasta structura extrage niste noduri din fisierul XML, aplica un predicat pentru a elimina din nodurile selectate, iar apoi construieste un rezultat.
Instructiunile FOR si LET genereaza o lista de noduri extrase din document, mentinand ordinea acestora. Aceasta instructiune este similara cu FROM dintr-un query SQL. Diferenta dintre cele doua instructiuni este faptul ca in cazul instructiunii FOR, variabila var se leaga pe rand la fiecare element din expresia expr, facand posibila iterarea, in timp ce in cazul instructiunii LET, variabila var se leaga la intreaga lista definita de expresia expr, returnand o singura valoare.
Instructiunea ORDER BY defineste ordinea in care sunt considerate elementele extrase de FOR sau LET in cazul in care nu se doreste ordinea in care au fost acestea in documentul XML.
Instructiunea WHERE aplica un predicat (una sau mai multe restrictii) eliminand unele din nodurile extrase de catre FOR sau LET. Aceasta instructiune este echivalentul expresiei WHERE dintr-un query SQL.
Instructiunea RETURN este aplicata asupra fiecarui nod care respecta conditiile impuse prin instructiunea WHERE si seteaza modul de prezentare a rezultatelor obtinute, generand o lista ordonata de noduri la iesire. Aceasta instructiune este echivalentul expresiei RETURN dintr-un query SQL.


2. Exemple

XPath
Comenzi pentru selectarea:
- tuturor nodurilor din xml: /*
- tuturore atributelor din documentul xml: //@*
- tuturor elementelor care au atributul "id" si sunt descendenti ai elementului elem: /elem//*[@id]
- toate elementele care au id-ul > 1000: //*[@id>1000]
- numele tuturor studentilor: //student/nume
- numele celui de-al doilea student: //student[position()=2]/nume
- elementul nume al studentului cu atributul id 1212: //student[@id=1212]/nume
- studentul al carui nume este Popescu: //student[nume="Popescu"]
- sa se returneze primul element student si advisorul lui: //student[1] | //advisor
- din ce grupa face parte studentul cu numele Popescu: /grupa[studenti/student/nume="Popescu"]

XQuery

Scrieti un Xquery care sa returneze titlul si anul aparitiei cartilor care nu sunt publicate de catre Addison-Wesley.
for $a in doc("../XMP/bib.xml")//book
where $a/publisher != "Addison-Wesley"
order by $a/@year
return
{rezultat}
{$a/@year} {$a/title}
{/rezultat}

Scrieti un Xquery care sa returneze titlul si autorii cartilor cu mai mult de 2 autori
for $a in doc("../XMP/bib.xml")//book
where $a/author[1] != $a/author[position()=last()]
order by $a/title
return
{rezultat}
{$a/title} {$a/author}
{/rezultat}

Scrieti un Xquery care sa returneze titlul, autorii, pretul si reviewurile cartilor ce sunt prezente in librarie si pentru care exista reviewuri.
for $a in doc("../XMP/bib.xml")//book,
$b in doc("../XMP/reviews.xml")//entry
where $a/title = $b/title
order by $a/title
return
{rezultat}
{$a/title} {$a/author} {$a/price} {$b/review}
{/rezultat}


3. Cazuri de utilizare:

XPath este utilizat in orice aplicatie care doreste sa lucreze cu elementele unui fisier XML. In limbaje ca XSLT este folosit pentru a naviga prin document si pentru a identifica diferitele elemente din cadrul acestuia pentru a putea fi prelucrate, iar in limbaje ca XQuery este folosit pentru a identifica si a returna diferite componente ale documentului XML. De asemenea este folosit si de catre XLink si XPointer precum si de catre parsere ca XML DOM sau SAX.

XQuery
• Rezultatele care se obtin in urma aplicarii unei expresii XQuery pot fi sortate in functie de unul din elemente
• In cazul in care nu se doreste ca expresia XQuery sa intoarca un nod, ci se doreste sa se intoarca un text, aceasta se poate realiza folosind instructiunea text()
• Daca se doreste ca rezultatul obtinut sa fie un document valid XML sau HTML, aceasta se poate realiza incadrand continutul expresiei XQuery in elementul care se doreste, punand continutul acesteia intre acolade ({})


4. Concluzii

Xpath este un limbaj folosit pentru navigarea prin documentele XML si pentru identificarea si accesarea diferitelor elemente si atribute ale acestuia. Cu ajutorul acestui limbaj se pot regasi foarte usor informatii intr-un document XML. Acest limbaj este extreme de important, el stand la baza altor limbaje, cum ar fi XSLT, XQuery, XLink si XPointer. De asemenea, parserele de XML sunt construite tot pe baza acestui limbaj.

XQuery este un limbaj ce poate fi utilizat pentru extragerea de informatii din documentele XML, generarea de rapoarte, transformarea documentelor XML in XHTML si cautarea in documentele Web a unor informatii relevante. XQuery este compatibil cu diverse standarde W3C, cum ar fi XML, Namespaces, XSLT, XPath, si XML Schema.

duminică, 2 noiembrie 2008

DOM vs SAX

Pentru a retine informatii in mod organizat si interpretabil de catre o masina a fost creat limbajul XML: datele sunt impartite in elemente de informatii, fiecare element fiind incadrat de un tag pentru a fi delimitat de celelalte elemente. Insa nu este de ajuns sa facem arhive cu tot soiul de informatii: memoram respectivele date pentru ca mai avem nevoie de ele si alta data. Pentru a le refolosi trebuie sa le extragem din fisierele XML; acest lucru se realizeaza parsand aceste fisiere, adica extragand informatia utila dintre tag-uri. Cum parsarea presupune rescrierea aceluiasi cod, in ajutorul nostru vin parserele: ele ne ofera o serie de functii cu care extragem elementele si atributele care ne intereseaza.


Doua dintre cele mai folosite parsere de XML sunt DOM si SAX. Desi in final ele realizeaza acelasi lucru (extragerea informatiei dorite), exista deosebiri fundamentale intre cele 2 parsere:


    • DOM (Document Object Model) este bazat pe organizarea documentului sub forma de arbore (de aici si denumirea: din fisierul XML este creat un document modelat dupa forma unui arbore)

      - avantaj: avem modelul deja creat
      - dezavantaj: modelul de arbore poate fi prea complex pentru ce avem nevoie

    • SAX (Simple API for Xml) este bazat pe evenimente: la aparitia tag-ului specificat se declanseaza un eveniment (se executa o metoda desemnata anterior)

      - avantaj: ne putem crea propriul model de document, care poate fi mai simplu decat un arbore
      - dezavantaj: nu putem sti intotdeauna ce vrem sa facem de la prima aparitie a elementului




    • DOM incarca tot fisierul XML in memorie si apoi se plimba prin el

      - avantaj: se poate trece de mai multe ori prin fisier
      - dezavantaj: - se consuma multa memorie, existand posibilitatea sa nu ajunga toata memoria in cazul fisierelor XML mari
      - parsarea dureaza mai mult

    • SAX parseaza fisierul XML pe masura ce vine

      - avantaj: - consum mic de memorie
      - mai rapid
      - dezavantaj: nu ma pot intoarce la informatia deja citita




    • DOM ofera o interfata catre fisierele XML de nivel ridicat

    • SAX ofera acces la fisierele XML la un nivel mai coborat




    • DOM este un standard W3C

    • SAX nu este un standard


In concluzie, DOM este un parser mai complex, care face toata treaba in locul nostru: citeste fisierul XML, creeaza un obiect din acest fisier si ne da o referinta catre acest obiect (un document), pe care putem apoi sa il manipulam dupa cum dorim. SAX in schimb nu face altceva decat sa detecteze prezenta unui anumit tag, in acest caz declansand un eveniment; noi suntem responsabili de interpretarea acestor evenimente, prin crearea unei clasa care sa trateze evenimentele.


Cand utilizam DOM si cand utilizam SAX?



Pe baza celor descrise mai sus voi exemplifica utilizarea unuia sau altuia dintre parsere. Sa presupunem ca avem reprezentate intr-un fisier XML datele despre studentii unei facultati: data personale si situatia scolara. Mai presupunem ca facultatea acorda burse tuturor studentilor cu medii mai mari de 8,50. In acest caz, pentru a afla studentii care primesc bursa este de ajuns sa folosim SAX. Daca insa bursele se acorda pentru un numar fix de studenti, in ordine descrescatoare a mediilor, avem nevoie de DOM, intrucat nu putem sti dintr-o singura parcurgere care student poate primi bursa.