Newest Viewed Downloaded

XPath (XML Path Language) Laurea Magistrale in Informatica Reti 2 (2005/06)dott. Francesco De Angelis francesco.deangelis@unicam.it

XPath (XML Path Language) Laurea Magistrale in Informatica Reti 2 (2005/06)

dott. Francesco De Angelis francesco.deangelis@unicam.it

Agenda

Location Path e Location Step Assi Test di nodo Predicati (o filtri) Operatori e funzioni nei filtri Precisazioni Molti esempi…

XPath

XPath è un linguaggio che permette di indirizzare parti di un documento XML XPath è una parte fondamentale di XSLT e di altre specifiche come XLink XPath opera sulla struttura logica del documento, non su quella sintattica, usando una sintassi non XML accettabile all’interno di URI e attributi XPath dispone anche di primitive per eseguire semplici operazioni su stringhe, numeri e valori booleani

Il documento secondo XPath

Dal punto di vista di XPath, il documento XML è un albero Ogni elemento, commento, attributo, PI o stringa di testo (non-markup) è un nodo dell’albero Le relazioni tra i nodi sono semplici: Un elemento annidato è un nodo figlio (child node) dell’elemento che lo contiene Commenti, PI e testo sono figli dell’elemento che li contiene (o del documento) I nodi attributo e dei namespace non sono considerati child dei loro parent

Location Path e Location Step

Il Location Path specifica come spostarsi tra i nodi dell’albero Un Location Path è composto di una sequenza di passi di locazione (Location Step) separati da ‘/’, e letti da sinistra a destra. Ogni termine individua più precisamente un frammento della risorsa individuata in precedenza. Un location step ha tre parti: Un asse Un test di nodo Zero o più predicati axis::test[pred1][pred2]…[pred N]

Gli Assi

L’asse è un insieme di nodi Muovendosi sull’albero del documento, XPath permette di scegliere non solo tra i figli del nodo corrente, ma anche tra una serie di altri insiemi di nodi che sono in relazione con esso Gli assi identificano la direzione rispetto alla struttura del documento in cui andare a cercare l’oggetto da restituire rispetto al nodo contesto (NC) L’asse child degli elementi figli diretti è l’asse predefinito

Gli Assi

self Contiene il nodo corrente child Contiene gli elementi direttamente annidati nel contesto parent Contiene il padre dell’elemento corrente attribute Contiene gli attributi del nodo corrente ancestor Contiene il padre del nodo, il padre del padre, ecc… ancestor-or-self Come ancestor, ma contiene anche il nodo corrente

Gli Assi

descendant Contiene tutti gli elementi annidati nel nodo corrente (con livello di annidamento arbitrario) descendant-or-self Come descendant, ma contiene anche il nodo corrente following Contiene tutti i nodi che si trovano dopo quello corrente all’interno del documento, esclusi i discendenti, gli attributi del nodo e i namespaces following-sibling Contiene tutti i nodi che hanno lo stesso livello di nidificazione nell’elemento padre di quello corrente e sono posti dopo di esso (“fratelli”)

Gli Assi

preceding Contiene tutti i nodi che si trovano prima quello corrente all’interno del documento, esclusi i suoi antenati (ancestors), gli attributi del nodo e i namespaces preceding-sibling Contiene tutti i nodi che hanno lo stesso livello di nidificazione nell’elemento padre di quello corrente e sono posti prima di esso namespace Contiene i nodi namespace dichiarati per l’elemento corrente.

Un esempio di alcuni assi

/ R S P I B I S S P P P B P P P P P P S P I P Asse self:: Asse parent:: Asse preceding-sibling:: Asse following-sibling:: Asse child:: Asse ancestor:: Asse preceding:: Asse following:: Asse descendant::

Le gerarchie secondo XPath

ancestor: [c,a] ancestor-or-self: [d,c,a] attribute: [x] child: [f] descendant: [f,g] descendant-or-self: [d,f,g] following: [i,h] following-sibling: [i] namespace: [y] parent: [c] preceding: [b,e] preceding-sibling: [e] self: [d] Nodo Corrente

