LINQ to XML New Question: Returning More Than One Result

Hello!

I am working on wrapping my head around LINQ. If I had some XML file, such as loaded into an XDocument object:

<Root> <GroupA> <Item attrib1="aaa" attrib2="000" attrib3="true" /> </GroupA> <GroupB> <Item attrib1="bbb" attrib2="111" attrib3="true" /> <Item attrib1="ccc" attrib2="222" attrib3="false" /> <Item attrib1="ddd" attrib2="333" attrib3="true" /> </GroupB> <GroupC> <Item attrib1="eee" attrib2="444" attrib3="true" /> <Item attrib1="fff" attrib2="555" attrib3="true" /> </GroupC> </Root> 

I would like to get the attribute values โ€‹โ€‹of all the child elements of the Item of the Group element. This is what my query looks like:

 var results = from thegroup in l_theDoc.Elements("Root").Elements(groupName) select new { attrib1_val = thegroup.Element("Item").Attribute("attrib1").Value, attrib2_val = thegroup.Element("Item").Attribute("attrib2").Value, }; 

The query works, but if, for example, the groupName variable contains "GroupB", only one result is returned (the first Item element) instead of three. Did I miss something?

+4
source share
4 answers
 XElement e = XElement.Parse(testStr); string groupName = "GroupB"; var items = from g in e.Elements(groupName) from i in g.Elements("Item") select new { attr1 = (string)i.Attribute("attrib1"), attr2 = (string)i.Attribute("attrib2") }; foreach (var item in items) { Console.WriteLine(item.attr1 + ":" + item.attr2); } 
+6
source

Yes, .Element () returns only the first matching element. You want .Elements (), and you need to re-write your request a few:

 var results = from group in l_theDoc.Root.Elements(groupName) select new { items = from i in group.Elements("Item") select new { attrib1_val = i.Attribute("attrib1").Value, attrib2_val = i.Attribute("attrib2").Value } }; 
+2
source

Here's the response request form:

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

Another possibility is to use the where clause:

 var groupName = "GroupB"; var results = from theitem in doc.Descendants("Item") where theitem.Parent.Name == groupName select new { attrib1_val = theitem.Attribute("attrib1").Value, attrib2_val = theitem.Attribute("attrib2").Value, }; 
0
source

Source: https://habr.com/ru/post/1277112/


All Articles