2010-04-07 13 views
22

Używam LINQ razem z XDocument do odczytu pliku XML. Jest to kod:Czytanie XML za pomocą XDocument i Linq - sprawdź, czy element ma wartość NULL?

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

Teraz jest problem, pole extra1 nie zawsze jest obecny. W pliku XML znajdują się elementy bez tego węzła. Jeśli tak się stanie, to ulega awarii z wyjątkiem NullReferenceException.

Czy istnieje możliwość włączenia opcji "sprawdź czy null", aby zapobiec awariom?

Odpowiedz

41

Zastosowanie (string) zamiast .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")     
     }; 

ta działa również z other datatypes, w tym wiele pustych typów w przypadku element nie zawsze jest obecny.

+5

+1 - interesujące. – womp

7

Można użyć „null koalescencyjne” operator:

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

ten sposób będziesz mieć pełną kontrolę o wartości domyślnej stosowanej, gdy pojawia się żaden element.

+2

"cena" musi być "podwójna?", Aby ta linia miała sens. – AakashM

1

Oto przykładowy przykład do odczytu pliku XML za pomocą XDocument.

XDocument objBooksXML = XDocument.Load(Server.MapPath("books.xml")); 
    var objBooks = from book in 
        objBooksXML.Descendants("Book") 
        select new { 
           Title = book.Element("Title").Value, 
           Pages = book.Element("Pages").Value 
           }; 

    Response.Write(String.Format("Total {0} books.", objBooks.Count())); 
    gvBooks.DataSource = objBooks; 
    gvBooks.DataBind(); 
+0

Problem z tym kodem polega na tym, że jeśli "Książka" nie zawiera elementu "Tytuł" lub "Strony", wyrzucisz wyjątek zerowy przy próbie pobrania. Wartość z jednego z nich. – Bil

2

Poniższy przykład służy do sprawdzania istnienia dowolnego elementu przed użyciem tego elementu.

Powiązane problemy