2009-10-02 11 views
0

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!

Répondre

0

La persistance prévaut! J'ai finalement trouvé la solution! tellement fier! :-)

fondamentalement changé deux lignes:

XElement uniSample = XElement.Load(limsfile); 
... 
var results = uniSample.Element("results").Descendants("element").Select(elements => new ... 

Je suis maintenant le chargement XML dans un XElement au lieu d'un XDocument, cela m'a permis de requête plus directement les données ..?

Puis j'ai ajouté un appel pour obtenir des descendants des « résultats » en particulier, et qui fait le truc pour faire « arrêter » l'analyse syntaxique quand il se doit .. :-)

Merci pour votre aide les gars!

1

La requête évalue paresseusement - elle va seulement effectuer la projection lorsqu'elle parcourt les résultats. C'est pourquoi vous ne voyez pas l'exception avant qu'elle ne touche réellement l'élément de problème. Pour forcer la requête à évaluer avec impatience, vous pouvez appeler ToList.

Je soupçonne fortement que vous avez un élément element qui manque soit le sous-élément name ou value, donc lorsque vous essayez de déréférencer la propriété Value de ce sous-élément, vous obtenez un NullReferenceException à ce point.

+0

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

+0

Je ne suis pas familier avec ce que vous proposez de forcer la requête à évaluer avec empressement. Pourriez-vous préciser ceci? – tplive

0

Votre extrait fonctionne très bien. Le problème est probablement ailleurs dans votre fichier xml et il est probable que certains de vos éléments n'ont pas de sous-noeud "nom" ou "valeur".

+0

Alors, comment puis-je m'assurer que la requête LINQ analyse uniquement les éléments au sein de et pas d'autres? – tplive

+0

Devrais-je en faire une nouvelle question? – tplive