2009-02-12 2 views
2

у меня LINQ2XML запрос работает на полпути к своей цели:Как использовать LINQ2XML в этом сценарии?

var XMLDoc = XDocument.Load("WeatherData.xml"); 

var maximums = from tempvalue in 
        XMLDoc.Descendants("temperature").Elements("value") 
       where tempvalue.Parent.Attribute("type").Value == "maximum" 
       select (string)tempvalue; 

var minimums = from tempvalue in 
        XMLDoc.Descendants("temperature").Elements("value") 
       where tempvalue.Parent.Attribute("type").Value == "minimum" 
       select (string)tempvalue; 

List<string> MaxTemps = maximums.ToList(); 
List<string> MinTemps = minimums.ToList(); 

Однако у меня возникают проблемы с получением информации о времени из документа XML, потому что я должен соответствовать информации макета ключа (см XML-комментарии), и мне интересно, что будет лучшим решением в LINQ, чтобы присоединиться к этому времени данные с моими существующими запросами:

(Кстати, этот XML-данные поступают из веб-службы)

<?xml version="1.0" encoding="utf-8"?> 
<dwml> 
    <data> 
    <time-layout> 
     <!--  Maximums Key   --> 
     <layout-key>k-p24h-n7-1</layout-key> 
     <start-valid-time>2009-02-09T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-09T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-10T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-10T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-11T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-11T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-12T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-12T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-13T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-13T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-14T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-14T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-15T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-15T19:00:00-05:00</end-valid-time> 
    </time-layout> 
    <time-layout> 
     <!--  Minimums Key   --> 
     <layout-key>k-p24h-n7-2</layout-key> 
     <start-valid-time>2009-02-08T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-09T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-09T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-10T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-10T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-11T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-11T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-12T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-12T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-13T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-13T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-14T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-14T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-15T08:00:00-05:00</end-valid-time> 
    </time-layout> 
    <parameters> 
     <!--          1st Key --> 
     <temperature type="maximum" time-layout="k-p24h-n7-1"> 
     <value>44</value> 
     <value>57</value> 
     <value>55</value> 
     <value>40</value> 
     <value>39</value> 
     <value>34</value> 
     <value>33</value> 
     </temperature> 
     <!--          2nd Key --> 
     <temperature type="minimum" time-layout="k-p24h-n7-2"> 
     <value>24</value> 
     <value>38</value> 
     <value>46</value> 
     <value>35</value> 
     <value>25</value> 
     <value>27</value> 
     <value>23</value> 
     </temperature> 
    </parameters> 
    </data> 
</dwml> 

ответ

6

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

var timeLayouts = 
    from tempvalue in XMLDoc.Descendants("time-layout") 
    let tempStartTimes = tempvalue.Elements("start-valid-time"). 
      Select((x, i) => new { Index = i, ValidDateTime = (DateTime)x }) 
    let tempEndTimes = tempvalue.Elements("end-valid-time"). 
      Select((x, i) => new { Index = i, ValidDateTime = (DateTime)x }) 
    select new 
    { 
     LayoutKey = tempvalue.Element("layout-key").Value, 
     ValidTimeRanges = 
      from s in tempStartTimes 
      from e in tempEndTimes 
      where s.Index == e.Index 
      select new 
      { 
       Index = s.Index, 
       ValidStartDateTime = s.ValidDateTime, 
       ValidEndDateTime = e.ValidDateTime 
      } 
    }; 

Тогда, я бы массировать параметры в большинстве таким же образом:

var parameters = 
    from tempvalue in XMLDoc.Descendants("temperature") 
    select new 
    { 
     TemperatureType = (string) tempvalue.Attribute("type"), 
     TimeLayout = (string) tempvalue.Attribute("time-layout"), 
     Temperatures = tempvalue.Elements("value").Select((x, i) => 
      new { Index = i, Temperature = (int)x }) 
    }; 

Оттуда, это не так трудно, чтобы получить свои максимумы и минимумы:

var maximums = 
    from p in parameters 
    where p.TemperatureType == "maximum" 
    from tl in timeLayouts 
    where tl.LayoutKey == p.TimeLayout 
    from tr in tl.ValidTimeRanges 
    from t in p.Temperatures 
    where tr.Index == t.Index 
    select new { tr.ValidStartDateTime, tr.ValidEndDateTime, 
     t.Temperature }; 

var minimums = 
    from p in parameters 
    where p.TemperatureType == "minimum" 
    from tl in timeLayouts 
    where tl.LayoutKey == p.TimeLayout 
    from tr in tl.ValidTimeRanges 
    from t in p.Temperatures 
    where tr.Index == t.Index 
    select new { tr.ValidStartDateTime, tr.ValidEndDateTime, 
     t.Temperature }; 

вы могли бы пойти некоторые другие способы с этим, если вы хотите важной простоты Некоторые из представлений (вы могли бы сгладить макеты и параметры во что-то более «табличное», например), это потребует лишь нескольких настроек.

+0

Большое вам спасибо! Я вытаскиваю свои волосы, пытаясь понять это, читаю книги, примеры кода и т. Д., И ничто не подходит для моего сценария. Ваш запрос timeLayouts будет полезен для значительной части всей службы SOAP. – M4dRefluX

+0

@ M4dRefluX: проблем нет. Если у вас есть какие-либо вопросы о специфике, не стесняйтесь спрашивать. – casperOne

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