XML: SelectSingleNode in base a numero di parametri flessibile

di il
2 risposte

XML: SelectSingleNode in base a numero di parametri flessibile

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?

2 Risposte

  • Re: XML: SelectSingleNode in base a numero di parametri flessibile

    brobh ha scritto:


    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?
    Puoi usare gli XPath Operators per inserire operazioni logiche all'interno delle espressioni del filtro.

    Alla peggio, con XDocument credo che potresti gestirlo tranquillamente anche a livello di C#, usando LINQ e specificando le condizioni con i relativi metodi tipo Where() (se ho capito bene quello che vuoi fare), però tu non vuoi usarlo e quindi...
  • Re: XML: SelectSingleNode in base a numero di parametri flessibile

    Puoi usare gli XPath Operators per inserire operazioni logiche all'interno delle espressioni del filtro.

    Alla peggio, con XDocument credo che potresti gestirlo tranquillamente anche a livello di C#, usando LINQ e specificando le condizioni con i relativi metodi tipo Where() (se ho capito bene quello che vuoi fare), però tu non vuoi usarlo e quindi...
    [/quote]

    Grazie, ci proverò! Sto prendendo dimestichezza con XmlDocument prima di buttarmi su Linq, così cerco di mettere a confronto i due approcci
Devi accedere o registrarti per scrivere nel forum
2 risposte