2011-08-23 2 views
0

이것은 XML의 예는 다음과 같습니다XElement를 Linq에서 XML로 그룹화 하시겠습니까?

<ProblemFactory Name="Diagnostic exam" Count="1"> 
    <Condition ObjectiveID="1" Type="1" CountRanges="2" Range1Decimals="0" Range1Min="3" Range1Max="10" Range2Decimals="0" Range2Min="6" Range2Max="10" /> 
    <Condition ObjectiveID="1" Type="1" CountRanges="2" Range1Decimals="0" Range1Min="6" Range1Max="10" Range2Decimals="0" Range2Min="6" Range2Max="10" /> 
</ProblemFactory> 

그리고 나는 다음과 같은 것을 할 노력하고있어 :

 XDocument xdoc = XDocument.Load("ProblemFactory.xml"); 
     var problems = from pf in xdoc.Descendants("Condition") 
         select new 
         { 
          // ObjectiveID property 
          // Type property 
          // Ranges collection property 
         }; 

이 범위 모음 내 문제 만들기를. 컬렉션을 만들기 위해 XML 파일이나 쿼리를 어떻게 struture 할 수 있습니까? 컬렉션에는 RangeDecimals, RangeMin, RangeMax가 포함됩니다.

는 잘 모르겠지만, 내가 가야 reestruct 내 조건 튜플했습니다이 문제를 해결하기 위해 상상 할 수 있습니다, 새로운 형식으로

<Condition ObjectiveID="1" Type="1" > 
    <RangesCollection> 
     <Range RangeDecimals="0" RangeMin="3" RangeMax="10" /> 
     <Range RangeDecimals="0" RangeMin="6" RangeMax="10" /> 
    </RangesCollection> 
</Condition> 
+0

당신이 원하는 것을 할 수는 있지만 (Jimmy의 답변) XML의 구조를 당신이 언급하는 방식으로 변경하는 것이 좋습니다. – StriplingWarrior

+0

당신은 확실히 당신이 가지고있는 것을 사용하기 위해 당신의 조건을 재구성해야합니다. 특히 범위의 수가 다를 수 있기 때문에 특히 그렇습니다. 비록 당신은 정말로 'CountRanges'를 전혀 필요로하지 않지만. –

+0

오, 그건 사실이야. 나는 컬렉션에서 얻을 수있다 –

답변

3
var problems = 
    from condition in xdoc.Descendants("Condition") 
    select new { 
     ObjectiveID = condition.Attribute("ObjectiveID").Value, 
     Type = condition.Attribute("Type").Value, 
     Ranges = Enumerable 
      .Range(1, (int)condition.Attribute("CountRanges")) 
      .Select(i => new { 
       Min = (int)condition.Attribute("Range" + i + "Min"), 
       Max = (int)condition.Attribute("Range" + i + "Max"), 
       Decimals = (int)condition.Attribute("Range" + i + "Decimals"), 
      }).ToArray() 
    }; 


Ranges = condition.Descendants("Range") 
    .Select(range => new { 
     Min = (int)range.Attribute("RangeMin"), 
     Max = (int)range.Attribute("RangeMax"), 
     Decimals = (int)range.Attribute("RangeDecimals") 
    }) 
    .ToArray() 
+0

지미, 나는 당신의 해결책을 좋아한다. 내가 구조화 한 새로운 구조를 사용하여이 코드를 변환하도록 도울 수 있다고 생각하십니까? –

+1

LINQ to XML 쿼리를 사용하면 일반적으로 형식을 명시 적으로 캐스팅하지 않는 것이 좋습니다. 모두 내장되어 있습니다. –

+0

감사합니다. Jeff 님, 캐스팅에 대해 몰랐습니다! :) – Jimmy

관련 문제