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


Автор: chip_and_dayl 24.10.2012, 11:09
Всем привет.

есть след. структура xml

Код

<hermesTerminals>
        <sol>2578789</sol>
        <sol>4545545</sol>
  </hermesTerminals>



моя задача найти sol который содержит 4545545

для этого написал 

Код

IEnumerable<XElement> sol =
                    from el in root.Elements(@"hermesTerminals")
                    where ((string)el.Element(@"sol") == serialNumber)
                    select el;


Но в данном случае это запрос вернет запись в том случае, если она будет первой стоять. Как сделать, что сверялись все записи а не по первой?

Автор: chip_and_dayl 24.10.2012, 11:35
Код

IEnumerable<XElement> sol =
                    from el in root.Elements(@"hermesTerminals")
                        where //((string)el.Element(@"sol") == serialNumber)
                            (from add in el.Elements("sol")
                                where
                                    (string)add == serialNumber 
                             select add).Any()

                    select el;

Автор: lomaster 24.10.2012, 11:41
Вы и смотрите только в 1 первом sol, а надо по всем ходить. xpath в условии прикрутите.

Еще проще так
IEnumerable<XElement> sol = root.XPathSelectElements("hermesTerminals[sol='4545545']");
только вы не sol-ы берете, а hermesTerminals.

Автор: Kolovorot 24.10.2012, 15:15
Цитата(lomaster @ 24.10.2012,  11:41)
Вы и смотрите только в 1 первом sol, а надо по всем ходить. 

Ничего подобного. Запрос возвращает элемент hermesTerminals у которого в перечислении элементов sol, есть элемент sol со значение serialNumber.

Добавлено через 6 минут и 28 секунд
Вам же нужно сделать так, если Вы конечно хотите сделать это именно методами Linq to XML:
Код

XElement sol = root.Elements("sol").FirstOrDefault(e => e.Value == "4545545");

Автор: lomaster 24.10.2012, 15:28
Цитата

Ничего подобного
 вы про что говорите?

Автор: Kolovorot 24.10.2012, 15:36
 О том что запрос
Код

IEnumerable<XElement> sol =
                    from el in root.Elements(@"hermesTerminals")
                        where //((string)el.Element(@"sol") == serialNumber)
                            (from add in el.Elements("sol")
                                where
                                    (string)add == serialNumber 
                             select add).Any()
                    select el;


смотрит только в первом sol.

Автор: lomaster 24.10.2012, 15:46
Я писал про топик, просто 2 пост пришел раньше. долго я писал. smile

А дописал, когде увидил и его...

Автор: Kolovorot 24.10.2012, 15:48
Понятно smile 

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