2017-09-07 1 views
0

Je reçois des valeurs pour un certain nombre d'éléments dans un fichier .resx. Sur certains des éléments data, l'élément enfant <comment> n'existe pas. Lorsque je lance ce qui suit, j'obtiens un NullReferenceException.Recherche de valeurs nulles si l'élément n'existe pas

foreach (var node in XDocument.Load(filePath).DescendantNodes()) 
{ 
    var element = node as XElement; 

    if (element?.Name == "data") 
    { 
     values.Add(new ResxString 
     { 
      LineKey = element.Attribute("name").Value, 
      LineValue = element.Value.Trim(), 
      LineComment = element.Element("comment").Value //fails here 
     }); 
    } 
} 

J'ai essayé ce qui suit:

LineComment = element.Element("comment").Value != null ? 
       element.Element("comment").Value : "" 

Et:

LineComment = element.Element("comment").Value == null ? 
       "" : element.Element("comment").Value 

Cependant, je reçois toujours une erreur? Toute aide appréciée.

+0

Avis - semble que le problème est que vous êtes en train de faire .Value sur "null" alias null.Value –

+0

Qu'en est-il en utilisant l'opérateur de propagation null (? '.'), comme vous l'avez fait avec votre condition 'if' ... 'element.Element (" comment ") ?. Value'. Ou juste 'LineComment = element.Element (" comment ") == null? "": element.Element ("comment"). Value; ' –

Répondre

2

utilisation Null-conditional (?.) Opérateur:

LineComment = element.Element("comment")?.Value 

Il est utilisé pour tester null avant effectuer un accès membre.

+0

Bien sûr, merci pour ce –

2

Si vous allez utiliser LINQ, ne pas simplement utiliser partiellement: (juste en expansion sur S. Akbari's Answer)

values = XDocument.Load(filePath) 
    .DescendantNodes() 
    .Select(dn => dn as XElement) 
    .Where(xe => xe?.Name == "data") 
    .Select(xe => new new ResxString 
    { 
     LineKey = element.Attribute("name").Value, 
     LineValue = element.Value.Trim(), 
     LineComment = element.Element("comment")?.Value 
    }) 
    .ToList(); // or to array or whatever 
+2

ne serait pas' element' être 'xe' dans votre exemple? En outre, vous pourriez vouloir appeler que vous employez l'opérateur conditionnel nul, et c'est où le problème est –

0

Lancer un élément ou un attribut à un type Nullable est suffisant. Vous obtiendrez la valeur ou null.

var LineComment = (string)element.Element("comment"); 

ou

var LineKey = (string)element.Attribute("name");