Christian Castelli
a- a+

Lettura e ricerca dei documenti XML

COLDFUSION E XML

Lettura e ricerca dei documenti XML

I documenti XML possono essere letti efficacemente attraversola funzione XmlSearch(). Gli elementi specificipossono essere localizzati usando la funzioneXmlChildPos().

XmlSearch()

La funzione XmlSearch() usa un'espressioneXPath per effettuare delle ricerche in documenti XML. Lafunzione prende due argomenti: l'oggetto su cui condurrele ricerche e l'espressione XPath. Questa funzioneritorna un arrat di nodi XML corrispondentiall'espressione passata come argomento. gli esempi quisotto mostrano come usare tale funzione: il primo mostra ildocumento XML su cui compiere le ricerche e il secondoè il file ColdFusion che utilizza la funzioneXmlSearch().

Es.8a: Beatles.xml

<?xml version="1.0"?>  <beatles>   <beatle link="http://www.paulmccartney.com">    <name>     <firstname>Paul</firstname>     <lastname>McCartney</lastname>    </name>   </beatle>   <beatle link="http://www.johnlennon.com">    <name>     <firstname>John</firstname>     <lastname>Lennon</lastname>    </name>   </beatle>   <beatle link="http://www.georgeharrison.com">    <name>     <firstname>George</firstname>     <lastname>Harrison</lastname>    </name>   </beatle>   <beatle link="http://www.ringostarr.com">    <name>     <firstname>Ringo</firstname>     <lastname>Starr</lastname>    </name>   </beatle>   </beatles>

 

<a href="/img/22/iframe_CF_xml8a.html" title="Vedi esempio">Vedi codice</a>;

 

Es.8b: XmlSearch.cfm

<html>  <head>  <title>XmlSearch()</title>  </head>  <body>  <h1>XmlSearch()</h1>  <cfset xmlBeatles=XMLParse(ExpandPath("Beatles.xml"))>  <cfoutput>  <table border="1" cellpadding="2" cellspacing="0">  <tr>   <th>XPath</th>   <th>Result</th>  </tr>  <cfset arrXPs = ArrayNew(1)>  <cfset ArrayAppend(arrXPs,"/beatles")>  <cfset ArrayAppend(arrXPs,"/beatles/beatle/@link")>  <cfset ArrayAppend(arrXPs,"/beatles//firstname")>  <cfset ArrayAppend(arrXPs,"/beatles//firstname/text()")>    <cfloop index="i" from="1" to="#ArrayLen(arrXPs)#">   <cfset xp = arrXPs[i]>   <cfset arrResult = XmlSearch(xmlBeatles,xp)>   <tr valign="top">    <td>#xp#</td>    <td>     <ol>     <cfloop index="i" from="1" to="#ArrayLen(arrResult)#"><li> #XmlGetNodeType(arrResult[i])#:  <cftry>  #arrResult[i].XmlText#  <cfcatch type="any">#arrResult[i]#</cfcatch> </cftry></li>     </cfloop>     </ol>    </td>   </tr>  </cfloop>  </table>  </cfoutput>  </body>  </html>

<a href="/img/22/iframe_CF_xml8b.html" title="Vedi esempio">Vedi codice</a>;

 

Il codice effettua delle iterazioni attraverso un set diespressioni XPath, usandone ciascuna per effettuare dellericerche nel documento e alla fine mostra il risultato in unalista. Se il nodo risultante ha una proprietàXmlText (ad esempio un elemento), taleproprietà viene mostrata, altrimenti (se è unattributo per esempio) viene mostrato il nodo. L'outputfinale è quello mostrato qui sotto in figura:

xmlsearch
Fig 4: risultato dell'esempio 8

XmlChildPos()

La funzione XmlChildPos() trova la posizione diun nodo all'interno del suo nodo genitore. Ciòpuò esser sfruttato per aggiungere o rimuovereelementi al documento XML. Gli esempi qui sotto mostrano comeusare tale funzione: il primo è un semplice documentoXML mentre il secondo è il file ColdFusion che sfruttala funzione XmlChildPos().

Es. 9a: RockStars.xml

<?xml version="1.0" encoding="iso-8859-1"?>  <rockstars>   <beatle link="http://www.paulmccartney.com">    <name>     <firstname>Paul</firstname>     <lastname>McCartney</lastname>    </name>   </beatle>   <beatle link="http://www.johnlennon.com">    <name>     <firstname>John</firstname>     <lastname>Lennon</lastname>    </name>   </beatle>   <stone link="http://www.mickjagger.com" >    <name>     <firstname>Mick</firstname>     <lastname>Jagger</lastname>    </name>   </stone>   <stone link="http://www.keithrichards.com" >    <name>     <firstname>Keith</firstname>     <lastname>Richards</lastname>    </name>   </stone>   <beatle link="http://www.webucator.com">    <name>     <firstname>Nat</firstname>     <lastname>Dunn</lastname>    </name>   </beatle>  </rockstars>

 

<a href="/img/22/iframe_CF_xml9a.html" title="Vedi esempio">Vedi codice</a>;

 

Es 9b: XmlChildPos.cfm

<cfset xmlRockStars=XMLParse(ExpandPath("RockStars.xml"))>  <cfset arrRockStars=xmlRockStars.rockstars.XmlChildren>  <html>  <head>  <title>XmlChildPos()</title>  </head>  <body>  <h1>XmlChildPos()</h1>  <cfoutput>   <ol>   <cfloop index="i" from="1" to="#ArrayLen(arrRockStars)#">    <li>#arrRockStars[i]#</li>   </cfloop>   </ol><cfset notARockStarPos = XmlChildPos(xmlRockStars.rockstars,"beatle" ,3)><div style="; font-size:larger;">    The person at position #notARockStarPos# is not a rock star and will be deleted.   </div><cfset ArrayDeleteAt(arrRockStars,notARockStarPos)><ol>   <cfloop index="i" from="1" to="#ArrayLen(arrRockStars)#">    <li>#arrRockStars[i]#</li>   </cfloop>   </ol>  </cfoutput>  </body>  </html>

 

<a href="/img/22/iframe_CF_xml9b.html" title="Vedi esempio">Vedi codice</a>;

 

Il documento mostra tutti i nodi dell'elementorockstars. La funzioneXmlChildPos() cerca il terzo elemento dei beatlee lo identifica come quinto elemento all'interno dirockstars e usa tale informazione per cancellarel'elemento dall'arrayrockstars.XmlChildren. In conclusione mostranuovamente i nodi figli dell'elemento rockstars (tuttigli altri elementi non appartenenti a rockstars non vengonomostrati).

xmlchildpos()
Fig 5: risultato dell'esempio 9



Ti potrebbe interessare anche

commenta la notizia