2012-02-14 101 views
1

以下XML可能包含錯誤或不包含錯誤。
如果沒有,結果仍輸出<錯誤> </error>標記。LINQ讀取XML ...與XDocument

string xml = 
    "<response> 
     <total>1</total> 
     <bla>bla bla bla</bla> 
     <error></error> 
    </response>"; 

在我的代碼加載XML是這樣的:

XDocument doc = XDocument.Parse(xml); 
XElement responseNode = doc.Element("response"); 

並解析錯誤標籤是這樣的:

List<Error> Errors = (from w in doc.Descendants("error") 
      select new Error 
      { 
       ErrorCode = w.ElementValueInt("errorcode"), 
       ErrorMessage = w.ElementValueString("errormessage") 
      }).ToListSafely<Error>(); 

問題:
時,有沒有錯誤,我仍然得到Count = 1,
,因爲doc.Descendants(「error」)找到了「<錯誤> < /錯誤>」

有沒有辦法告訴LINQ代碼來排除空節點
加載和解析節點時?

答:
我只需要添加 「在哪裏(w.HasElements)」 的LINQ,所以

List<Error> Errors = (from w in doc.Descendants("error") 
     where (w.HasElements) 
     select new Error 
     { 
      ErrorCode = w.ElementValueInt("errorcode"), 
      ErrorMessage = w.ElementValueString("errormessage") 
     }).ToListSafely<Error>(); 

...和它的作品!

+2

你可以回答你自己的問題在下面的字段,然後將其標記爲正確這是可以接受在SO。阻止人們查看誰認爲未答覆的問題 - 並邀請希望看到已解答問題的人員。 – 2012-02-14 20:12:46

回答

4

這聽起來像你真的希望其具有errorcodeerrormessage子元素error元素。這個怎麼樣:

var errors = (from element in doc.Descendants("error") 
       let code = (int?) element.Element("errorcode") 
       let message = (string) element.Element("errormessage") 
       where code != null && message != null 
       select new Error {ErrorCode = code.Value, ErrorMessage = message}) 
      .ToList(); 

(我在什麼ElementValueIntElementValueString猜到呢,雖然我覺得內置的轉換可能是一個更好的主意,我不知道是什麼ToListSafely呢?它會幫助,如果你有這樣的事情...)

這樣你就不會最終創造一個錯誤的一個元件,如:

<error><unrelated /></error> 
1

您可以通過使用過濾掉空的錯誤一個where操作員檢查對應於每個<error>XElement財產:

List<Error> Errors = 
    (
     from w in doc.Descendants("error") 
     where !w.IsEmpty 
     select new Error 
     { 
      ErrorCode = w.ElementValueInt("errorcode"), 
      ErrorMessage = w.ElementValueString("errormessage") 
     } 
    ).ToListSafely<Error>();