4


2

ご挨拶

私は頭をLINQに巻きつけることに取り組んでいます。 このようなXMLをXDocumentオブジェクトにロードしたとします。


Group要素のすべてのItem子要素の属性値を取得したいのですが。 これが私のクエリのようなものです。

var results = l_theDoc.Elements( "Root")内のグループから要素(groupName)選択new {attrib1_val = thegroup.Element( "Item")。属性( "attrib1")。Value、attrib2_val = thegroup.Element( "Item ")。属性(" attrib2 ")。値、};

クエリは機能しますが、たとえばgroupName変数に "GroupB"が含まれる場合、3つではなく1つの結果(最初のItem要素)のみが返されます。 私は何かが足りないのですか?

4 Answer


6


XElement e = XElement.Parse(testStr);

ストリングgroupName = "GroupB"。 var items = g.Elements( "Item")のiからg.Elements( "Item")のgからnew {attr1 =(文字列)i.Attribute( "attrib1")、attr2 =(文字列)i.Attribute( " attrib2 ")};

foreach(項目内のvar項目){Console.WriteLine(item.attr1 ":" item.attr2); }


2


はい、.Element()は最初に一致した要素のみを返します。 欲しい .Elements() and you need to re-write your query somewhat:

var results = l_theDoc.Root.Elements(groupName)内のグループから選択new {items = group.Elements( "Item")内のiから選択new {attrib1_val = i.Attribute( "attrib1")値、attrib2_val = i。属性( "attrib2")。値}};


1


これが答えの問い合わせメソッド形式です。

var items = e.Elements( "GroupB").SelectMany(g => g.Elements( "Item")).Select(i => new {attr1 = i.Attribute( "attrib1")。Value、attr2 = i .Attribute( "attrib2")。値、attr3 = i.Attribute( "attrib3")。Value}).ToList()


0


別の可能性はwhere節を使うことです:

var groupName = "GroupB"; var results = doc.Descendants( "Item")の項目から、theitem.Parent.Name == groupName select new {attrib1_val = theitem.Attribute( "attrib1")。Value、attrib2_val = theitem.Attribute( "attrib2")を選択します。値、};