如何嵌套此LINQ查询?

时间:2014-06-03 00:31:06

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

我正在尝试查询来自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设置适当的属性?

2 个答案:

答案 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;
        }
    });