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 attraverso la funzione XmlSearch(). Gli elementi specifici possono essere localizzati usando la funzione XmlChildPos().

XmlSearch()

La funzione XmlSearch() usa un'espressione XPath per effettuare delle ricerche in documenti XML. La funzione prende due argomenti: l'oggetto su cui condurre le ricerche e l'espressione XPath. Questa funzione ritorna un arrat di nodi XML corrispondenti all'espressione passata come argomento. gli esempi qui sotto mostrano come usare tale funzione: il primo mostra il documento XML su cui compiere le ricerche e il secondo è il file ColdFusion che utilizza la funzione XmlSearch().

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 di espressioni XPath, usandone ciascuna per effettuare delle ricerche nel documento e alla fine mostra il risultato in una lista. Se il nodo risultante ha una proprietà XmlText (ad esempio un elemento), tale proprietà viene mostrata, altrimenti (se è un attributo per esempio) viene mostrato il nodo. L'output finale è quello mostrato qui sotto in figura:

xmlsearch
Fig 4: risultato dell'esempio 8

XmlChildPos()

La funzione XmlChildPos() trova la posizione di un nodo all'interno del suo nodo genitore. Ciò può esser sfruttato per aggiungere o rimuovere elementi al documento XML. Gli esempi qui sotto mostrano come usare tale funzione: il primo è un semplice documento XML mentre il secondo è il file ColdFusion che sfrutta la 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'elemento rockstars. La funzione XmlChildPos() cerca il terzo elemento dei beatle e lo identifica come quinto elemento all'interno di rockstars e usa tale informazione per cancellare l'elemento dall'array rockstars.XmlChildren. In conclusione mostra nuovamente i nodi figli dell'elemento rockstars (tutti gli altri elementi non appartenenti a rockstars non vengono mostrati).

xmlchildpos()
Fig 5: risultato dell'esempio 9



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Staff
Ti interessano altri articoli su questo argomento?
Chiedi alla nostra Redazione!