C # Linq to XML, получить родителей, когда ребенок удовлетворяет условию - PullRequest
7 голосов
/ 27 сентября 2011

Мне нужна помощь.У меня есть этот 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 ]

9 голосов
/ 27 сентября 2011
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 голос
/ 27 сентября 2011

Это хорошо работает для меня:

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;
1 голос
/ 27 сентября 2011

попробуйте это:

            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 голос
/ 27 сентября 2011

Используйте Where с вложенным Any.

var xml = XElement.Parse(yourString);
var result = xml.Elements("Parent").Where(parent => 
    parent.Elements("Child").Any(child => child.Attribute("upc").Value == "101"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...