L'altro giorno un'amico (Francesco)mi chiedeva come poter recuperare un nodo sapendo il suo valore ovvero prendiamo questo esempio
<?xml version="1.0" encoding="utf-8" ?>
<Ricerche>
<Utente Id='Admin'>
<Id Id='Temp'></Id>
<NumeroConto>Prova</NumeroConto>
<DataOra0></DataOra0>
<DataOra1></DataOra1>
<SwStato0></SwStato0>
<SwStato1></SwStato1>
<sort></sort>
<order></order>
</Utente>
<Utente Id="2">
<Id Id='1'></Id>
<NumeroConto></NumeroConto>
<DataOra0></DataOra0>
<DataOra1>Prova</DataOra1>
<SwStato0></SwStato0>
<SwStato1></SwStato1>
<sort></sort>
<order></order>
</Utente>
</Ricerche>Da subito gli ho detto se vuoi fare una ricerca con attributo è semplice fai
XmlDocument doc = new XmlDocument
doc.Load(path)
XmlNode node = doc.SelectSingleNode("//Utente[@Id='1']")
In questo modo ritorna il nodo utente con l'attributo id = 1
Allora non ero riuscito a trovare una soluzione al suo problema e quindi giustamente aveva postato il problema sul
forum di dotnethell, allora siccome mi piacciono le sfide ho cercato e trovato la soluzione che riporto qui, visto che magari qualcuno non è registrato sul forum.
In pratica la query xpath per recuperare un nodo sapendo il suo valore è questa
doc.SelectSingleNode("//nodo[.='valore']") in pratica con il punto gli viene indicato che deve lavorare sul nodo.
Infine francesco ha trovato la soluzione che cercava e la riporto subito
doc.ChildNodes(1).SelectSingleNode("Utente/Id[.='Prova']")
Questo comando riporta il nodo <ID> del primo Nodo quello con Utente Admin
doc.ChildNodes(1).SelectSingleNode("Utente[.='Prova']")
Questo comando riporta il nodo <UTENTE> che ha come valore all'interno del suo nodo o di un suo sottonodo il valore "Prova"
doc.ChildNodes(1).SelectSingleNode("Utente[./DataOra1='Prova']")
Infine questo comando (che effettivamente è quello che serviva a me) ...
in questo caso viene riportato il primo nodo <UTENTE> rintracciato che ha come valore nel campo DataOra1 il valore Prova ...Insomma xpath ancora una volta si dimostra un'ottimo "linguaggio" di ricerca, ma xquery è ancora meglio...rimanete sintonizzati