http://web.tiscali.it/archivio_esempi/immagini/comuni_1_dati.pngdato 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