2009-06-10 6 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 }; 

そして私は、私は(私はそれを持っていたどのように元々ある)「に」を使用して1つの本当に長いクエリにそれを作ることができます実現が、それはちょうどそれがさらに緻密で困難で動作するように作られました。

私がやろうとしていることをやるための簡単な方法があるようです。

答えて

6

あなたは(正直に言うと、良いアイデアであるかもしれない)XPathSelectElements()を使用することができ、またはあなたはElements()拡張メソッドを使用できます

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

感謝を!それは実際に私の自然な傾向です(エリート(「名前」)を試していましたが、ビジュアルスタジオで渡すことができる唯一の引数はXNameなので、文字列を使用しようとしなかったし、 しかし、ええ、それは完全に動作します(または、少なくとも、コンパイラは文字列をそこに置くことに気にしません...まだテストしていませんが、それはうまくいくはずです) ありがとう! – Asmor

+0

あなたはstringからXNameへの暗黙的な変換を使用しています。これはほぼ普遍的に使用されています:) –

+0

"intellisense"が指摘するのに十分なほど苦痛である開発者は暗黙的に文字列を変換します。 – Peter