I Tipi

I tipi di nodo sono: radice elemento attributo testo namespace commento processing-instruction Ogni asse ha un tipo predefinito se l’asse contiene elementi, il tipo predefinito è “elemento” se l’asse non contiene elementi ma attributi, il tipo predefinito è “attributo” se l’asse non contiene elementi ma namespace, il tipo predefinito è “namespace”

Sintassi abbreviata

In alcuni casi esistono delle forme abbreviate usabili invece della sintassi completa: Child::x si può abbreviare con x Attribute::a si può abbreviare con @a Descendant si può abbreviare con ‘//’, self con ‘.’, parent con ‘..’ Esempi: /doc/chapter[5]/section[2]: la seconda sezione del quinto capitolo del documento ./chapter//para: tutti i para discendenti a qualunque livello di ogni nodo chapter figlio del NC //para: tutti i para discendenti a qualunque livello della radice del documento

Test di nodo (node test)

Per individuare un particolare nodo su un asse, si usano il suo tipo e/o il suo nome tramite i cosiddetti node test. Nel caso si lavori su un insieme di nodi, tutte le operazioni vengono applicate iterativamente a ciascun nodo Il risultato è un insieme di nodi, ciascuno dei quali può essere ulteriormente attraversato Il test può essere: Un nome: vero se il nodo (elemento o attributo) ha quel nome text(), processing-instruction(), comment(): vero se il nodo è di tipo testo, processing instruction o commento. node(): vero sempre * : vero per tutti i nodi del tipo definito dall’asse

I Nomi

Alcuni nodi possiedono anche un loro nome: I nodi elemento e attributo hanno il nome dell’elemento e dell’attributo stessi Per indicare il nodo con un particolare nome, si usa semplicemente il nome stesso come test Lo speciale test ‘*’ fa match con tutti i nodi accessibili sull’asse, con qualunque nome I test restituiscono l’insieme dei nodi con quel particolare nome presenti sull’asse

I Predicati

I predicati in XPath corrispondono a dei filtri sull’insieme dei nodi selezionandone una parte secondo particolari criteri Il risultato di un filtro è l’insieme dei nodi filtrati In ciascuno step si possono inserire un numero arbitrario di filtri, che vengono richiamati nell’ordine in cui si presentano I filtri vanno posti nello step sempre dopo il node test

I Predicati

All’interno del filtro si possono usare espressioni che abbiano valore booleano L’espressione del filtro viene valutata usando ciascun nodo del set come contesto, e se vale true il nodo viene aggiunto all’insieme dei risultati Esistono due eccezioni: Se l’espressione restituisce un numero, viene selezionato il nodo in quella posizione nell’insieme (gli insiemi di nodi sono ordinati) Se l’espressione restituisce un insieme di nodi, allora vale true se l’insieme non è vuoto.

Operandi nei Filtri

All’interno dei filtri si possono usare espressioni XPath operandi: Espressioni XPath (compresi altri filtri nidificati!), che vengono valutate usando come contesto ciascun nodo dell’insieme di input Il “valore” di una espressione XPath, se usata con operatori di confronto, è il testo in essa contenuto (valore dell’attributo o testo all’interno dell’elemento). Se l’espressione è un insieme, XPath restituisce true se c’è almeno un suo elemento che soddisfi il test. Costanti numeriche o stringhe tra virgolette

I Filtri - Esempi

