вернуть все элементы XML с одинаковым именем в linq - PullRequest
4 голосов
/ 01 апреля 2009

как я могу запросить XML-файл, в котором у меня есть несколько элементов с одинаковым именем, чтобы я мог получить все элементы обратно. В настоящее время я получаю только первый результат. Мне удалось заставить его работать со следующим кодом, но он возвращает все элементы, где встречаются определенные критерии поиска. В качестве вывода я хочу получить два результата, например, в Дублине. Вопрос в том, как мне добиться этого с помощью linq to xml

Ура Крис,

Вот код

string location = "Oslo";    
var training = (from item in doc.Descendants("item")
                         where item.Value.Contains(location)

                      select  new
                         {
                             event = item.Element("event").Value,
                             event_location = item.Element("location").Value
                         }).ToList();

XML-файл выглядит так

<training>
   <item>
      <event>C# Training</event>
        <location>Prague</location>
        <location>Oslo</location>
        <location>Amsterdam</location>
        <location>Athens</location>
        <location>Dublin</location>
        <location>Helsinki</location>
   </item>       
   <item>
        <event>LINQ Training</event>
        <location>Bucharest</location>
        <location>Oslo</location>
        <location>Amsterdam</location>
        <location>Helsinki</location>
        <location>Brussels</location>
        <location>Dublin</location>
   </item>            
</training> 

Ответы [ 2 ]

5 голосов
/ 01 апреля 2009

Вы используете 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());
}

Попробуйте и посмотрите, хотите ли вы ...

0 голосов
/ 01 апреля 2009

Возможно, это не самый эффективный способ сделать это, но этот запрос работает:

var training = (from item in root.Descendants("item")
                where item.Value.Contains(location)
                select new
                {
                    name = item.Element("event").Value,
                    location = (from node in item.Descendants("location")
                               where node.Value.Equals(location)
                               select node.Value).FirstOrDefault(),
                }).ToList();

(Обратите внимание, что код не будет компилироваться, если имя свойства было event, поэтому я изменил его на name.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...