2012-01-24 4 views
1

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

<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() 

      }); 

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

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

Спасибо.

+0

Существует довольно хорошая документация делать все это с большим количеством образцов: - http://msdn.microsoft.com/en-us/library/bb387061. ASPX –

ответ

0

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

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 в этом отчете и извлекаем новые объекты на основе значений полей. Выглядит простой потрясающий? Это действительно так!

1

Начинает вставив .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() 

      }); 
Смежные вопросы