C# Linq to XML,满足条件的子元素如何获取其父元素

8

我需要一些帮助。我有一个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的父级。

我正在学习这篇文章:基于后代节点属性选择节点,但我无法得到我想要的结果。

4个回答

10
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。希望你能够理解。


1

使用带有嵌套的AnyWhere

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

1

试试这个:

            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);

1

这对我来说很好用:

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接