2015-09-30 3 views
-1

У меня есть следующий XML:C фильтрация # LINQ XML с помощью атрибута

<PlayerSetup> 
    <CardDeck name="deckOfCards"/> 
    <Card name="one"/> 
    <Card name="two"/> 
    <Card name="three"/> 
    <Card name="four"/> 
    <Token name="four"/> 
</PlayerSetup> 

Мне нужно получить только те элементы, которые атрибуты имя = "четыре", у меня есть следующий код:

var query = from d in xdoc.Descendants("PlayerSetup") 
      where (string)d.Attribute("name").Value == "four" 
      select d; 

Что, конечно, не работает, не возвращает никаких элементов. Есть идеи ? Благодарю.

+0

Вы имеете в виду вы хотите 1) 'PlayerSetup' элементы с потомком элемента с именем атрибута =» 4"; или 2) дочерние элементы 'PlayerSetup' с атрибутом name =" four "? – dbc

+0

'name' является атрибутом' Card' not 'PlayerSetup' – Eser

+0

Да, имя является атрибутом Card, а не PlayerSetup, @Eser благодарит за ваш ответ, я был на самом деле близок к нему, но я не знал, что могу использовать несколько потомков(), чтобы «копать» в дереве xml. – Byzs

ответ

1

Вы желаете, чтобы посмотреть на DescendantsизPlayerSetup, так что берите те:

var query = from d in xdoc.Descendants("PlayerSetup").Descendants() 
      where d.Attribute("name")?.Value == "four" 
      select d; 

//query.Count == 2 

это решение использует C# 6 Синтаксис

2

Если вы хотите элементы-потомки в соответствии с лицензией "PlayerSetup" элементов name = "four", вы можете сделать:

 var query = from d in xdoc.Descendants("PlayerSetup").Descendants() 
        where (string)d.Attribute("name") == "four" 
        select d; 

Если вы хотите "PlayerSetup" элементы, которые имеют, по меньшей мере, один элемент-потомок с именем = «четыре», вы можете сделать:

 var query = from d in xdoc.Descendants("PlayerSetup") 
        where d.Descendants().Any(c => (string)c.Attribute("name") == "four") 
        select d; 
Смежные вопросы