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.

2 comentarii:

  1. asta pentru ca este mult text si probabil n-ai avut rabdare sa-l citesti pe tot..
    dar daca as fi taiat din articol as fi omis lucruri importante si poate si interesante despre acest subiect..
    iti recomand sa-l parcurgi cand vei avea mai mult timp la dispozitie, sau in sesiune, cand vei avea nevoie de cunostintele continute de acest articol..

    RăspundețiȘtergere