c# Linq到XML,当子结点满足条件时得到父结点
本文关键字:结点 满足 条件 Linq XML | 更新日期: 2023-09-27 18:09:38
我需要一些帮助。我有这个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>
然后,我试图选择所有的"父母",其中一个"孩子"满足一个条件。例如,所有包含子元素的父元素,子属性upc等于101
我正在研究这篇文章:根据后代节点的属性选择节点
但我就是得不到我想要的
XDocument doc = ...;
var targetUpc = 101;
var query = doc.Descendants("Parent")
.Where(p => p.Elements("Child")
.Any(c => (int)c.Attribute("upc") == targetUpc)
);
因此查询所做的是选择所有名为Parent
的后代元素,其中任何名为Child
的子元素都有一个名为upc
的属性,该属性等于目标upc值targetUpc
。希望你们能跟上。
使用Where
和嵌套的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);
这对我来说很好:
var query =
from p in XDocument.Parse(xml).Root.Elements("Parent")
where (
from c in p.Elements("Child")
where c.Attribute("upc").Value == "101"
select c
).Any()
select p;