3.939 messaggi dal 28 gennaio 2003
http://web.tiscali.it/archivio_esempi/immagini/comuni_1_dati.png

dato un xml di cui l'immagine, il mio obiettivo è quello di sommare il campo TR_QUANTITA se il campo TR_ID_RIFIUTO = '50'

io ho fatto 3 procedure, credo funzionanti, ma chissà, forse si può fare meglio; e poi mi interessa imparare bene questo argomento.
Se qualche amico volesse dare un'occhiata per migliorarle gliene sarei grato.


1) utilizzo un ciclo
Private Function ProduzioneIndifferenziata1(xmlDoc As XmlDocument) As Double
  'accedo alla radice del documento
  Dim radice As XmlElement = xmlDoc.DocumentElement()

  Dim nodi As XmlNodeList = Nothing
  Dim nodo As XmlNode = Nothing

  nodi = radice.SelectNodes("./Dati_Riepilogativi/DettagliRifiuti_2010/TabellaDettagliRifiuti_2010/*")
  Dim quantita As Double = 0
  For i As Integer = 0 To nodi.Count - 1
    nodo = nodi(i)

    'non sono interessato ai campi che iniziano con Riga o RigaIntestazione
    If Not (nodo.Name.StartsWith("Riga") AndAlso Not nodo.Name.StartsWith("RigaIntestazione")) Then
      Continue For
    End If

    Dim rifiuto As String = nodo.SelectSingleNode("./TR_ID_RIFIUTO").InnerText.Trim
    'non considero gli elementi con rifiuto <> 50
    If rifiuto <> "50" Then Continue For

    'finalmente, trovo la quantità, aggiusto il separatore decimale, lo converto in 0 se nullo, lo converto in double
    quantita += CDbl(l.NullToZero(nodo.SelectSingleNode("./TR_QUANTITA").InnerText.Trim.Replace("."c, CChar(l.CorrenteSeparatoreDecimale))))
  Next
  Return quantita

End Function


2) filtro con ciclo
Private Function ProduzioneIndifferenziata2(xmlDoc As XmlDocument) As Double
  'accedo alla radice del documento
  Dim radice As XmlElement = xmlDoc.DocumentElement()

  Dim nodi As XmlNodeList = Nothing
  Dim nodo As XmlNode = Nothing

  nodi = radice.SelectNodes("./Dati_Riepilogativi/DettagliRifiuti_2010/TabellaDettagliRifiuti_2010//*[TR_ID_RIFIUTO='50']/TR_QUANTITA")
  Dim quantita As Double = 0
  For i As Integer = 0 To nodi.Count - 1
    nodo = nodi(i)

    'finalmente, trovo la quantità, aggiusto il separatore decimale, lo converto in 0 se nullo, lo converto in double
    quantita += CDbl(l.NullToZero(nodo.InnerText.Trim.Replace("."c, CChar(l.CorrenteSeparatoreDecimale))))
  Next
  Return quantita

End Function



3) solo fitro senza cicle
Private Function ProduzioneIndifferenziata3(xmlDoc As XmlDocument) As Double
  'accedo alla radice del documento
  Dim radice As XmlElement = xmlDoc.DocumentElement()

  Dim quantita As Double = radice.SelectNodes("./Dati_Riepilogativi/DettagliRifiuti_2010/TabellaDettagliRifiuti_2010//*[TR_ID_RIFIUTO='50']/TR_QUANTITA").Cast(Of XmlElement).Sum(Function(c) CDbl(l.NullToZero(c.InnerText.Trim.Replace("."c, CChar(l.CorrenteSeparatoreDecimale)))))

  Return quantita

End Function
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Pietro,
direi che 2 e 3 sono da preferire perché lasci che la selezione dei nodi avvenga mediante una query XPath. Così è più conciso e leggibile, secondo me.

Come tipo di ritorno sceglierei Decimal, perché ha una precisione maggiore rispetto a Double.
http://msdn.microsoft.com/en-US/library/364x0z75.aspx

La conversione puoi farla con il metodo Decimal.Parse, a cui puoi passare anche una Culture che usi il punto come separatore dei decimali (così eviti il Replace). La InvariantCulture, per esempio, si presta allo scopo.
https://dotnetfiddle.net/sDns9h

ciao,
Moreno
Modificato da BrightSoul il 22 luglio 2014 22.49 -

Enjoy learning and just keep making
3.939 messaggi dal 28 gennaio 2003
Accetto il tuo consiglio. Grazie.

Ma mi ha interessato come mostri il codice qui:

https://dotnetfiddle.net/sDns9h


??? di che si tratta?

ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
quel servizio, DotNetFiddle, ti consente di scrivere del codice C# o VB.NET che verrà eseguito sul loro server affinché tu possa poi vederne l'output. Puoi anche interagire col programma, come se l'applicazione console fosse in esecuzione sul tuo PC.
E' un modo per sperimentare con piccoli pezzi di codice e condividerli senza doversi scambiare un progetto creato con Visual Studio.
Utile :)

Ne esistono di simili anche per Javascript (JsFiddle, CodePen), Bootstrap (Bootply), SQL (SqlFiddle) ed Espressioni regolari (Regexr).

ciao,
Moreno
Modificato da BrightSoul il 25 luglio 2014 11.44 -

Enjoy learning and just keep making

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.