Выберите уникальные XElements (по атрибуту) с помощью фильтра, используя LinqToXml - PullRequest
7 голосов
/ 05 декабря 2008

У меня есть XML-документ, похожий на этот:

<items>
 <item cat="1" owner="14">bla</item>
 <item cat="1" owner="9">bla</item>
 <item cat="1" owner="14">bla</item>
 <item cat="2" owner="12">bla</item>
 <item cat="2" owner="12">bla</item>
</items>

Теперь я хотел бы получить всех уникальных владельцев (мне на самом деле нужно только значение атрибута владельца), принадлежащих к указанной категории, используя запрос linq. В моем примере запрос для cat 1 вернул бы список, содержащий 9 и 14. Как я могу это сделать? Синтаксис Linq предпочтительнее, чем Lambdas. Заранее спасибо;)

Ответы [ 3 ]

15 голосов
/ 05 декабря 2008

Предполагается, что фрагмент находится в itemsElement:

var distinctOwners = (from item in itemsElement.Element("item") 
 where itemElements.Attribute("cat") == 1 
select item.Attribute("owner")).Distinct();

Извинения за форматирование и отступ!

2 голосов
/ 05 декабря 2008

Попробуйте эту функцию: -

static IEnumerable<int> GetOwners(XDocument doc, string cat)
{
    return from item in doc.Descendants("item")
        where item.Attribute("cat").Value == cat
        select (int)item.Attribute("owner")).Distinct();

}
0 голосов
/ 06 декабря 2008
  XElement ele = XElement.Parse(@"<items><item cat=""1"" owner=""14"">bla</item><item cat=""1"" owner=""9"">bla</item>" +
                                @"<item cat=""1"" owner=""14"">bla</item><item cat=""2"" owner=""12"">bla</item>" +
                                @"<item cat=""2"" owner=""12"">bla</item></items>");

  int cat = 1;


  List<int> owners = ele.Elements("item")
    .Where(x=>x.Attribute("cat").Value==cat.ToString()).Select(x=>Convert.ToInt32(x.Attribute("owner").Value)).Distinct().ToList();
...