2010-11-19 24 views
2
<Results> 
    <ResultSet>"nothing special" Description="More of nothing" 
    <Results> 
     <Result> 
     <Body>Four in this group</Body> 
     <Body2>this is more stuff I want</Body2> 
     <Body3>This is interesting stuff I want</Body3> 
     <Body4>this is more stuff I want</Body4> 
     </Result> 
     <Result> 
     <Something1>Only 3 in the group</Something1> 
     <ID>this is more stuff I want</ID> 
     <Stuff>This is interesting stuff I want</Stuff> 
     </Result> 
     <Result> 
     <Tag1>Only 3 in the group</Tag1> 
     <Tag2>this is more stuff I want</Tag2> 
     <Tag3>This is interesting stuff I want</Tag3> 
     </Result> 
    </Results> 
    </ResultSet> 
</Results> 

<Result>ブロックをすべて引き抜くにはどうすればLinq to XMLを使用できますか?あなたが見ることができるように、各ブロックは任意の数の要素を持つことができ、それらが呼び出されることはわかりません。私の最終目標は、これらのブロックをオブジェクトにパッケージ化してから、私のアプリケーションの周りを渡すことです。XMLにLINQ - 内部要素のすべての要素をクエリする方法?

私が持っている問題は、各グループがLinqを使用して別々に分割されるわけではありません。私が得ることができる最も近いのは、すべての<Result>グループ内のすべての要素を1つの大きなリストに(Descendantsを使用して)戻すことです。

編集:これは、各<Result>グループのすべてを戻すために使用しているコードです。私は名前/値のペアを打ち破るために、このクエリのリストを反復処理する方法を理解できません。私は要素の名前を知らないので、名前でそれらを参照することはできません。最後に、各要素内の各要素の名前/値のペアをそれぞれ<Result>にしたいだけです。

var query = from item in xml.Descendants("Result") 
       select item; 

ヘルプがありますか?

おかげで、-Scott

+0

'Descendants'は "内部" のものを返すべきではありませんが'結果の要素。それは 'Result'要素のシーケンスを返さなければなりません。それは明らかに必要なものです。 「子孫」と正確には関係ないのは何ですか? –

+0

私は使用しているコードと何をしようとしているのかを表示するように投稿を更新しました。 – Scott

答えて

1

子孫は、指定された名前を持つすべての子孫ノードをつかむだろう。具体的にするには、xml.Element("ResultSet").Element("Results").Elements("Result")のようにXML階層要素を要素ごとに移動する必要があります。

これは正しい方向にあなたを指している必要があります:

var query = xml.Descendants("Result") 
       .Select(r => r.Elements() 
          .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var result in query) 
{ 
    foreach (var item in result) 
    { 
     Console.WriteLine("{0} : {1}", item.Name, item.Value); 
    } 
} 

代わりに、あなたはSelectManyを使用して、結果セットフラット化することができます

var query = xml.Descendants("Result") 
       .SelectMany(r => r.Elements() 
           .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var item in query) 
{ 
    Console.WriteLine("{0} : {1}", item.Name, item.Value); 
} 
+0

最初の例は私が探していたものです。これにより、名前/値がグループ化されたままになります。 2番目の例は、私が得たものです。あるグループがどこで始まり、どこで終わるのか分からないので、それは面倒すぎるので便利です。これは完璧です。ありがとう! – Scott

関連する問題