2010-04-07 20 views
22

Ich verwende LINQ zusammen mit XDocument, um eine XML-Datei zu lesen. Dies ist der Code:XML mit XDocument & Linq lesen - prüfen, ob Element NULL ist?

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     
     }; 

Das Problem ist jetzt, das extra1 Feld ist nicht immer vorhanden. Es gibt Elemente in der XML-Datei ohne diesen Knoten. Wenn das passiert, stürzt es mit einer NullReferenceException ab.

Gibt es eine Möglichkeit, ein "check if null" hinzuzufügen, damit ich verhindern kann, dass es abstürzt?

Antwort

41

Verwenden (string) statt .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")     
     }; 

Dies funktioniert auch mit other datatypes, darunter viele Nullable Types, falls das Element nicht immer vorhanden ist.

+5

+1 - interessant. – womp

7

Sie können „null Koaleszierstruktur“ Operator verwenden:

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     
     }; 

Auf diese Weise werden Sie verwendet die volle Kontrolle über Standardwert haben, wenn kein Element ist.

+2

"Preis" muss "doppelt" sein, damit diese Zeile sinnvoll ist. – AakashM

1

Hier ist ein Beispiel, um XML-Datei mit XDocument zu lesen.

+0

Das Problem mit diesem Code ist, dass, wenn "Book" kein "Title" oder "Pages" Element enthält, eine Null-Ausnahme ausgelöst wird, wenn versucht wird, .Value von beiden zu erhalten. – Bil

2

Verwenden Sie das folgende Beispiel zum Überprüfen der Existenz eines Elements vor der Verwendung dieses Elements.

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