2013-04-04 2 views
0

Возможно, кто-то может помочь с проблемой, которую у меня есть. Я получил этот XML данные:LINQ для загрузки определенных данных XML на основе значений

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<data> 
<header> 
    <version>3.1</version> 
    <date>2013-04-02</date> 
    <filedate>2013-04-02</filedate> 
</header> 
<value> 
    <TypeId>67772764</TypeId> 
    <ServiceID>GN1600</ServiceID> 
    <EvbAsof>2013-04-02</EvbAsof> 
    <Rating>2</Rating> 
    <AdditionalColumns> 
     <Name>EvbAvg</Name> 
     <Value>7.29495</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbHigh</Name> 
     <Value>12.46</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbLow</Name> 
     <Value>2.88563</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbBench</Name> 
     <Value>1.86241</Value> 
    </AdditionalColumns> 
</value> 

... ...

Мне нужно извлечь следующие данные, как набор для каждого узла:

  • Дата с заголовка узла
  • ТипID
  • ServiceID
  • Рейтинг
  • EvbAvg значение из AditionalColumns
  • значение EvbBench от AditionalColumns

мне удалось получить TypeID, ServiceID и рейтинг, но я просто не могу понять, как получить дату из заголовок и EvbAvg и EvbBench из узлов AditionalColumns все в одном запросе. Это мой код до сих пор:

var ServiceDesc = from c in XElement.Load("download.xml").Elements("value") 
         select new 
         { 
          TypeID = c.Element("TypeId").Value, 
          ServiceID = c.Element("ServiceID").Value, 
          Rating = c.Element("Rating").Value 
         } 

Если кто-то может помочь мне с этим, я буду благодарен inifinitely. большое спасибо!

ответ

0

Предполагая, что у вас есть один элемент header и один номер value, вероятно, мало что нужно для доступа к ним в виде коллекции (и если есть несколько экземпляров каждого из них, как мы их сопоставляем?).

Вы можете просто попробовать что-то выглядит следующим образом:

var doc = XElement.Load("download.xml"); 
var header = doc.Elements("header").Single(); 
var val = doc.Elements("value").Single(); 

var serviceDesc = new 
{ 
    Date = DateTime.Parse(header.Element("date").Value, 
         System.Globalization.CultureInfo.InvariantCulture), 
    TypeID = val.Element("TypeId").Value, 
    ServiceID = val.Element("ServiceID").Value, 
    Rating = val.Element("Rating").Value, 
    EbvAvg = val.Descendants("AdditionalColumns") 
       .Where(node => node.Descendants("Name").Single().Value == "EvbAvg") 
       .Select(node => node.Descendants("Value").Single().Value) 
       .Single(), 
    EbvBench = val.Descendants("AdditionalColumns") 
       .Where(node => node.Descendants("Name").Single().Value == "EvbBench") 
       .Select(node => node.Descendants("Value").Single().Value) 
       .Single()     
}; 
+0

Большое спасибо, но на самом деле у меня есть один HEADER и несколько элементов VALUE. Также выясняется, что некоторые файлы XML будут пропускать некоторые элементы (bar HEADER), поэтому мне нужно правило проверки, чтобы вставить «Нет данных» в результат для отсутствующих элементов. Это становится все труднее. Благодаря! – George

0

В конце концов мне удалось получить у поставщика файлов для изменения формата в более дружественным способом. Спасибо всем!

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