Как отфильтровать элементы XML с помощью запроса LINQ для одного атрибута / поля, содержащего определенную подстроку? - PullRequest
1 голос
/ 29 ноября 2011

Пример:

<Item name="item1">
    <mode = "ax, bx" />
</Item>
<Item name="item2">
    <mode = "bx, cx" />
</Item>
<Item name="item3">
    <mode = "cx, dx" />
</Item>

В приведенном выше примере я хотел бы извлечь все элементы в режимах, содержащих "cx".

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

Ваш XML в примере не очень хорошо сформирован. Предполагая, что вы имели в виду:

<Items>
  <Item name="item1">
    <mode>ax, bx</mode>
  </Item>
  <Item name="item2">
    <mode>bx, cx</mode>
  </Item>
  <Item name="item3">
    <mode>cx, dx</mode> 
  </Item>
</Items>

Вы можете сделать:

var els=from el in XDocument.Parse(inxml).Descendants("Item")
where el.Element("mode").Value.Contains("bx")
select el;
1 голос
/ 29 ноября 2011

Предполагая, что правильно сформированный документ XML:

<Items>
  <Item name="item1">
    <mode>ax, bx</mode>
  </Item>
  <Item name="item2">
    <mode>bx, cx</mode>
  </Item>
  <Item name="item3">
    <mode>cx, dx</mode> 
  </Item>
</Items>

Сделайте что-то вроде этого:

XElement items = XElement.Load(@"C:\items.xml");

var filteredItems = from item in items.Descendants("Item")
            where item.Element("mode").Value.Contains("cx")
            select item;

foreach (var item in filteredItems)
{
    Console.WriteLine(item.FirstAttribute.Value);
}

Вывод:

item2
item3
1 голос
/ 29 ноября 2011

Это недопустимый XML (режим - это имя элемента, вы можете установить его равным строке), но вы должны иметь возможность сделать что-то вроде этого, предполагая, что соответствующая строка является значением элемента:

doc.Descendants("Item").Where( item => item.Elements("mode").Any( mode => mode.Value.Contains("cx")));
...