Je suis assez nouveau pour .NET et encore plus pour LINQ, que je viens de commencer à explorer pour un petit projet sur lequel je travaille.LINQ to XML NullReferenceException APRES avoir renvoyé les résultats?
J'ai un fichier XML généré à partir d'une application qui contient quelques valeurs que je veux analyser dans un format propriétaire et enregistrer dans un fichier.
Je suis en mesure de faire fonctionner correctement une requête LINQ, en renvoyant des valeurs à mon application Console. Ensuite, la deuxième requête s'exécute, renvoie également les valeurs demandées, mais puis lance un NRE! Pourquoi n'arrête-t-il pas de parcourir le résultat une fois la troisième valeur renvoyée?
Tout d'abord, voici un extrait du fichier XML:
<analyse>
<sample>Leer 12</sample> sample ID and number
<id>Leer</id> sample ID
</analyse>
<results>
<element>
<name>c</name>
<value>0.000186156337031958</value>
</element>
<element>
<name>co2</name>
<value>0.000682099902270885</value>
</element>
<element>
<name>s</name>
<value>0.000121750914950204</value>
</element>
<element>
<name>so3</name>
<value>0.000304028592755094</value>
</element>
</results>
Ceci est la première requête LINQ:
XDocument uniSample = XDocument.Load(limsfile);
var analyse = uniSample.Descendants("analyse").Select(el => new
{
Sample = el.Element("sample").Value,
Id = el.Element("id").Value
});
foreach (var el in analyse)
{
Console.WriteLine("Sample: " + el.Sample);
Console.WriteLine("Sample ID: " + el.Id);
}
C'est la deuxième requête de LINQ: (note que je devais renommer le type anonyne Valeur parce qu'il semblait en conflit avec quelque chose)
var results = uniSample.Descendants("element").Select(elements => new
{
Name = elements.Element("name").Value,
Verdi = elements.Element("value").Value
});
foreach (var el in results)
{
Console.WriteLine("Name: " + el.Name);
Console.WriteLine("Value: " + el.Verdi);
}
Maintenant la sortie du programme ressemble à ce que vous attendez
Sample: Leer 12
Sample ID: Leer
Name: c
Value: 0.000186156337031958
Name: co2
Value: 0.000682099902270885
Name: s
Value: 0.000121750914950204
Name: so3
Value: 0.000304028592755094
... mais après la troisième itération, le NRE est jeté, pointant à la dernière requête LINQ. Pourquoi ne sort-il pas de la boucle foreach comme il le fait la première fois ??
Edit: En fait c'est après la quatrième itération, désolé pour le mélange! :) Merci!
Ah oui, je vois maintenant qu'il y a en effet d'autres éléments plus bas dans le fichier XML! Je veux seulement analyser ces éléments qui sont des sous-éléments de l'élément , dont je n'ai qu'un. –
tplive
Je ne suis pas familier avec ce que vous proposez de forcer la requête à évaluer avec empressement. Pourriez-vous préciser ceci? – tplive