我需要一些帮助解析Linq的XML

时间:2011-08-20 17:49:00

标签: c# xml linq parsing linq-to-xml

我是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结构的知识。

感谢您的帮助。 道格

1 个答案:

答案 0 :(得分:0)

看起来你想要之类的东西

High = (int)x.Descendants("temperature")
            .Single(e => (string)e.Attribute("class") == "high")

这会找到 temperature后代(如果没有或多个,它将​​抛出)具有值为class的属性high,然后进行强制转换它的值为整数。

但目前尚不完全清楚。

forecast元素是否有多个 temperatures个元素? temperatures元素可以包含多个temperatureclass == "high"元素吗?您想如何处理不同的unitTypes

要获取元素,您可以执行以下操作:

Highs = x.Descendants("temperature")
         .Where(e => (string)e.Attribute("class") == "high")