LINQ to XML Select Nodes по дублированным атрибутам дочерних узлов - PullRequest
0 голосов
/ 16 ноября 2010

Нужно вытащить сотрудников, у которых есть пейджер.


<Employees>
  <Employee>
    <Name>Michael</Name>    
    <Phone Type="Home">423-555-0124</Phone>
    <Phone Type="Work">800-555-0545</Phone>
    <Phone Type="Mobile">424-555-0546</Phone>
    <Phone Type="Cell">424-555-0547</Phone>
    <Phone Type="Pager">424-555-0548</Phone>
  </Employee>
 <Employee>
    <Name>Jannet</Name>    
    <Phone Type="Home">423-555-0091</Phone>
    <Phone Type="Work">800-555-0545</Phone>
  </Employee>
</Employees>

У меня есть LINQ для получения всех телефонных узлов с пейджером, и я могу получить всех сотрудников. Я не могу обернуть голову и сверлить на телефонном узле, но все еще выбираю узел сотрудника?


var data = XElement.Load(@"employee.XML" );
var whoHasPager = from teamMember in data.Elements("Employee")
                where (string)teamMember.Element("Phone").Attribute("Type") == "Pager"
                select teamMember;

Ответы [ 6 ]

1 голос
/ 16 ноября 2010

Проблема в том, что .Element вернет первый элемент, а не все из них типа Phone.

1 голос
/ 16 ноября 2010

Как насчет этого:

var whoHasPager = from teamMember in data.Elements("Employee")
                where teamMember.Elements("Phone").Any(
                    p => p.Attribute("Type").Value == "Pager")
                select teamMember;
0 голосов
/ 16 ноября 2010

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

var whoHasPager = from teamMember in data.Elements("Employee")
                  where teamMember.Elements("Phone").Any(x => x.Attribute("Type").Value == "Pager")
                  select teamMember;
0 голосов
/ 16 ноября 2010
var whoHasPager = doc.XPathSelectElements(
    "//Employee/Phone[@Type = 'Pager']/.."
);
0 голосов
/ 16 ноября 2010

Вы можете попробовать использовать выражение XPath :

var data = XElement.Load(@"employee.XML" );
var whoHasPager =
    from teamMember in data.Elements("Employee")
    where teamMember.XPathSelectElement("Phone[@Type='Pager']") != null
    select teamMember;
0 голосов
/ 16 ноября 2010

Вы должны увидеть это как оператор SQL, может быть

SELECT employee from Employees where Phone Type='Pager'

следовательно, оператор from должен быть Employees ... Примечание: я не очень хорош в LINQ, но думаю, что идея та же самая ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...