/collection/album[title = “Supernatural”]/@ID gli ID di ogni album nella collection che abbia un (figlio) title contenente il testo “Supernatural”. /collection/album[@ID = “123”] tutti gli album nella collection con ID uguale a “123”. /collection/song[ @album =//album[title =“Supernatural”]/@ID ]/title i titoli di tutte le song nella collection che hanno un attributo album uguale all’ID di uno degli elementi album (presenti in qualunque punto tra i discendenti del contesto corrente) che hanno come title “Supernatural”.

</song> <song> <title/> </song> <album> <title/> </album> <album> <title/> </album> <song> <title/> </song> <song> <title/> </song> collection/song <album> <title/> </album> <album> <title/> </album> //album <album> <title/> </album> //album[title=“S”] <song> <title/> </song> collection/song[…] <title/> collection/ song[…]/ title /collection/song[@album = //album[title = “S”]/@ID]/title <!-- google_ad_section_end --> </td> <td class="slideBoxRight"></td> </tr> <tr class="slideBoxBottomRow"> <td class="slideBoxBottom"></td> <td class="slideBoxCorner"></td> </tr> </table> </div> </div> </div> <div id="HorizontalAd" class="hidden horizontalAd verticalSpaceAfter newHorizontalAd2"> <script type="text/javascript"> <!-- google_ad_client = "pub-8495673564975419"; /* 2010 Utmanare 6 Presentation Second */ google_ad_slot = "8453565324"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> </div> <div id="AllOtherSlideRows" class="hidden"></div> </div> </td> <td> <div id="RightColumnWrapper" style="width:300px"> <div id="InnerRightColumnWrapper"> <a href="http://www.slideexecutive.com/xPoint/download" target="_top" id="xPointDownloadLink" alt="SlideExecutive xPoint - download for free"></a> <div> <div class="boxHeader" style="white-space: nowrap;"> <h2> <span class="boxHeaderInfo">Showing 1 - 20 of 40 items </span> Details </h2> </div> <div class="greenBody"> <fieldset> <div class="detailRow"> <div class="detailColumn1">Name: </div> <div class="detailColumn2" title="[4] XPath">[4] XPath</div> </div> <div class="detailRow"> <div class="detailColumn1">Author: </div> <div class="detailColumn2">. 2004</div> </div> <div class="detailRow"> <div class="detailColumn1">Company: </div> <div class="detailColumn2" title=". 2004">. 2004</div> </div> <div class="detailRow"> <div class="detailColumn1">Description: </div> <div class="detailColumn2">XPath (XML Path Language) Laurea Magistrale in Informatica Reti 2 (2005/06)dott. Francesco De Angelis francesco.deangelis@unicam.it</div> </div> <div class="detailRow"> <div class="detailColumn1">Tags: </div> <div class="detailColumn2">tappa | album | song | nodo | biglietto | xpath | roma | 2005</div> </div> <div class="detailRow"> <div class="detailColumn1">Created: </div> <div class="detailColumn2">1/29/2006 5:51:29 PM</div> </div> <div class="detailRow"> <div class="detailColumn1">Slides: </div> <div class="detailColumn2">40</div> </div> <div class="detailRow"> <div class="detailColumn1">Views: </div> <div class="detailColumn2">20</div> </div> <div class="detailRow"> <div class="detailColumn1">Downloads: </div> <div class="detailColumn2">0</div> </div> <div class="detailRow"> <div class="detailColumn1">Rating: </div> <div class="detailColumn2"> 0 </div> </div> </fieldset> <br /><br /> <div style="text-align:center"> </div> <div class="clear" style="border-top: 1px solid #96C957; margin:10px 0"></div> <fieldset> <span class="left spacingRight"> <a id="Dl2_20543686" href="http://www1.cs.unicam.it/insegnamenti/reti_2008/Lists/Tasks/Attachments/11/[4] XPath.ppt" class="downloadLink dlTracking" rel="nofollow" title="Download presentation"></a> </span> <span class="left spacingRight"> <a class="embed" href="javascript:detail_showEmbedInstructions();" title="Embedd presentation" ></a> </span> <span class="left spacingRight"> <a class="addFavorite" title="Add to Favorites" onclick="javascript: g_saveFavoritePresentation();"></a> </span> <span class="left"> <a id="PresentationPlayButton" title="Play Presentation" onclick="javascript: PresentationPlay.Init(20543686)">></a> </span> <span class="right"><a id="Comment_20543686" class="internalDiscrete commentLink right" title="Comment this presentation">Comment</a></span> <br /> <br /><br /><br /> <span id="shareThisPresentaitonTitle" class="clear">Share this presentation</span> <br /> <span id="shareBox"> <span class="addthis_toolbox" style="padding-bottom: 1px;"> <a class="addthis_button_google_plusone" title="Google Plus" rel="nofollow"></a> <a class="addthis_button_twitter" title="Twitter" rel="nofollow"></a> <a class="addthis_button_facebook" title="Facebook" rel="nofollow"></a> <a class="addthis_button_linkedin" title="LinkedIn" rel="nofollow"></a> <a class="addthis_button_myspace" title="MySpace" rel="nofollow"></a> <a class="addthis_button_stumbleupon" title="StumbleUpon" rel="nofollow"></a> <a class="addthis_button_digg" title="Digg" rel="nofollow"></a> <a class="addthis_button_blogger" title="Blogger" rel="nofollow"></a> <span class="addthis_separator">|</span> <a class="addthis_button_expanded addthisMore left" title="More" rel="nofollow"></a> </span> </span> </fieldset> </div> </div> <script type="text/javascript" defer="defer" src="http://s7.addthis.com/js/250/addthis_widget.js?pub=slidefinder"></script> </div> </div> <div class="clear"></div> </td> </tr> <tr> <td></td> <td> <div class="horizontalAd newHorizontalAd2" id="FooterAd"> <script type="text/javascript"> <!-- google_ad_client = "pub-8495673564975419"; /* 2010 Utmanare 5 Presentation Second */ google_ad_slot = "2069150731"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script> </div> </td> </tr> <tr> <td></td> <td> <div class="paging"> <a href="/x/xpath_xml_path_language_laurea/b4dxpath/20543686" class="current">1</a><a href="/x/xpath_xml_path_language_laurea/b4dxpath/20543686/p2">2</a> <a href="/x/xpath_xml_path_language_laurea/b4dxpath/20543686/p2" class="nav">Next >></a> </div> <div class="clear"></div> <div id="CommentsWrapper"> <div class="boxHeader commentBoxHeader"> <h2 id="20543686"> <span class="right"></span>Comments <a class="rssLinkBorder" href="/rss/comment/20543686"><span class="rss"></span></a> </h2> </div> <div id="CommentBody"> <ul> <!-- Here comments are loaded via ajax --> </ul> <button id="LoadComments" type="button" class="hidden">Load more comments</button> <p id="LoadingComments" class="hidden">Loading...</p> <span id="NoMoreComments" class="hidden"><a class="internalDiscrete commentLink" title="No comments - Be the first to comment!">No comments - Be the first to comment!</a></span> </div> </div> <script type="text/javascript"> addInitMethod('InitComments'); </script> </td> </tr> </table> <div class="clear"></div> <div id="EmbedDiv" class="dialog" style="display: none;"> <p> <a href="#" class="internal copyEmbedCode">Copy</a> the following code to your webpage or blog to embed this presentation: </p> <p class="discrete"> <a href="http://www.slidefinder.net/x/xpath_xml_path_language_laurea/b4dxpath/20543686" class="slidefinder">[4] XPath</a> </p> <p class="discrete"> <script type="text/javascript" src="http://www.slidefinder.net/scripts/embedded.js"></script> </p> </div> <div id="EmbedCopyCodeDiv" style="display: none;"><a href="http://www.slidefinder.net/x/xpath_xml_path_language_laurea/b4dxpath/20543686" class="slidefinder">[4] XPath</a> Det3 <script type="text/javascript" src="http://www.slidefinder.net/scripts/embedded.js"></script> </div> <div class="clear"></div> <div> <h2 style="padding: 0 0.5em 0 0; float: right;" class="clear">Share this presentation:</h2> </div> <div style="float:right;" class="clear"> <div class="addthis_toolbox" style="padding-bottom: 1px;"> <a class="addthis_button_google_plusone" title="Google Plus" rel="nofollow"></a> <a class="addthis_button_twitter" title="Twitter" rel="nofollow"></a> <a class="addthis_button_facebook" title="Facebook" rel="nofollow"></a> <a class="addthis_button_linkedin" title="LinkedIn" rel="nofollow"></a> <a class="addthis_button_myspace" title="MySpace" rel="nofollow"></a> <a class="addthis_button_stumbleupon" title="StumbleUpon" rel="nofollow"></a> <a class="addthis_button_digg" title="Digg" rel="nofollow"></a> <a class="addthis_button_blogger" title="Blogger" rel="nofollow"></a> <span class="addthis_separator">|</span> <a class="addthis_button_expanded addthisMore" title="More" rel="nofollow"></a> </div> <script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js?pub=slidefinder"></script> </div> <span id="trackId" data-text="20543686"></span> <span id="codeCopiedText" data-text="Code copied to clipboard."></span> <script type="text/javascript">addInitMethod('slideTypeWithAd');</script> <div class="clear"></div> <div id="Footer"> <div id="FooterLinks" class="mainLinks"> <div class="section"> <h4>Learn about us</h4> <p><a href="/info/aboutus" class="internalDiscrete" rel="nofollow">About us</a></p> <p><a href="/blog" class="internalDiscrete" rel="nofollow">Our blog</a></p> <p> <a href="http://www.twitter.com/slidefinder" class="external" rel="nofollow">Twitter</a> | <a href="http://www.facebook.com/pages/SlideFinder/172975213835" class="external" rel="nofollow">Facebook</a> </p> <p><a href="/info/privacy" class="internalDiscrete" rel="nofollow">Privacy</a></p> <p><a accesskey="8" href="/info/termsofuse" class="internalDiscrete" rel="nofollow">Terms of use</a></p> </div> <div class="section thin"> <h4><a href="/university" class="internalDiscrete">Universities</a></h4> <p><a href="/university" class="internalDiscrete">Europa (585)</a></p> <p><a href="/university" class="internalDiscrete">Nordamerika (775)</a></p> <p><a href="/university" class="internalDiscrete">Südamerika (141)</a></p> <p><a href="/university" class="internalDiscrete">Afrika (11)</a></p> <p><a href="/university" class="internalDiscrete">Ozeanien (24)</a></p> <p><a href="/university" class="internalDiscrete">Asien (274)</a></p> </div> <div class="section"> <h4>Slides by language</h4> <p><a href="/english_(en)" class="internalDiscrete">English</a></p> <p><a href="/spanish_(es)" class="internalDiscrete">Spanish</a></p> <p><a href="/french_(fr)" class="internalDiscrete">French</a></p> <a id="MoreLangLink" class="internalDiscrete">More</a><span class="bullet"></span> <div id="LanguageMoreList"> <ul> <li><a href="/albanian_(sq)" class="internalDiscrete">Albanian</a></li> <li><a href="/arabic_(ar)" class="internalDiscrete">Arabic</a></li> <li><a href="/azeri_(az)" class="internalDiscrete">Azeri</a></li> <li><a href="/bengali_(bn)" class="internalDiscrete">Bengali</a></li> <li><a href="/catalan_(ca)" class="internalDiscrete">Catalan</a></li> <li><a href="/chinese_(zh)" class="internalDiscrete">Chinese</a></li> <li><a href="/croatian_(hr)" class="internalDiscrete">Croatian</a></li> <li><a href="/czech_(cs)" class="internalDiscrete">Czech</a></li> <li><a href="/danish_(da)" class="internalDiscrete">Danish</a></li> </ul> <ul> <li><a href="/dutch_(nl)" class="internalDiscrete">Dutch</a></li> <li><a href="/english_(en)" class="internalDiscrete">English</a></li> <li><a href="/estonian_(et)" class="internalDiscrete">Estonian</a></li> <li><a href="/finnish_(fi)" class="internalDiscrete">Finnish</a></li> <li><a href="/french_(fr)" class="internalDiscrete">French</a></li> <li><a href="/galician_(gl)" class="internalDiscrete">Galician</a></li> <li><a href="/german_(de)" class="internalDiscrete">German</a></li> <li><a href="/greek_(el)" class="internalDiscrete">Greek</a></li> <li><a href="/hebrew_(he)" class="internalDiscrete">Hebrew</a></li> </ul> <ul> <li><a href="/hindi_(hi)" class="internalDiscrete">Hindi</a></li> <li><a href="/hungarian_(hu)" class="internalDiscrete">Hungarian</a></li> <li><a href="/icelandic_(is)" class="internalDiscrete">Icelandic</a></li> <li><a href="/indonesian_(id)" class="internalDiscrete">Indonesian</a></li> <li><a href="/irish_(ga)" class="internalDiscrete">Irish</a></li> <li><a href="/italian_(it)" class="internalDiscrete">Italian</a></li> <li><a href="/japanese_(ja)" class="internalDiscrete">Japanese</a></li> <li><a href="/javanese_(jv)" class="internalDiscrete">Javanese</a></li> </ul> <ul> <li><a href="/korean_(ko)" class="internalDiscrete">Korean</a></li> <li><a href="/kurdish_(ku)" class="internalDiscrete">Kurdish</a></li> <li><a href="/latvian_(lv)" class="internalDiscrete">Latvian</a></li> <li><a href="/lithuanian_(lt)" class="internalDiscrete">Lithuanian</a></li> <li><a href="/luxembourgish_(lb)" class="internalDiscrete">Luxembourgish</a></li> <li><a href="/malay_(ml)" class="internalDiscrete">Malay</a></li> <li><a href="/maltese_(mt)" class="internalDiscrete">Maltese</a></li> <li><a href="/norwegian_(no)" class="internalDiscrete">Norwegian</a></li> </ul> <ul> <li><a href="/pashto_(ps)" class="internalDiscrete">Pashto</a></li> <li><a href="/persian_(fa)" class="internalDiscrete">Persian</a></li> <li><a href="/polish_(pl)" class="internalDiscrete">Polish</a></li> <li><a href="/portuguese_(pt)" class="internalDiscrete">Portuguese</a></li> <li><a href="/punjabi_(pa)" class="internalDiscrete">Punjabi</a></li> <li><a href="/romanian_(ro)" class="internalDiscrete">Romanian</a></li> <li><a href="/russian_(ru)" class="internalDiscrete">Russian</a></li> <li><a href="/sindhi_(sd)" class="internalDiscrete">Sindhi</a></li> </ul> <ul> <li><a href="/slovak_(sk)" class="internalDiscrete">Slovak</a></li> <li><a href="/slovenian_(sl)" class="internalDiscrete">Slovenian</a></li> <li><a href="/spanish_(es)" class="internalDiscrete">Spanish</a></li> <li><a href="/sundanese_(su)" class="internalDiscrete">Sundanese</a></li> <li><a href="/swedish_(sv)" class="internalDiscrete">Swedish</a></li> <li><a href="/turkish_(tr)" class="internalDiscrete">Turkish</a></li> <li><a href="/urdu_(ur)" class="internalDiscrete">Urdu</a></li> <li><a href="/welsh_(cy)" class="internalDiscrete">Welsh</a></li> </ul> <div style="clear:left;"></div> </div> </div> <div class="section"> <h4>Tools</h4> <p><a href="javascript:g_installSearchEngine('http://www.slidefinder.net/opensearch.xml');" class="internalDiscrete">Add Slidefinder to your browser</a></p> <p><a href="http://tools.slidefinder.net/addin-en.aspx" class="internalDiscrete">PowerPoint 2007/2010 Add-in</a></p> <p><a href="javascript:g_loadIndexSuggestionForm();" class="internalDiscrete">Suggest a site to add</a></p> </div> <div class="clear"></div> </div> <div id="Tech"> </div> <div class="clear"></div> </div> <script type="text/javascript"> (function () { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script> </div> <a href="/sitemap.aspx" class="internal">Sitemap</a> <div id="FormDiv"></div> <! -- Google Analytics --> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-4506526-1']); _gaq.push(['_trackPageview']); (function () { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <script type="text/javascript" src="http://img.slidefinder.net/cache/cachecontent/89/js" defer="defer"></script> <div id="fb-root" style="display: none;"></div> <script type="text/javascript"> window.fbAsyncInit = function () { FB.init({ appId: '163484830372554', status: true, cookie: true, xfbml: true }); }; (function () { var e = document.createElement('script'); e.type = 'text/javascript'; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); } ()); </script> </body> </html>