XPATH
Xpath è un linguaggio per effettuare ricerche all’interno di un documento xml, consentendoci dunque di navigare tra elementi e attributi usando espressioni di percorso.
Esso include ltre 100 funzioni predefinite , che operano su valori di stringa, valori numerici,confronto di date, nodi ,valori booleani ecc.
La conoscenza di Xpath è necessaria per creare documenti XLT , un linguaggio anche esso w3c Standard, che ci consente di trasformare documenti xml in pagine xhtml, esso utilizza xpath per navigare tra gli elementi di un documento xml.
TERMINOLOGIA
Nodi:
Xpath considera diversi tipi di nodi,quali:elementi,attributi,testo,namespace,istruzioni di processo,commenti, nodi documento, o root.
I documenti XML possono essere trattati come alberi di nodi.
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<libreria>
<libro>
<anno>2007</anno>
<prezzo>gratis</prezzo>
</libro>
<libro>
<anno>2008</anno>
<prezzo>molto</prezzo>
</libro>
</libreria>
Osservando l’XML di esempio qui riportato possiamo distinguere:
| <libreria> |
È la root del nostro documento XML |
Atomic Values
sono quei nodi che non hanno parents e childrens. Sono i valori dei nodi e degli attributi
Ad esempio: il valore del nodo <autore> è “Anastasi Fabrizio”e il valore dell’attributo “Lingua” è “it”
Items
Possono essere atomic values o nodes
Relazione tra i nodi:
Parent:
<libro>
<anno>2007</year>
<prezzo>gratis</prezzo>
</libro>
nell’esempio quì riportato il nodo “libro” è il nodo parent del nodo “titolo”
Children:
Il nodo “titolo” è il nodo children del nodo “libro”
Sibling:
Nodi che hanno lo stesso Parent
Ancestor:
Si definisce Ancestor di un nodo : il suo parent , il parent del suo parent ecc.
Descendants:
Si definisce descentants di un nodo , i suoi nodi children, i childrens dei suoi nodi childrens ecc.
ESPRESSIONI DI PERCORSO:
Nella tabella seguente vengono presentate alcune delle espressioni più comuni utilizzate in XPATH:
| Espressione |
: Descrizione |
| Nome del Nodo |
: Crea una lista di tutti i nodi children, del nodo indicato |
| / |
: Seleziona a partire dalla root |
| // |
: Seleziona tutti i nodi a partire dal nodo indicato |
| . |
: Seleziona il nodo indicato |
| .. |
: Seleziona il parent del nodo indicato |
| @ |
: Seleziona gli attributi |
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<libreria>
<libro>
<anno>2007</anno>
<prezzo>gratis</prezzo>
</libro>
<libro>
<anno>2008</anno>
<prezzo>molto</prezzo>
</libro>
</libreria>
Adesso tenendo presente questo Documento XML proviamo a costruire le nostre espressioni di percorso usando la sintassi XPath e testiamole in Flash cs3 o flex usando la libreria XPath-AS3 reperibile al seguente indirizzo http://code.google.com/p/xpath-as3/.
Essa è una libreria Open source rilasciata sotto la licenza BSD.
Dopo aver scaricato il file zippato contenente la libreria, lo scompattiamo nella cartella del nostro progetto.
Ed estraiamo la cartella memorphic, copiandola nella stessa root contenente il nostro file .fla
quindi importiamo le librerie di classi scrivendo nel primo frame il seguente codice:
import memorphic.xpath.*;
import memorphic.utils.*;
import memorphic.parser.*;
Carichiamo il nostro documento xml scrivendo:
inizializziamo la variabile di tipo stringa “strQuery “ che conterrà la nostra query
istanziamo un oggetto della classe importata “XpathQuery” passandogli come parametro il valore della variabile “strQuery”
infine eseguiamo la nostra espressione di percorso sul nostro documento XML
var strQuery:String=”/libreria/libro[anno>2007]/titolo”
var myQuery:XPathQuery = new XPathQuery(strQuery);
var myxmllist:XMLList=myQuery.exec(myXML);
trace(myxmllist);
}
in questo esempio chiediamo mediante xpath di estrarre i titoli dei libri il cui anno di pubblicazione è superiore al 2007
il codice completo è il seguente:
import memorphic.xpath.*;
import memorphic.utils.*;
import memorphic.parser.*;
var myXML:XML = new XML();
var XML_URL:String = “myxml.xml”;
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener(”complete”, xmlLoaded);
function xmlLoaded(event:Event):void {
myXML = XML(myLoader.data);
var strQuery:String=”/libreria/libro[anno>2007]/titolo”
var myQuery:XPathQuery = new XPathQuery(strQuery3);
var myxmllist:XMLList=myQuery.exec(myXML);
trace(myxmllist);
}
in base a quanto detto, adesso per verificare la compatibilità della libreria xpath-as3 con lo standard W3C possiamo fare riferimento alla seguente tabella
dove sono riportati diversi esempi di path expressions in xpath che possiamo testare nel nostro FLA sostituedoli al contenuto della varibile di tipo stringa “strQuery”
| Path Expressions |
: Risultato |
| /libreria/libro[0] |
: Seleziona il primo nodo libro figlio del nodo libreria |
| /libreria/libro[last()] |
: Seleziona l’ultimo elemento libro figlio del nodo libreria |
| /libreria/libro[last()-1] |
: Seleziona il penultimo elemento libro figlio del nodo libreria |
| /libreria/libro[position()<3] |
: Seleziona i primi 2 libri figli del nodo libreria |
| //titolo[@lingua] |
: Seleziona tutti gli elementi tiolo il cui attributo è ‘lang’ |
| //title[@lingua=’it’] |
: Seleziona tutti gli elementi tiolo il cui attributo è ‘lang’ e il valore è ‘it’ |
| /libreria/libro[prezzo>40] |
: seleziona tutti i nodi libro del nodo libreria che il cui nodo figlio prezzo è >40 |
| /bookstore/book[prezzo>35.00]/titolo |
: Seleziona tutti i titolidei nodi libro figlio del nodo libreria il cui prezzo è >40 |
Selezione di nodi sconosciuti
Le seguenti wildcards possono essere usate per selezionare elementi XML sconosciuti
| Wildcard |
: Descrizione |
| * |
: Seleziona ogni nodo elemento |
| @* |
: Seleziona ogni nodo attributo |
| node() |
: Seleziona ogni tipo di nodo |
Esempi:
Nella tabella che segue vediamo alcune espressioni di percorso e il risultato che si ottiene
| Path Expressions |
: Risultato |
| /libreria/* |
: Seleziona tutti i nodi children del nodo “libreria” |
| //* |
: Restituisce tutti gli elementi nel documento |
| //titolo[@*] |
: Seleziona tutti i nodi “titolo” che hanno un attributo |
Uso degli operatori logici
Usando l’operatore logico | in una query XPath
Examples
| Query String |
: Risultato |
| //libro/titolo | //libro/prezzo |
: Selezioan tutti i titoli e glie elementi prezzo del nodo libro |
| //titolo | //prezzo |
: Seleziona tutti i nodi titolo e i nodi prezzo del documento |
| /libreria/libro/titolo | //prezzo |
: Seleziona tutti i titoli del nodo libro che stà sotto il nodo libreria e tutti i nodi prezzo |
La librreria xpath-as3 contiene inoltre la classe XpathContext che ci consente di definire , namespaces , funzioni personalizzate e variabili, da usare nelle nostre path expressions in Xpath, creando un istanza della classe XpathContext , la possiamo passare come parametro al costruttore di tutte le nostre XpathQuery.
Vediamo un esempio:
The XPathContext object
//creiamo un istanza della classe XPathContextvar
context:XPathContext = new XPathContext();
//dichiariamo un
namespacecontext.namespaces[”ns1″] = “http://domain.com/2006/ns1″;
// definiamo una variabile personalizzatacontext.variables[”myCustomVar”] = true;
// passiamo l’oggetto contex come parametro al costruttore della nosta XPathQueryvar
myQuery:XPathQuery = new XPathQuery(”libreria/libro”, context);
Approfondimenti su Internet
Per maggiori approfondimenti sulle specifiche XPath del W3C consiglio di visitare il seguente indirizzo http://www.w3schools.com/xpath/default.asp nel quale troverete il tutorial XPath del W3C.
A questo indirizzo http://www.w3.org/TR/xpath#corelib Troveremo le raccomandazioni W3C sul linguaggio.
Al seguente indirizzo http://www.zvon.org/xxl/XPathTutorial/General/examples.html si possono trovare esempi sull’utilizzo avanzato di XPath, in particolare sull’utilizzo delle funzioni predefinite , definite dalle specifichedel W3C.
Quì possiamo trovare degli esampi interattivi http://www.zvon.org:9001/saxon/cgi-bin/XLab/XML/extras.html?stylesheetFile=XSLT/xpath.xslt&lang=eng
Per alcuni degli esempi sopra descritti possiamo fare a meno di XPath essendo il parsing XML di AS3 conforme alo standard E4X.
Nel codice seguente possiamo vedere un implementazione delle’esempio precedente usando E4X invece di XPath
var myXML:XML = new XML();
var XML_URL:String = “calendar.xml”;
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener(”complete”, xmlLoaded);
function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
var mxm:XMLList=((myXML.libreria.Libro.(@anno>2007).titolo))
trace (checknode(mxm))
}
Concludendo , nonostante molte cose che si potevano fare con XPath adesso possono essere implementate con la sintassi E4X di As3, rimangono pur sempre delle sostanziali differenze, inanzitutto E4X concettualmente è qualcosa di diverso da XPath, infatti E4X sta per ECmascript for XML, significa che il Parsing XML, dei linguaggi conformi allo standard ECmascript come Javascript, Actionscript 3,è conforme allo standard E4X , di cui potete scaricare il documento pdf al seguente indirizzo:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf.
Dall’altro lato lXpath consente di effettuare ricerche più complesse all’interno di un xml, estendendo le capacità di manipolazione di documenti xml in AS3