2015-01-05 72 views
2

我正在從XML讀取數據。我遇到了一個值爲空的問題,我不確定處理它的最佳方法。以下是一段代碼。街道地址2不存在於此XML中,但在其他地方存在,因此我需要使其足夠動態來處理這兩個實例。在linq中處理null元素

var storeInfo = storeRows.Descendants("Store").Select(s => new 
{ 
    storeName = s.Element("StoreName").Value, 
    streetAddress1 = s.Element("StreetAddress1").Value, 
    streetAddress2 = s.Element("StreetAddress2").Value 
}); 
{ 
    foreach (var st in storeInfo) 
    { 
     alStoreName.Add(st.storeName.ToString()); 
     alStreet1.Add(st.StreetAddress1.ToString()); 
     alStreet2.Add(st.StreetAddress2.ToString()); 
    } 
} 
+0

與論壇網站不同,我們不使用「謝謝」或「任何幫助讚賞」,或在[so]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 從 - 個)。 –

回答

4

使用顯式強制而不是訪問Value財產

var storeInfo = storeRows.Descendants("Store").Select(s => new 
{ 
    storeName = (string)s.Element("StoreName"), 
    streetAddress1 = (string)s.Element("StreetAddress1"), 
    streetAddress2 = (string)s.Element("StreetAddress2") 
}); 

這將返回null如果元素不存在。

此外,我建議您創建一個class來封裝存儲信息,而不是將信息存儲在不同的列表中。這時正好有storeInfo的一個列表,而不是匿名類型的列表:

var storeInfo = storeRows.Descendants("Store").Select(s => new StoreInfo 
{ 
    storeName = (string)s.Element("StoreName"), 
    streetAddress1 = (string)s.Element("StreetAddress1"), 
    streetAddress2 = (string)s.Element("StreetAddress2") 
}); 
3

您應該使用(string)XElement明確的轉換,而不是Value財產。當元素不存在時它將返回null

streetAddress2 = (string)s.Element("StreetAddress2") 

你可以施放XElement到最原始的類型,stringDateTimeGuid及以上Nullable<T>的。在此處查看完整列表:XElement Type Conversions

同樣的規則適用於XAttribute