2009-06-10 2 views
0

타사 XML 파일을 구문 분석하는 프로그램을 작성하고 있습니다. 구조는xlinq을 사용하여 XML 트리에 효율적으로 "드릴 다운"하시겠습니까?

<CharacterSheet> 
    ... 
    <StatBlock> 
     ... 
     <Stat> 
      ... 
      <alias /> 
      ... 
     </Stat> 
     ... 
    </StatBlock> 
    ... 
</CharacterSheet> 

내가 LINQ와 연습을 얻기 위해이에서를 사용하고 ... 뭔가처럼, 나는 내가 원하는 것을 얻을 정말 추악한 체인 쿼리를 작성해야 벌금을 부과하고있어, 목록 통계와 모든 별칭.

var CharSheet = from i in character.Elements() 
     where i.Name == "CharacterSheet" 
     select i; 

var StatBlocks = from sheet in CharSheet 
     from statBlock in sheet.Elements() 
     where statBlock.Name == "StatBlock" 
     select statBlock; 

var stats = from statBlock in StatBlocks 
     from stat in statBlock.Elements() 
     select stat; 

var statAliases = from stat in stats 
      from alias in stat.Elements() 
      where alias.Name == "alias" 
      select new { stat, alias }; 

그리고 나는 (원래 내가 그것을했다 방법입니다) "로"사용하여 하나 개 정말 긴 쿼리에 그것을 만들 수 실현,하지만 그건 그냥 더 조밀하고 작업하기가 어렵습니다.

내가하려는 일을하는 더 간단한 방법이있는 것처럼 보입니다.

답변

6

당신은 (솔직히 수 있습니다 더 나은 아이디어) XPathSelectElements()를 사용할 수 있습니다, 또는 당신은 Elements() 확장 방법을 사용할 수 있습니다

var query = character.Elements("CharacterSheet") 
        .Elements("StatsBlock") 
        .Elements() 
        .Elements("alias") 
        .Select(x => new { stat=x.Parent, alias=x}; 
+0

감사합니다! 사실 그것은 내 자연스러운 경향이었습니다 (엘리먼트 ("name")을 시도했지만 Visual Studio에서는 전달할 수있는 유일한 인수는 XName이므로 문자열을 사용하려고 시도조차하지 않았으며 XName을 만드는 방법을 알아 내라. 그래, 완벽하게 작동한다. (적어도, 컴파일러는 거기에 문자열을 두는 것을 꺼리지 않는다. 아직 테스트하지는 않았지만 괜찮을 것이라고 생각한다.) 감사합니다! – Asmor

+0

그래, 거의 보편적으로 사용되는 문자열에서 XName으로의 암시 적 변환을 사용하고 있습니다 :) –

+0

Xml은 "인텔리 센스"가 지적 할 정도로 지장이 없습니다. 개발자는 문자열이 암시 적으로 변환됩니다. – Peter