2014-01-15 2 views
1

Возможно ли вернуть список элементов на основе двух совпадающих значений атрибутов. Я пробовал следующее без успеха.Linq XDocument возвращает список элементов, основанный на 2 значениях атрибутов

var query = xdoc.Root.Elements("Root") 
.Where(x => x.Attribute("Name").Value == "Value1") 
.Where(x => x.Attribute("Name").Value == "Value2") 
.Select(x => (string)x.Element("ElementName"); 

Вот Примерная структура XML

<Region Name="Leeds"> 
     <Group> 
      <Data1>Some data 1</Data1> 
      <Data2>Some data 2</Data2> 
     </Group> 
<Group> 
      <Data1>Some data 1</Data1> 
      <Data2>Some data 2</Data2> 
     </Group> 

    </Region> 
    <Region Name="Armley"> 
     <Group> 
      <Data1>Some data 3</Data1> 
      <Data2>Some data 4</Data2> 
     </Group> 
    </Region> 

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

+0

Разве вы просто не хотите 'ИЛИ'? – paqogomez

ответ

1

Вы, вероятно, нужно использовать или ||, чтобы получить записи, где атрибут name имеют либо value1 или value2. Вышеприведенное заявление будет отфильтровывать записи, которые имеют значение1 для имени атрибута, и затем он будет применять фильтр, имя атрибута должно иметь значение2, что невозможно, если значение1 не равно значению2.

var query = xdoc.Root.Elements("Root") 
.Where(x => x.Attribute("Name").Value == "Value1" || x.Attribute("Name").Value == "Value2") 
.Select(x => (string)x.Element("ElementName"); 
3

Вы можете использовать || в той же Where пункта как предложено @Adil или использовать Contains:

var names = new [] { "Value1", "Value2" }; 

var query = xdoc.Root.Elements("Root") 
        .Where(x => names.Contains((string)x.Attribute("Name"))) 
        .Select(x => (string)x.Element("ElementName"); 

Я также изменил XAttribute.Value к (string)XAttribute, чтобы сделать его более безопасным.

+0

Thats любопытно, что делает литье в строку более безопасным, чтобы получить значение? – paqogomez

+0

Он не будет вызывать 'NullReferenceException', когда атрибут с заданным именем не существует в этом элементе. – MarcinJuraszek

+0

Блестящий, как обычно. – paqogomez

Смежные вопросы