我是C#和XML的新手,并试图为MediaPortal开发一个小天气插件。我正试图在Visual C#2010 Express中使用Linq解析一些XML,并且遇到了障碍。
以下是我要解析的XML的一个子集:
<forecast>
<period textForecastName="Monday">Monday</period>
<textSummary>Sunny. Low 15. High 26.</textSummary>
<temperatures>
<textSummary>Low 15. High 26.</textSummary>
<temperature unitType="metric" units="C" class="high">26</temperature>
<temperature unitType="metric" units="C" class="low">15</temperature>
</temperatures>
</forecast>
到目前为止,这是我的工作代码:
XDocument loaded = XDocument.Parse(strInputXML);
var forecast = from x in loaded.Descendants("forecast")
select new
{
textSummary = x.Descendants("textSummary").First().Value,
Period = x.Descendants("period").First().Value,
Temperatures = x.Descendants("temperatures"),
Temperature = x.Descendants("temperature"),
//code to extract high e.g. High = x.Descendants(...class="high"???),
//code to extract low e.g. High = x.Descendants(...class="low"???)
};
我的代码符合我的占位符注释,但我无法弄清楚如何使用Linq从XML中提取高(26)和低(15)。我可以从“温度”手动解析它,但我希望我能学到更多关于XML结构的知识。
感谢您的帮助。 道格
答案 0 :(得分:0)
看起来你想要之类的东西:
High = (int)x.Descendants("temperature")
.Single(e => (string)e.Attribute("class") == "high")
这会找到仅 temperature
后代(如果没有或多个,它将抛出)具有值为class
的属性high
,然后进行强制转换它的值为整数。
但目前尚不完全清楚。
forecast
元素是否有多个 temperatures
个元素? temperatures
元素可以包含多个temperature
个class == "high"
元素吗?您想如何处理不同的unitTypes
?
要获取元素,您可以执行以下操作:
Highs = x.Descendants("temperature")
.Where(e => (string)e.Attribute("class") == "high")