2012-06-14 2 views
0

Я хочу найти атрибут Xelement.value, у которого есть конкретный атрибут.value.Невозможно неявно преобразовать тип 'IEnumerable <XElement>' to 'bool'

string fatherName = xmlNX.Descendants("Assembly") 
          .Where(child => child.Descendants("Component") 
           .Where(name => name.Attribute("name").Value==item)) 
          .Select(el => (string)el.Attribute("name").Value); 

Как я могу получить атрибут.value? Что он говорит, что это bool?

EDITED Первоначально у меня есть следующий XML:

<Assembly name="1"> 
    <Assembly name="44" /> 
    <Assembly name="3"> 
    <Component name="2" /> 
    </Assembly> 
    </Assembly> 

Мне нужно, чтобы получить attribute.value, где его дети (XElement) имеет expecific attribute.value В этом примере, я хотел бы получить строка «3», потому что я ищу родительский элемент дочернего объекта, который имеет атрибут.value == «2»

ответ

2

Из-за того, как написаны вложенные предложения Where.

Внутренний пункт гласит

child.Descendants("Component").Where(name => name.Attribute("name").Value==item) 

Это выражение имеет результат типа IEnumerable<XElement>, поэтому внешний пункт гласит

.Where(child => /* an IEnumerable<XElement> */) 

Однако Where ожидает аргумент типа Func<XElement, bool> и здесь вы в конечном итоге прохождение в Func<XElement, IEnumerable<XElement>> - отсюда ошибка.

Я не предлагаю исправленную версию, потому что ваше намерение совершенно не ясно из данного кода, пожалуйста, обновите вопрос соответствующим образом.

Update:

Похоже, вы хотите что-то вроде этого:

xmlNX.Descendants("Assembly") 
    // filter assemblies down to those that have a matching component 
    .Where(asm => asm.Children("Component") 
        .Any(c => c.name.Attribute("name").Value==item)) 
    // select each matching assembly's name 
    .Select(asm => (string)asm.Attribute("name").Value) 
    // and get the first result, or null if the search was unsuccessful 
    .FirstOrDefault(); 
+0

Я редактировал мой вопрос. спасибо – kmxillo

+0

@kmxillo: Обновлен ответ. – Jon

1

Я думаю, что вы хотите

string fatherName = xmlNX.Descendants("Assembly") 
          .Where(child => child.Elements("Component").Any(c => (string)c.Attribute("name") == item)) 
          .Select(el => (string)el.Attribute("name")).FirstOrDefault(); 
+0

Спасибо, работал для меня – kmxillo

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