Linq on Complex XML

时间:2015-12-01 10:31:55

标签: c# xml linq

您好我有以下XML

<Feed>
<Control>
        <Username>Fnol13</Username>
        <Password>12345</Password>          
</Control>
<Repairer>
        <RepairerName>Test</RepairerName>
        <RepairerAddress>Test</RepairerAddress>
        <RepairerTelephone>Test</RepairerTelephone>
</Repairer>
</Feed>

包含以下属性的模型类

[Serializable]
public  class Job {

    public string Username { get; set; }

    public string Password { get; set; }

    public string Reference { get; set; }

    public string RepairerAddress { get; set; }

    public string RepairerTelephone { get; set; }


}   

我正在使用以下Linq查询从XML中提取数据

var results = from job in xmlDoc.Descendants("Control")
                      select new Job {
                          Username = (string)job.Element("Username").Value,
                          Password = (string)job.Element("Password").Value


                      };
// Here I want to add as well Descendants("Repairer") using same query

        return results.ToList();

问题是可以返回后代(“控制”)但是我想得到后代(“Repairer”)并返回我的模型显示的相同列表。你能帮我写一下Linq Query吗?我确认你是我在Linq的新手。

2 个答案:

答案 0 :(得分:3)

您的模型Job看起来很混乱,因为您可能有多个Control&amp; Repairer个节点,在这种情况下,它应映射到集合。无论如何,对于当前的XML,我假设您需要第一个Repairer节点的元素,您可以这样实现: -

var results = from job in xmlDoc.Root.Elements("Control")
              let Repairer = job.Parent.Elements("Repairer").FirstOrDefault()
              select new Job
                   {
                      Username = (string)job.Element("Username"),
                      Password = (string)job.Element("Password"),
                      RepairerName = (string)Repairer.Element("RepairerName"),
                      RepairerAddress = (string)Repairer.Element("RepairerAddress"),
                      RepairerTelephone = (string)Repairer.Element("RepairerTelephone")
                   };

另外,注意(string)job.Element("Username")将为您提供节点值。无需调用Value属性。

<强>更新

使用LINQ-to-XML时可以使用XDocument: -

XDocument xmlDoc = XDocument.Load(XMLpath);

答案 1 :(得分:0)

你可以做类似的事情 -

Reference = (string)job.Parent.Descendants("Repairer").FirstOrDefault().Element("RepairerAddress").Value;