2010-01-21 66 views
3

我得到一個null異常,因爲MYTAG1不存在。我明白這是因爲元素(「MYTAG1」)爲空,並調用元素(「MYTAG2」)在它上面不會工作。缺少節點導致null異常崩潰linq到xml

我該如何處理這個問題以防止崩潰?

 var myItems = from myNode in Nodes.Element("MYTAG1").Elements("MYTAG2") 
          select new EPTableItem 
          { 
          // Assign stuff here        
          }; 

回答

2

我想不出一個聰明的方法,將一個if語句轉換成C#查詢語法,所以我會提出如下解決方案,執行查詢之前檢查所需要的節點。

var myItems; 
XElement myTag1 = myNode.Element("MYTAG1"); 

if (myTag1 != null) 
{ 
    myItems = from myNode in myTag1.Elements("MYTAG2") 
       select new EPTableItem 
       { 
        // Assign stuff here        
       }; 
} 
1

一個選項是定義一個新的擴展方法,並將其用作查詢源。

static IEnumerable<XElement> ElementAndChildren(this XElement parent, string name, string childName) 
{ 
    var element = parent.Element(name); 
    if (element == null) 
    { 
     return Enumerable.Empty<XElement>(); 
    } 
    return element.Elements(childName); 
} 

... 
var myItems = from myNode in Nodes.ElementAndChildren("MYTAG1","MYTAG2") 
         select new EPTableItem 
         { 
         // Assign stuff here        
         }; 
1

我發現使用擴展方法代替僞sql語法時,Linq會容易得多。你應該能夠按照這些方法做一些事情,但是請記住,我沒有測試代碼。

var myItems = Nodes.Where(n => n.Element("MYTAG1") != null) 
    .Select(n => n.Element("MYTAG1")) 
    .Select(elem => elem.Elements("MYTAG2")) 
    .Select(elem2 => new EPTTableItem { something = elem2.SomeProperty ... }); 
+0

您的第二個選擇不會返回IEnumerable >嗎? – 2010-01-21 18:52:09

+0

我在查詢XElement.Element()而不是節點。原來,XElement沒有Where擴展方法 – zachary 2010-01-22 15:29:19

0

如果你想這樣做的LINQ這樣的事情應該工作:

var myItems = from node in (from myNode in Nodes.Elements("MYTAG1") 
       where myNode != null 
       select myNode).SelectMany(x => x.Elements("MYTAG2")) 
       select new EPTableItem 
       { 
       // Assign stuff here        
       }; 

這當然會工作方式不同,如果有MYTAG

的多次出現
0

你可以做到這一切在一個單獨的LINQ查詢,包含獨立的子句和一個where子句。

var myItems = 
     from tag1 in Nodes.Elements("MYTAG1") 
     where tag1 != null 
     from tag2 in tag1.Elements("MYTAG2") 
     select new EPTableItem 
     { 
     // Assign stuff here        
     }; 
+0

這沒有編譯 – zachary 2010-01-22 21:23:46

+0

zachary,我編輯了代碼示例,它在第一個元素上缺少s。 – 2010-01-23 03:56:30