Ciao a tutti,
sto implementando un metodo per restituire una lista di oggetti di tipo T (entità che corrisponde a un nodo di un file xml) in base a una ricerca fatta attraverso un numero flessibile di attributi del nodo, nel senso che se il metodo prende tre attributi X, Y, Z, alcuni di questi possono essere null perché l'utente finale può effettuare la ricerca inserendo i valori di tutti e tre oppure solo di alcuni.
Finora per selezionare un nodo in base a un solo attributo ho fatto questo:
XmlNode node = xmlDoc.SelectSingleNode($"/School/Teachers/Teacher[@AttributoX= {valore X passato al metodo}]");
Ora invece vorrei selezionare il nodo in base a uno OPPURE due OPPURE tre degli attributi. Mi chiedevo se c'è una sintassi per farlo inserendo gli operatori di disgiunzione all'interno di quello stesso XPath o se devo necessariamente creare tre diversi nodi (uno per ogni attributo) ed effettuare i controlli in seguito con una serie di if else statement, per ottenere una cosa del tipo:
XmlNode nodoInBaseAdAttributoX = xmlDoc.SelectSingleNode($"/School/Teachers/Teacher[@AttributoX= {valore X passato al metodo}]");
XmlNode nodoInBaseAdAttributoY = xmlDoc.SelectSingleNode($"/School/Teachers/Teacher[@AttributoY= {valore Y passato al metodo}]");
XmlNode nodoInBaseAdAttributoZ = xmlDoc.SelectSingleNode($"/School/Teachers/Teacher[@AttributoZ = {valore Z passato al metodo}]");
if ((nodoInBaseAdAttributoX!= null) && (nodoInBaseAdAttributoY != null) && (nodoInBaseAdAttributoZ != null))
{
// creo 3 oggetti, le proprietà del primo le valorizzo con i valori degli attributi di nodoInBaseAdAttributoX , quelle del
secondo coi valori degli attributi di nodoInBaseAdAttributoY , quelle del terzo coi valori degli attributi di nodoInBaseAdAttributoZ
}
else if ((nodoInBaseAdAttributoX != null) && (nodoInBaseAdAttributoY != null) )
{
// creo 2 oggetti, le proprietà del primo le valorizzo coi valori degli attributi di nodoInBaseAdAttributoX , quelle del secondo coi valori di nodoInBaseAdAttributoY
}
else if ( (nodoInBaseAdAttributoX != null) && (nodoInBaseAdAttributoZ != null))
{
// idem, cambiando variabile
}
else if ( (nodoInBaseAdAttributoY != null) && (nodoInBaseAdAttributoZ != null) )
{
idem, cambiando variabile
}
else if ( (nodoInBaseAdAttributoX != null))
// ecc. ecc.
(Quello che vorrei ottenere alla fine è una lista di tutti gli oggetti trovati nel xml che abbiano i valori degli attributi corrispondenti a quelli di uno, due o tutti e tre gli argomenti del metodo).
C'è un modo per fare tutto questo all'interno dell'XPath utilizzando @ assieme a un operatore di disgiunzione?