Синтаксический анализ файла XML с использованием LINQ. - PullRequest
1 голос
/ 25 января 2012

Мне нужно извлечь данные из файла XML на основе определенных значений полей.XML-файл настроен так:

<main>
 <report>
  <version>1.0</version>
  <ID>1234</ID>
  <field>
   <acel>80</acel>
   <decel>50</decel>
   <left>20</left>
   <right>10</right>
   <category>1-10</category>
  </field> 
  <field>
   <acel>30</acel>
   <decel>54</decel>
   <left>12</left>
   <right>13</right>
   <category>10-20</category>
  </field> 
  <field>
   <acel>34</acel>
   <decel>210</decel>
   <left>27</left>
   <right>9</right>
   <category>20-30</category>
  </field>
 </report>
 <report>
 ....
 </report>
</main>

В настоящее время у меня есть следующее:

var query = doc.Descendants("report")
           .Select(raw => new
           {
               version = (string)raw.Element("version"), 
               tcid = (string)raw.Element("id"),
               forces =    raw.Element("field").Elements("acel").Select(acel => (int)acel).ToList()

           });

Мне нужно найти в файле отчеты, которые соответствуют определенным идентификаторам и конкретным версиям, а затемполучите связанные поля acel, decel, left, right и т. д.

ex Мне нужно найти отчет для идентификатора 1234 и версии 1.0, и иметь все значения полей 80, 50 и т. д. Любая помощь - это здорово.У меня уже есть код, который возвращает идентификатор и версию, но у меня возникают проблемы с получением всех значений поля на основе версии и идентификатора.

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Вы начинаете с вставки .Where():

var query = doc
        .Descendants("report")
        .Where(r => r.Element("version").Value == "1.0" 
                    && r.Element("ID").Value == "1234") 
        .Select(raw => new
           {
               version = (string)raw.Element("version"), 
               tcid = (string)raw.Element("id"),
               forces = raw.Element("field").Elements("acel")
                          .Select(acel => (int)acel).ToList()

           });
0 голосов
/ 25 января 2012

Чтобы дать вам подсказку:

var xDoc = XDocument.Parse(xml);
var fields = xDoc
    .Descendants("report")
    .Where(r => (int)r.Element("ID") == 1234)
    .Elements("field")
    .Select(f => new
        {
            Acel = f.Element("acel").Value,
            Decel = f.Element("decel").Value,
        }
    );

Сначала мы выбираем report узлы и фильтруем их по тем, которые соответствуют ID из 1234 - что оставляет нас первым из вашего примера.Затем мы запрашиваем все узлы field в этом отчете и извлекаем новые объекты на основе значений полей.Выглядит просто круто?Это действительно так!

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