Вы используете item.Element("location")
, который возвращает первый элемент местоположения под элементом. Это не обязательно то место, которое вы искали!
Я подозреваю, что вы на самом деле хотите что-то похожее на:
string location = "Oslo";
var training = from loc in doc.Descendants("location")
where loc.Value == location
select new
{
event = loc.Parent.Element("event").Value,
event_location = loc.Value
};
Но опять же, какое значение тогда дает event_location
, учитывая, что оно всегда будет местоположением, которое вы передали в запрос?
Если это не то, что вы хотите, пожалуйста, дайте больше подробностей - ваш вопрос сейчас немного сложен для понимания. Было бы полезно узнать, что дает ваш текущий код и что вы хотите дать, а также то, что вы подразумеваете под "именем" (в том смысле, что на самом деле вы имеете в виду "значение").
РЕДАКТИРОВАТЬ: Хорошо, так звучит, как вы хотите:
string location = "Oslo";
var training = from loc in doc.Descendants("location")
where loc.Value == location
select new
{
event = loc.Parent.Element("event").Value,
event_locations = loc.Parent.Elements("location")
.Select(e => e.Value)
};
event_locations теперь будет последовательностью строк. Вы можете получить желаемый результат:
for (var entry in training)
{
Console.WriteLine("Event: {0}; Locations: {1}",
entry.event,
string.Join(", ", entry.event_locations.ToArray());
}
Попробуйте и посмотрите, хотите ли вы ...