web-dev-qa-db-fra.com

Lire XML en utilisant XDocument & Linq - vérifier si l'élément est NULL?

J'utilise LINQ avec XDocument pour lire un fichier XML. Voici le code:

XDocument xml = XDocument.Load(filename);

var q = from b in xml.Descendants("product")
        select new
        {
            name = b.Element("name").Value,
            price = b.Element("price").Value,                    
            extra = b.Element("extra1").Value,
            deeplink = b.Element("deepLink").Value                   
        };

Maintenant, le problème est que le extra1 le champ n'est pas toujours présent. Il y a des éléments dans le fichier XML sans ce nœud. Si cela se produit, il se bloque avec une exception NullReferenceException.

Y a-t-il une possibilité d'inclure une "vérification si null" afin que je puisse l'empêcher de planter?

23
adchased

Utilisation (string) au lieu de .Value:

var q = from b in xml.Descendants("product")
        select new
        {
            name = (string)b.Element("name"),
            price = (double?)b.Element("price"),                    
            extra = (string)b.Element("extra1"),
            deeplink = (string)b.Element("deepLink")                   
        };

Cela fonctionne également avec autres types de données , y compris de nombreux types nullables au cas où l'élément ne serait pas toujours présent.

42
dtb

Vous pouvez utiliser l'opérateur "coalescence nulle":

var q = from b in xml.Descendants("product")
        select new
        {
            name = (string)b.Element("name") ?? "Default Name",
            price = (double?)b.Element("price") ?? 0.0,                    
            extra = (string)b.Element("extra1") ?? String.Empty,
            deeplink = (string)b.Element("deepLink") ?? String.Empty                   
        };

De cette façon, vous aurez un contrôle total sur la valeur par défaut utilisée lorsqu'il n'y a pas d'élément.

8
Marqus

Utilisez l'exemple suivant pour vérifier l'existence d'un élément avant d'utiliser cet élément.

if( b.Elements("extra1").Any() )
{
   extra = b.Element("extra1").Value;
}
2
Ashok Kumar