2012-02-14 3 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>(); 

이 문제 :
NO있다 오류, 나는 여전히 Count = 1,
때문에 doc.Descendants ("오류") 는 "< 오류> </오류>"발견

로드와 노드를 구문 분석 할 때 빈 노드
을 제외 할 LINQ 코드를 알 수있는 방법이 있나요?

답변 :
난 그냥 추가 할 필요하여 LINQ에 "(w.HasElements) 여기서"그래서

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>(); 

... 그리고 그것은 작동! 당신이 정말errorcodeerrormessage의 하위 요소가 error 요소를 원하는처럼

+2

아래 분야에서 자신의 질문에 대답하고,이 SO에 허용 다시 보정으로 다음을 표시 할 수 있습니다. 사람들이 대답하지 않은 질문을 보는 것을 방지하고 답변 된 질문을보고 싶은 사람들을 초대합니다. –

답변

4

는 소리가 난다. 이것에 대해 어떻게 :. 나는이 내장 된 변환이 아마 좋은 아이디어라고 생각하지만

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>();