[英]How would I use LINQ2XML in this scenario?
我的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數據來自Web服務)
<?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>
我將從將其分解成小塊開始。 首先,我將時間布局整理成更可行的形式(按布局鍵分組),並將有效的開始時間和有效的結束時間彼此關聯:
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 };
如果您想簡化某些表示形式,則可以采用其他方法(例如,可以將布局和參數展平為更“表格”的形式),這只需進行一些調整即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.