2013-04-05 57 views
4

我面臨的情況是使用Linq將XML文檔解析爲對象。在解析過程中,我正在檢查以確保元素在執行解析出它們的值之前不爲空。無論如何要簡化這個陳述嗎?XML到LINQ檢查空元素

var variable = (from x in xdoc.Descendants("Root") 
       select new AccountingResponse 
       {  
       NetCharge = x.Element("Charges") != null && x.Element("Charges").Element("NetCharge") != null ? x.Element("Charges").Element("NetCharge").Value : "0", 
       TotalCharge = x.Element("Charges") != null && x.Element("Charges").Element("TotalCharge") != null ? x.Element("Charges").Element("TotalCharge").Value : "0" 
       }).SingleOrDefault(); 

總之,我不想繼續檢查節點是否存在於每一行上。我知道我可以在解析之前測試節點是否存在,但可能還有其他需要解析的數據來創建AccountingResponse,並且我希望避免一次僅解析一部分XML的語句。

或者我可能完全錯了,還有更好的辦法!

回答

6

一個簡單的選擇是使用Elements而不是Element - 如果元素不存在,將返回一個零長度序列。所以,你可以使用:

from x in xdoc.Descendants("Root") 
select new AccountingResponse 
{  
    NetCharge = x.Elements("Charges") 
       .Elements("NetCharge") 
       .Select(y => (int) y) 
       .FirstOrDefault(), 
    TotalCharge = x.Elements("Charges") 
        .Elements("TotalCharge") 
        .Select(y => (int) y) 
        .FirstOrDefault(), 
}).SingleOrDefault(); 

(請注意,您原有的代碼將無法編譯,因爲Value是一個字符串,而0是一個int ...)

+0

是的,只是將其用於演示,謝謝雖然改變! – cgatian 2013-04-05 15:35:09

+1

你爲什麼要做.Select(x =>(int)x)?不應該。選擇(y =(int)y.Value)?既然我們仍然需要知道元素的值,並且上面聲明瞭x,所以它需要是一個不同的變量? – cgatian 2013-04-05 15:44:04

+0

@cgatian:是的,錯過了重複的變量名。定影。 – 2013-04-08 13:11:01

2

可以更換

x.Element("nodeName") != null : int.Parse(x.Element("nodeName").Value) : 0 

(int)x.Element("nodeName") 

它爲stringintdoubledecimalbooluintDateTime和那些Nullable爲好。

+0

我沒有看到任何在原始代碼中調用'int.Parse'的方法......這個方法肯定不會編譯。 – 2013-04-05 15:33:37

+0

我不認爲原始代碼編譯完成,這就是爲什麼我添加了'int.Parse()' – MarcinJuraszek 2013-04-05 15:34:23

0

在C#6.0,你可以用一元空值有條件的經營者?. 在您的示例應用它之後,它應該是這樣的:

var variable = (from x in xdoc.Descendants("Root") 
       select new 
       { 
        NetCharge = x.Element("Charges")?.Element("NetCharge")?.Value ?? "0", 
        TotalCharge = x.Element("Charges")?.Element("TotalCharge")?.Value ?? "0" 
       }).SingleOrDefault(); 

你可以閱讀更多在標題爲空,條件運算部分here