Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Выбрать все дочерние узлы, если узел равен...


Автор: boobonick 18.8.2013, 20:04
Здравствуйте! Не знаю как реализовать. Есть xml: 

Код

<House xsi:type="House" availToken="fgdfgdhhgghhfrtx">
        <ContractList>
            <Contract>
                <Name>Gin</Name>                
                <Classification code="NOR">Online Price</Classification>
            </Contract>
        </ContractList>
</House>
<House xsi:type="House" availToken="fgdfdfgdfgdgdh">
        <ContractList>
            <Contract>
                <Name>Lin</Name>                
                <Classification code="NOR">Offline Price</Classification>
            </Contract>
        </ContractList>
</House>

.......

Как мне при помощи linq выбрать только те узлы , в которых есть Online Price и вывести все элементы из House . Т.е. получается что первый House надо вывести, а второй уже не попадает под условие и его не выводим

Автор: boobonick 18.8.2013, 20:41

                var elements =
                    from e in xdoc.Root.Elements().Descendants()
                    where e.Name=="Name"
                    select e;


                foreach (XElement e in elements)
               {

                   Debug.WriteLine("Элемент {0} : значение = {1}", e.Name, e.Value);
               }
                   

Но мне надо чтобы выбиралось все из узла когда   where e.Name=="Name"

Автор: mihryak 20.8.2013, 17:42
Код

<?xml version="1.0" encoding="utf-8"?>
<Houses>
    <House availToken="1">
            <ContractList>
                <Contract>
                    <Name>Gin</Name>                
                    <Classification code="NOR">Online Price</Classification>
                </Contract>
            </ContractList>
    </House>
    <House availToken="2">
            <ContractList>
                <Contract>
                    <Name>Lin</Name>                
                    <Classification code="NOR">Offline Price</Classification>
                </Contract>
            </ContractList>
    </House>
    <House availToken="3">
            <ContractList>
                <Contract>
                    <Name>Lin2</Name>                
                    <Classification code="NOR">Offline Price</Classification>
                </Contract>
                <Contract>
                    <Name>Gin2</Name>                
                    <Classification code="NOR">Online Price</Classification>
                </Contract>
            </ContractList>
    </House>
</Houses>


Код

            var root = XElement.Load("xml.xml");
            var houses = root.Elements("House")
                .Where(house => house.Element("ContractList").Elements("Contract").Any(contract => contract.Element("Classification").Value == "Online Price"));

Выберет дома, у которых в списке контрактов есть Online Price

Автор: boobonick 25.8.2013, 12:28
Цитата

.Any(contract => contract.Element("Classification").Value == "Online Price"));

Вопрос, а что если несколько значений  Online Price, тест1, тест2  и необходимо чтобы выбиралось только лишь при совпадении всех условий. 

Автор: olok900 7.5.2018, 15:58
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)