252 messaggi dal 03 novembre 2003
buon giorno,
dovrei risolvere un problema di interrogazione dati da un file XML.

Apro il file con
var doc=XElement.Load(PATH_NAME_FILE.xml);

var d = (from nodo in doc.Descendants("Documento")
where nodo.Element("DatiAnagrafici").Element("CFDichiarante").Value.Equals("AAABBB79E11A222F") 
select nodo);



Potrei trovare come risultato => di 2 valori.
Di conseguenza applico filtro per avere un solo valore.

Es.
d = d.Where(x => x.Element("quota").Element("rimborso").Value.Equals("10"));


Quel nodo che ha 10 come rimborso lo estraggo!(gli altri hanno sicuramente valori diversi)

Il problema sorge se nell'altro record trovato non c'è nodo 'rimborso' ma un altra voce (es. trattenere).
Errore di ritorno: 'Riferimento a un oggetto non impostato istanza di oggetto'


Come posso risolvere a tale problema?
(Sotto es. semplificato del documento)

<Documento>
    <DatiAnagrafici>
        <Cognome>VERDI</Cognome>
        <Nome>GIUSEPPE</Nome>
        <Sesso>M</Sesso>        
        <CFDichiarante>AAABBB79E11A222F</CFDichiarante>
    </DatiAnagrafici>    
  <quota>
    <rimborso>10</rimborso>
  </quota>  
</Documento>

<Documento>
    <DatiAnagrafici>
        <Cognome>VERDI</Cognome>
        <Nome>GIUSEPPE</Nome>
        <Sesso>M</Sesso>        
        <CFDichiarante>AAABBB79E11A222F</CFDichiarante>
    </DatiAnagrafici>      
        <quota>
    <trattenere>20</trattenere>
  </quota>  
</Documento>

it's not difficult to write, but is difficult write that you mean
103 messaggi dal 04 ottobre 2010
Potresti effettuare un filtraggio con un'ulteriore where che controlli che Element("Rimborso")!=null

quindi:

d = d.Where(x => x.Element("quota").Element("rimborso")!=null).Where(y=>y.Element("rimborso").Value.Equals("10"));
252 messaggi dal 03 novembre 2003
Grazie della risposta.
Ho provato a lanciare la tua condizione su LINQPad (applicativo per testare) e temevo, ritorna lo stesso errore.

Non più sulla variabile x, ma sulla 'y'...

Mi sa che non c'è soluzione se non eseguire un controllo
foreaech

Per ora ho fatto così:
dopo il where principale (che filtra per Codice Fiscale)

Se voglio trovare solo 1 per rimborso... oppure 'trattenere'
foreach (var item in d)
{
       var element = item.Descendants("rimborso");
       foreach (var Node in element)
       {
          if (Node.Value == "10") {                    
            xmlDocExportTest.Root.Add(item);
            Exit = true;
            break;
          }
        }
        if (Exit == true) { break; }
  }



e ho provato ora - sembra funzionare.
Ma possibile che non ci sia un controllo diretto in LinqToXml?

Grazie comunque del consiglio

it's not difficult to write, but is difficult write that you mean
103 messaggi dal 04 ottobre 2010
Penso di aver sbagliato una cosa, prova così:
d = d.Where(x => x.Element("quota").Element("rimborso")!=null).Where(y=>y.Element("quota").Element("rimborso").Value.Equals("10"));

Modificato da Biohazard il 08 agosto 2013 13.08 -
252 messaggi dal 03 novembre 2003
Grandissimooooo...
non mi ero accorto che non avevi messo il nodo 'quota' nella sezione 'y'

Grazie!!!
Funziona benissimo..
A buon rendere

it's not difficult to write, but is difficult write that you mean
103 messaggi dal 04 ottobre 2010
 avrei dovuto pensarci prima a dire il vero, ma contento del fatto che ti funzioni. Happy programming!
252 messaggi dal 03 novembre 2003
Non potevo chiedere di meglio!!!!

La procedura foreach che ho inventato andava bene...
Ma preferisco di gran lunga la tua soluzione!!!
Molto più pulita e oltretutto logica: sto usando LinqToXML... controllo con LinqToXML!!

Thanks thanks

happy programming you too

it's not difficult to write, but is difficult write that you mean

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.