XML - devo per forza scomodare NodeList?

Ciao @Antonio_Rinaldi, ma ciao anche a tutti.
Approfitto di te Antonio perché ho visto che hai risposto a domande riguardo XML su questo forum italiano, per cui ne approfitto anche io :slight_smile:

In realtà ho già creato una propria funzione che si muove all’interno del xml utilizzando XMLNode.NextSibling, .FirstChild, e per leggere utilizzo .GetAttribute e .Value .

Funziona tutto bene, però leggendo su Internet e poi anche la documentazione di XoJo ho “scoperto” che XQL permette di fare delle query.

XMLNodeList come risultato da una lista di nodi per cui nel mio caso la seguente sarebbe la procedura corretta:

Var nodes As XmlNodeList
nodes = xml.XQL("/SimBase/FlightPlan") 

Var ilNodo As XmlNode
ilNodo = nodes.Item(0) 'Zero perché tanto /SimBase/FlightPlan è unico
..

Però se voglio posizionare il mio ilNodo (Var ilNodo As XmlNode), in un nodo ben preciso, devo per forza scomodare NodeList ?
Mi spiego meglio. Ho la seguente:

<?xml version="1.0" encoding="UTF-8"?>

<SimBaseType=“AceXML” version=“1,30”>
. . < Descr>AceXML Document< /Descr>
. . < FlightPlan>
. . . . < Title>Pisa< /Title>
. . . . < FPType>IFR< /FPType>
. . . . . ecc…
. . < /FlightPlan>
< /SimBaseType

Il nodo FlightPlan è un nodo unico, ma può trovarsi come primo Child, come secondo, … terzo, …
Fatto sta che è sempre unico.

DOMANDA
E’ possibile posizionare ilNodo direttamente su un preciso nodo evitando XMLNodeList, MA SEMPRE UTILIZZANDO UNA QUERY ? Esempio con una sorta del seguente codice:

Var ilNodo As XmlNode
ilNodo = xml.XQL("/SimBase/FlightPlan") '-> so che questo è un errore perché XQL restituisce un NodeList, ma..

…ma appunto chiedevo se vi fosse un modo per utilizzare la query e far posizionare ilNodo direttamente sulla posizione.

Grazie.

Ciao Michele,
XQL risponde sempre con una lista di nodi, ma spesso capita, come nel tuo caso che il nodo sia singolo o sempre solo il primo della lista.
Puoi risolvere con un metodo estensione (ovvero da mettere in modulo con visibilità globale)

Public Function XQLSingle(extends x as XmlNode, path as String) as XmlNode
  Var xl As XmlNodeList=x.Xql(path)
  If xl.Length=0 Then
    Return Nil
  Else
    Return xl.Item(0)
  End If
End Function

Ovviamente se non trova il percorso risponderà nil
Ti ricordo che il “path” è sempre relativo al punto di selezione ovvero nel tuo esempio dall’oggetto xml, quindi xml.XQLSingle("/SimBase/FlightPlan"), o dall’elemento radice xml.documentElement.XQLSingle(“FlightPlan”) o anche da un nodo risultante, xml.XQLSingle(“SimBase”).XQLSingle(“FlightPlan”) e così via
PS l’ultimo è solo un esempio breve, non concatenare mai direttamente le ricerche in quanto un nodo potrebbe risultare non trovato (nil) e quindi generare errore.