我正在尝试查询来自Web服务的XML文档。但是,我不确定如何在嵌套在其他元素中的元素时查询XML。
以下是XML文件的一部分(我还没有包含所有内容,因为它是一个长文件):
<response>
<display_location>
<full>London, United Kingdom</full>
<city>London</city>
<state/>
<state_name>United Kingdom</state_name>
<country>UK</country>
<country_iso3166>GB</country_iso3166>
<zip>00000</zip>
<magic>553</magic>
<wmo>03772</wmo>
<latitude>51.47999954</latitude>
<longitude>-0.44999999</longitude>
<elevation>24.00000000</elevation>
</display_location>
<observation_location>
<full>London,</full>
<city>London</city>
<state/>
<country>UK</country>
<country_iso3166>GB</country_iso3166>
<latitude>51.47750092</latitude>
<longitude>-0.46138901</longitude>
<elevation>79 ft</elevation>
</observation_location>
我可以一次查询一个部分&#34;但是我正在从LINQ构造一个对象。例如:
var data = from i in weatherResponse.Descendants("display_location")
select new Forecast
{
DisplayFullName = i.Element("full").Value
};
var data = from i in weatherResponse.Descendants("observation_location")
select new Forecast
{
ObservationFullName = i.Element("full").Value
};
我的预测&#34; class基本上只是充满了这样的属性:
class Forecast
{
public string DisplayFullName { get; set; };
public string ObservationFullName { get; set; };
//Lots of other properties that will be set from the XML
}
然而,我需要&#34;结合&#34;所有的LINQ一起使我可以设置对象的所有属性。我已经阅读了有关嵌套LINQ的内容,但我不知道如何将其应用于这种特殊情况。
问题:如何进行&#34;嵌套/组合&#34; LINQ,以便我可以读取XML,然后使用所述XML设置适当的属性?
答案 0 :(得分:6)
一种可能的方式:
var data = from i in weatherResponse.Descendants("response")
select new Forecast
{
DisplayFullName = (string)i.Element("display_location").Element("full"),
ObservationFullName = (string)i.Element("observation_location").Element("full")
};
答案 1 :(得分:0)
另一种方式......我更喜欢以流畅的方式使用Linq扩展方法
var results = weatherResponse.Descendants()
.SelectMany(d => d.Elements())
.Where(e => e.Name == "display_location" || e.Name == "observation_location")
.Select(e =>
{
if(e.Name == "display_location")
{
return new ForeCast{ DisplayFullName = e.Element("full").Value };
}
else if(e.Name == "observation_location")
{
return new ForeCast{ ObservationFullName = e.Element("full").Value };
}
else
{
return null;
}
});