2010-08-19 76 views
1

我使用Linq從一些XML中提取值。下面顯示的是一個簡化的示例,顯示我遇到的問題。下面的代碼可以在下面顯示的XML上正常工作。我遇到的問題是groupBy部分丟失。因爲Data.Element("groupBy").Element("property)失蹤,因爲Data.Element("groupBy")將爲空。是否有可能修改我的Linq語句以允許它提供默認值,還是應該以不同的方式處理它?通過Linq獲取XML值時設置默認值

var e = (from Data in theXML.Descendants("exportFile") 
select new Export 
{  
    OutputFileName = Data.Element("outputFileName") != null ? (string)Data.Element("outputFileName") : "", 
    GroupByProperty = Data.Element("groupBy").Element("property") != null ? (string)Data.Element("groupBy").Element("property") : "" 
}).First(); 

<exportFile> 
    <outputFileName>output.xml</outputFileName> 
    <groupBy> 
     <property>DeviceId</property> 
    </groupBy> 
</exportFile> 

回答

3

比它使用的是空合併運算符可以使已經稍微更好。然而,爲了應付groupby元件是缺少的是更難:

select new Export 
{  
    OutputFileName = (string) Data.Element("outputFileName") ?? "", 
    GroupByProperty = Data.Element("groupBy") == null ? "" 
      : (string) Data.Element("groupBy").Element("property") ?? "" 
}).First(); 

轉換爲字符串只是返回null如果該元素引用爲null。

另一種方法是:

GroupByProperty = 
    (string) Data.Elements("groupBy").Elements("property").FirstOrDefault() ?? "" 

使用擴展方法,它允許你打電話ElementsIEnumerable<XElement> ......這樣就(懶洋洋)一個groupBy元素下評估每個property元素的序列在Data下,如果存在,則取其中的第一個,然後應用字符串轉換。

+0

我覺得OP在說GROUPBY元素並未在XML存在。如果情況如此,這難道不會失敗嗎? – 2010-08-19 14:38:26

+0

@Justin:是的,我誤讀 - 但現在修復:) – 2010-08-19 14:38:51

+0

有趣。當你在調用鏈上游有一個空值時,我沒有意識到你可以使用FirstOrDefault()。每天學些新東西。 – 2010-08-19 14:47:05

0

你可以簡單地在聲明中添加額外的檢查(乾淨的東西了使用空合併運算符位):

GroupByProperty = Data.Element("groupBy") != null ? 
    (Data.Element("groupBy").Element("property") ?? "") : "";