C# Linq to XML, get parents when a child satisfy condition C# Linq to XML, get parents when a child satisfy condition xml xml

C# Linq to XML, get parents when a child satisfy condition


XDocument doc = ...;var targetUpc = 101;var query = doc.Descendants("Parent")    .Where(p => p.Elements("Child")                 .Any(c => (int)c.Attribute("upc") == targetUpc)    );

So what the query does is select all descendant elements named Parent where any of its child elements named Child have an attribute named upc that is equal to the target upc value, targetUpc. Hopefully you should be able to follow that.


Use a Where with a nested Any.

var xml = XElement.Parse(yourString);var result = xml.Elements("Parent").Where(parent =>     parent.Elements("Child").Any(child => child.Attribute("upc").Value == "101"));


try this:

            string xml = @"<?xml version=""1.0"" encoding=""utf-8""?><MyItems>    <Parent upc=""A00000000000000000000001"" sku="""" archivo=""pantalon1.jpg"">        <Child upc=""101"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>        <Child upc=""102"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>    </Parent>    <Parent upc=""A00000000000000000000002"" sku="""" archivo=""image##.jpg"">        <Child upc=""101"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>        <Child upc=""102"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>    </Parent>    <Parent upc=""200"" sku="""" archivo=""image##.jpg"">        <Child upc=""201"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>        <Child upc=""202"" sku="""" archivo=""image##.jpg"">            <GrandChild archivo=""image##.jpg"" />        </Child>    </Parent></MyItems>";            XElement MyItems = XElement.Parse(xml);            var parents = MyItems.Elements("Parent").Where(parent => parent.Elements("Child").Any(child => child.Attribute("upc").Value == "101"));            foreach (var parent in parents)                Console.WriteLine(parent.Attribute("upc").Value);