XPath
De la Wikipedia, enciclopedia liberă
XPath (XML Path Language) este un limbaj de expresii utilizat pentru a selecta porţiuni dintr-un document XML, sau pentru a calcula valori (şiruri de caractere, numere, sau valori buleene) pe baza conţinutului unui document XML. Versiunea actuală a limbajului este XPath 2.0, dar cea mai întâlnită versiune în prezent este versiunea 1.0.
Limbajul XPath este structurat pe reprezentarea sub formă de arbore a documentului XML, oferind posibilitatea de a naviga în acest arbore, prin selecţia nodurilor XML care satisfac diferite criterii. În utilizarea frecventă (care nu este o specificaţie oficială), o expresie XPath este deseori numită un XPath.
Motivaţia apariţiei acestui limbaj a fost dorinţa de a folosi aceeaşi sintaxă şi acelaşi model atât pentru XPointer ca şi pentru XSLT, XPath s-a încetăţenit printre programatori ca fiind un mic limbaj de interogare, iar anumite părţi ale sale sunt folosite în specificaţiile W3C pentru XML Schema şi XForms.
Cuprins |
[modifică] Notaţie
Cea mai întâlnită metodă a expresiilor XPath (cea de la care provine şi numele limbajului) este path expression. Un path expression este scrisă ca o secvenţă de paşi pentru a ajunge dintr-un nod XML ('context node'-ul curent) la un alt nod sau un alt set de noduri. Paşii sunt separaţi de caracterul "/" (ex. path). Fiecare pas are trei componente:
- Specificatorul de axe
- Node Test
- Predicat
Există două notaţii - prima, cunoscută ca sintaxa abreviată, este mai compactă şi permite ca XPath-urile sa fie scrise şi citite într-un mod mai intuitiv, şi în multe cazuri, seturi de caractere şi construcţii mai intuitive. Sintaxa completă este mai stufoasă, dar permite specificarea mai multor opţiuni, şi descrierea mai detaliată - în cazul în care se citeşte cu mai multă atenţie.
[modifică] Sintaxa abreviată
Notarea compactă permite mai multe notaţii implicite şi abrevieri pentru cazurile cele mai comune. Cel mai simplu XPath are următoarea formă
/A/B/C
prin care se selectează elementele C care sunt copii elementelor B, care la rândul lor sunt copii elementelor A, care este cel mai cuprinzător element al documentului XML. Sintaxa XPath s-a făcut pentru a simula sintaxa URI (Uniform Resource Identifier) şi sintaxa căilor spre fişiere.
Expresii mai complicate pot fi construite prin specificarea unei axe diferite de axa 'copil' implicită, un nod test diferit de un simplu nume, sau predicate, care sunt scrise între paranteze pătrate pentru fiecare pas. De exemplu, expresia
A//B/*[1]
selectează primul element ('[1]'), oricare ar fi numele lui ('*'), care este copilul ('/') unui nod B, care la rândul său este copilul unui descendent mai cuprinzător ('//') al unui element A, care este copilul nodului contextual curent (expresia nu începe cu '/'). Merită notat că dacă există mai multe elemente B corespunzătoare în document, se va returna un set întreg de primi copii.
[modifică] Sintaxa extinsă
Folsind sintaxa extinsă, cele două exemple s-ar fi scris
/child::A/child::B/child::Cchild::A/descendant-or-self::node()/child::B/child::*[position()=1]
În acest exemplu, la fiecare pas al XPath-ului, axa (e.g. child sau descendant-or-self) este specificată în mod explicit, fiind urmată de :: şi mai apoi de node test, precum A sau node() din exemplul de mai sus.
[modifică] Specificatorii axiali
Specificatorii axiali indică direcţia de navigare din interiorul arborelui care reiese din reprezentarea documentului XML. Axele disponibile, în sintaxa completă sau abreviată, sunt:
- child
- implicit, nu trebuie specificat în sintaxa abreviată
- attribute
@- descendant
- indisponibil în sintaxa abreviată
- descendant-or-self
//- parent
..exemplu punct-punct- ancestor
- indisponibil în sintaxa abreviată
- ancestor-or-self
- indisponibil în sintaxa abreviată
- following
- indisponibil în sintaxa abreviată
- preceding
- indisponibil în sintaxa abreviată
- following-sibling
- indisponibil în sintaxa abreviată
- preceding-sibling
- indisponibil în sintaxa abreviată
- self
.exemplu punct- namespace
- indisponibil în sintaxa abreviată
Ca exemplu de folosire a axei attribute din sintaxa abreviată, //a/@href selectează un atribut numit href dintr-un element a element oriunde în arborele documentului. Axa self este cel mai des folosită în interiorul unui predicat pentru a face referire la nodul curent selectat. Ca exemplu, h3[.='Vezi şi'] selectează un element numit h3 din contextul curent, al cărui conţinut este Vezi şi.
[modifică] Testarea nodurilor
Verificarea nodurilor se poate face fie prin specificarea numelui nodurilor sau prin intermediu unor expresii mai generale. În cazul documentelor XML în care prefixul domeniilor de nume gs a fost definit, //gs:enquiry va găsi toate elementele enquiry din domeniul de nume, iar //gs:* va găsi toate elementele, indiferent de numele local, din domeniu de nume.
Alte formate de testări ale numelor de noduri sunt:
- comment()
- găseşte un nod comentariu, ex.
<!-- Comment --> - text()
- găseşte toate nodurile de tip text, ex. the
helloîn<k>hello</k> - processing-instruction()
- găseşte toate instrucţiunile de preprocesare XML, precum
<?php echo $a; ?>. În acest caz,processing-instruction('php')va fi o protrivire. - node()
- găseşte toate nodurile de orice tip.
[modifică] Predicate
Expresii cu diferite nivele de complexitate pot fi definite prin intermediul parantezelor pătrate, care trebuie îndeplinite înainte ca nodul să fie identificat printr-un XPath. Spre exemplu //a[@href='help.php'], care va identifica un element a cu un atribut href a cărui valoare este help.php.
Nu există o limită pentru numărul de predicate de la un pas, şi nu sunt mărginite la ultimul pas al unui XPath. Pot fi de asemenea imbricate pe câte nivele este necesar. Căile specificate în predicate încep de la contextul pasului curent şi care nu alterează acel context. Toate predicatele trebuie satisfăcute pentru a exista o potrivire.
Când //a[/html/@lang='en'][@href='help.php'][1]/@target este aplicat unui documenti XHTML, va selecta valoare atributului target a primului element a care are atributul href definit ca având valoarea help.php, pentru un document cu un element html de cel mai înalt nivel care are şi atributul lang setat ca fiind en. Referinţa către un atribut al unui element de cel mai înalt nivel din primul predicat nu afectează nici contextul altor predicate şi nici localizarea pasului respectiv.
Ordinea predicatelor este totuşi importantă. Fiecare predicat 'filtrează' pasul unei locaţii node-set pentru nodul selectat în ordine. //a[1][/html/@lang='en'][@href='help.php']/@target va găsi o potrivire dacă primul element a într-un document @lang='en' care satisface şi @href='help.php'
[modifică] Funcţii şi operatori
XPath 1.0 defineşte patru tipuri de date: node-sets (grupuri de noduri lipsite de o ordine intrinsecă), şiruri, numere şi booleene.
Operatorii disponibili sunt:
- Operatorii "/", "//" şi "[...]" utilizaţi pentru căile expresiilor, după cum este descris mai sus.
- Operatorul de unificare, "|", utilizat pentru unificarea a două grupuri de noduri.
- Operatorii booleeni "and" şi "or", precum şi funcţia "not()"
- Operatorii aritmetici "+", "-", "*", "div" (împărţire) şi "mod" (restul împărţirii)
- Operatori de comparaţie "=", "!=", "<", ">", "<=", ">="
Biblioteca de funcţii include şi:
- Funcţii pentru manipularea şirurilor de caractere: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- Funcţii pentru manipularea numerelor: sum(), round(), floor(), ceiling()
- Funcţii pentru obţinerea proprietăţilor nodurilor: name(), local-name(), namespace-uri()
- Funcţii pentru obţinerea informaţiilor despre contextul de procesare: position(), last()
- Funcţii de conversie a tipului: string(), number(), boolean()
Cele mai folosite în mod curent sunt prezentate mai jos. Pentru mai multe detalii, vezi - documentul cu recomandări al consoräiului W3C
[modifică] Funcţiile de setare a nodurilor
- position()
- întoarce un număr care reprezintă poziţia acestui nod în secvenţa de noduri care sunt procesate în mod curent (spre exemplu, nodurile selectate printr-un xsl: instrucţiunea for-each din XSLT).
- count(node-set)
- întoarce numărul de nodurilor din comanda node-set care a este furnizată ca argument al său.
[modifică] Funcţiile şiruri de caractere
- string(object?)
- converteşte oricare dintre cele patru tipuri de date XPath la un şir de caractere, conform regulilor predefinite. Dacă argumentul este node-set, funcţia returnează primul nod din document, în format şir de caractere, ignorând restul nodurilor.
- concat(string, string, string*)
- concatenează şiruri de caractere
- contains(s1, s2)
- întoarce
truedacăs1conţines2 - normalize-space(string?)
- toate spaţiile de la începutul sau sfârşitul unei secvenţe sunt eliminate, iar spaţiile multiple sunt înlocuite cu un singur spaţiu. Această funcţie este foarte utilă când documentul original XML este formatat pentru a fi lizibil, ceea ce ar putea duce la un caracter nesigur al procesării şirurilor de caractere.
[modifică] Funcţiile booleene
- not(boolean)
- neagă orice expresie booleeană
- true()
- evaluează cu adevărat.
- false()
- evaluează cu fals.
[modifică] Funcţiile numerice
- sum(node-set)
- prin convertirea valorilor şirurilor de caractere ale nodurile găsite de XPath în numere, întoarce suma acestor numere.
Expresiile pot fi create în interiorul predicatelor folosindu-se operatorii : =, !=, <=, <, >= şi >. Expresiile buleene pot fi combinate între paranteze () sau între and şi or ca şi între funcţia not() descrisă mai sus. Calculele numerice pot folosi *, +, -, div şi mod. Şirurile de caractere pot consta în orice caractere de tip Unicode.
În interiorul şi în exteriorul predicatelor, node-set-uri întregi pot fi combinate, prin folosirea caracterului pipe |.
v[x or y] | w[z] va întoarce un singur node-set care conţine toate elementele v care au elementele copii x sau y, precum şi toate elementele w care au elementele copii z, găsite în contextul curent.
//item[@price > 2*@discount] selectează item-urile al căror atribut de preţ este de cel puţin două ori valoarea numerică a atributului discount.
[modifică] XPath 2.0
XPath 1.0 a fost publicat ca recomandare W3C pe 16 noiembrie 1999; XPath 2.0 a fost publicat ca recomandare W3C pe 23 ianuarie 2007. XPath 2.0 reprezintă o creştere semnificativă atât cantitativă cât şi a capabilităţii limbajului XPath.
Cea mai semnificativă schimbare este aceea că XPath 2.0 are un multe tipuri; XPath 2.0 suportă tipuri atomice, definite ca tipuri native definite sub forma XML Schema, şi poate să folosească şi tipuri definite de utilizator dintr-un schema. Fiecare valoare este acum o secvenţă (o singură valoare atomică sau un nod este văzut drept o secvenţă de lungime unu). Node-set-urile din XPath 1.0 sunt înlocuite de secvenţe de noduri, care pot fi în orice ordine.
Pentru a putea suporta mai multe tipuri, XPath 2.0 oferă un număr sporit de funcţii şi operaţii.
XPath 2.0 este un subset al XQuery 1.0. Oferă suport pentru expresii for, care este o versiune simplificată a expresiilor "FLWOR" din XQuery. Este posibil să descrii limbajul prin părţile de XQuery pe care nu le include: principalele exemple sunt interogările prolog, constuctorii de elemente şi atribute, restul de sintaxă "FLWOR", şi de expresii typeswitch.
[modifică] Exemplu
Dat fiind exemplul de document XML
<?xml version="1.0" encoding="utf-8"?> <wikimedia> <projects> <project name="Wikipedia" launch="2001-01-05"> <editions> <edition language="English">en.wikipedia.org</edition> <edition language="German">de.wikipedia.org</edition> <edition language="French">fr.wikipedia.org</edition> <edition language="Polish">pl.wikipedia.org</edition> </editions> </project> <project name="Wiktionary" launch="2002-12-12"> <editions> <edition language="English">en.wiktionary.org</edition> <edition language="French">fr.wiktionary.org</edition> <edition language="Vietnamese">vi.wiktionary.org</edition> <edition language="Turkish">tr.wiktionary.org</edition> </editions> </project> </projects> </wikimedia>
Expresia XPath
/wikimedia/projects/project/@name
selectează atributele numelor pentru toate proiectele şi
/wikimedia/projects/project/editions/edition[@language="English"]/text()
selectează adresele tuturor proiectelor în engleză ale Wikimedia (textul pentru toate elementele edition în care atributul language este egal cu English), iar următorul
/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()
selectează toate adresele tuturor Wikipediilor (textul tutuor elementelor edition care există sub elementul project cu un nume de atribut Wikipedia)
[modifică] Implementări
- Implementări pentru motoare de baze de date
- Jaxen is an Open Source XPath implementation supporting (embedded by) multiple XML parsers (XOM, Dom4J, JDom).
- Apache Xalan-Java supports XPath 1.0 (as well as XSLT 1.0)
- Saxon supports XPath 1.0 and XPath 2.0 (as well as XSLT 1.0, XSLT 2.0, and XQuery 1.0)
- VTD-XML [2]
- Sedna XML Database Both XML:DB and proprietary.
The Java package Format:Javadoc:SE has been part of Java standard edition since Java 5. Technically this is an XPath API rather than an XPath implementation, and it allows the programmer the ability to select a specific implementation that conforms to the interface.
- JQuery (Basic support)
- In the System.Xml and System.Xml.Xpath namespaces [3]
- VTD-XML [4]
- Sedna XML Database
- XML::LibXML (based upon libxml2)
- XML::XPath
- HTML::TreeBuilder::XPath ( Parse Non-strict HTML with XPath )
- PyXML
- libxml2
- lxml (based upon libxml2, aims to be more pythonic than default libxml2 bindings)
- ElementTree (small subset only)
- 4Suite
- Amara
- Sedna XML Database
[modifică] Utilizare XPath în limbajele Schema
XPath is increasingly used to express constraints in schema languages for XML.
- The (now ISO standard) schema language Schematron pioneered the approach.
- A streaming subset of XPath is used in W3C XML Schema for expressing uniqueness and key constraints.
- XForms uses XPath to bind types to values.
- The approach has even found use in non-XML applications, such as the constraint language for Java called PMD: the Java is converted to a DOM-like parse tree, then XPaths rules are defined over the tree.
[modifică] Vezi şi
[modifică] Legături externe
- XPath 1.0 specification
- XPath 2.0 specification
- What's New in XPath 2.0
- XPath JavaScript implementation
- Another tutorial - with lots of examples
- Free Visual XPath Expression Builder
- Practice XPath queries
- XPath Visualizer - run queries on your own XML
- Another Site to Practice XPath queries
- Laborator de XPath de la Facultatea de Calculatoare
- TinyXpath- XPath implementation in c++