2


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 MaxTemps = maximums.ToList();
List MinTemps = minimums.ToList();

しかし、私はXML文書から時間情報を取得するのに苦労しています、なぜなら私はレイアウトキー情報(XMLのコメントを見てください)を一致させなければならないからです。私の既存のクエリと時間データ:

  • (ところで、このXMLデータはWebサービスから来ています) *

      k-p24h-n7-1
      2009-02-09T07:00:00-05:00
      2009-02-09T19:00:00-05:00
      2009-02-10T07:00:00-05:00
      2009-02-10T19:00:00-05:00
      2009-02-11T07:00:00-05:00
      2009-02-11T19:00:00-05:00
      2009-02-12T07:00:00-05:00
      2009-02-12T19:00:00-05:00
      2009-02-13T07:00:00-05:00
      2009-02-13T19:00:00-05:00
      2009-02-14T07:00:00-05:00
      2009-02-14T19:00:00-05:00
      2009-02-15T07:00:00-05:00
      2009-02-15T19:00:00-05:00



      k-p24h-n7-2
      2009-02-08T19:00:00-05:00
      2009-02-09T08:00:00-05:00
      2009-02-09T19:00:00-05:00
      2009-02-10T08:00:00-05:00
      2009-02-10T19:00:00-05:00
      2009-02-11T08:00:00-05:00
      2009-02-11T19:00:00-05:00
      2009-02-12T08:00:00-05:00
      2009-02-12T19:00:00-05:00
      2009-02-13T08:00:00-05:00
      2009-02-13T19:00:00-05:00
      2009-02-14T08:00:00-05:00
      2009-02-14T19:00:00-05:00
      2009-02-15T08:00:00-05:00




        44
        57
        55
        40
        39
        34
        33



        24
        38
        46
        35
        25
        27
        23

1 Answer


6


私はこれを細かく分割することから始めます。 まず、有効な開始時間と有効な終了時間を関連付けて、レイアウトキーでグループ化された、より実用的な形式に時間レイアウトをまとめます。

var timeLayouts = XMLDoc.Descendants( "time-layout")のtempvalueからtempStartTimes = tempvalue.Elements( "start-valid-time")とします。 ((x、i)=> new {Index = i、ValidDateTime =(DateTime)x})を選択して、tempEndTimes = tempvalue.Elements( "end-valid-time")とします。 ((x、i)=> new {Index = i、ValidDateTime =(DateTime)x})を選択し、new {LayoutKey = tempvalue.Element( "layout-key")を選択します。Value、ValidTimeRanges = from s in tempStartTimes in eここで、s.Index == e.Indexはnew {Index = s.Index、ValidStartDateTime = s.ValidDateTime、ValidEndDateTime = e.ValidDateTime}を選択します。

それから、私はほとんど同じ方法でパラメータをマッサージするでしょう:

var parameters = XMLDoc.Descendants( "temperature")のtempvalueからnew {TemperatureType =(文字列)tempvalue.Attribute( "type")、TimeLayout =(文字列)tempvalue.Attribute( "時間レイアウト")、Temperature = tempvalue .Elements( "value")。((x、i)=> new {Index = i、Temperature =(int)x})};を選択します。

そこから、最大値と最小値を取得するのはそれほど難しくありません。

var maximums = pのfromパラメータのp.TemperatureType == "maximum"(timelayoutsのtlから)tl.Layoutのtrからのp.TimeLayoutの有効化tr.Index == t.Indexのtからのt.ValidTimeの範囲新しい{tr.ValidStartDateTime、tr.ValidEndDateTime、t.Temperature}を選択します。

var minimums = pのfromパラメータからp.TemperatureType == "minimum"のtlからtL.LayoutKey == p.TimeLayoutのtrからtl.ValidTimeの範囲のtからp.Temperatures tr.Index == t.Index新しい{tr.ValidStartDateTime、tr.ValidEndDateTime、t.Temperature}を選択します。

いくつかの表現を単純化したい場合(たとえば、レイアウトやパラメータをより「表形式」に平坦化することができる場合)、これには他にもいくつかの方法があります。