2011-11-21 5 views
1

XML을 가지고 있습니다. (정확히는 간단하지 않지만 제 질문에는 충분합니다).특정 하위 요소를 추출하는 방법 Linq to XML을 사용하는 조건에 따라 달라집니다.

나는 다음과 같은

var xdoc = XDocument.Parse(@" 
<Root> 
    <Item> 
     <Node1>Value 1</Node1> 
     <Node2>Value 2</Node2> 
     <Node3>Value 3</Node3> 
     <Node4>Value 4</Node4> 
     <Node5>Value 5</Node5> 
     <Node6>Value 6</Node6> 
    </Item> 
</Root>"); 

var results = xdoc.Root 
    .Elements("Item") 
    .Descendants() 
    .Select(e => new { ElementName = e.Name, ElementValue = e.Value }); 

같은 코드 경우이 나에게 "항목"요소의 모든 자손 (노드 이름과 노드 값)의 결과 목록을 제공 할 것입니다. 제가 물어보고 싶은 것은 조건에 따라 다른 데이터 세트를 얻는 방법입니다. 예를 들어, Node1 또는 Node2에 값 (비어 있지 않음)이 있으면 Node1 및 Node2 (노드 이름 및 값)의 결과 목록 만 필요합니다. 그렇지 않으면 결과 목록에 Node3, Node4, Node5 및 다른 노드가 표시되어야합니다. Node6 (노드 이름 및 값). 도와주세요. 고맙습니다.

답변

0

귀하의 조건은 다소 이상합니다.

var query = 
    from item in doc.Root.Elements("Item") 
    let elements = item.Elements() 
    let firstTwo = elements.Take(2) 
    let descendants = firstTwo.All(e => !String.IsNullOrWhiteSpace(e.Value)) 
     ? firstTwo.DescendantsAndSelf() 
     : elements.Skip(2).DescendantsAndSelf() 
    from e in descendants 
    select new 
    { 
     ElementName = e.Name, 
     ElementValue = e.Value, 
    }; 
0

귀하의 질문을 완전히 이해하고 있는지 잘 모르겠습니다. condition에 해당하는 경우

if (condition) 
    results = results.Take(2); 
else 
    results = results.Skip(2); 

그래서, 당신은 당신의 결과 시퀀스의 첫 번째 2 개 노드를해야합니다 : 바로 그것을 가지고 경우, 다음 추가 할 필요가 같은 상태입니다 . condition이 거짓이면 남은 요소 만 있습니다.

귀하의 질문에 대한 나의 첫 번째 해석은 쿼리에 Where에 대한 호출을 추가해야 결과 세트에 실제로 값을 포함하는 요소 만 포함된다는 것입니다. 그러면 다음과 같이 보입니다.

var results = xdoc.Root 
    .Elements("Item") 
    .Descendants() 
    .Where(e => !string.IsNullOrEmpty(e.Value)) 
    .Select(e => new { ElementName = e.Name, ElementValue = e.Value }); 
관련 문제