获取XML上的嵌套元素(使用Lambda)并设置为List <object>

时间:2016-02-23 18:26:54

标签: c# xml linq lambda

我有一个嵌套了List的XML,我需要在我的类对象中的所有属性。

类别:

public class Process
{
    public Process()
    {
        Progresses = new List<Progress>();
    }

    public string Code{ get; set; }
    public List<Progress> Progresses { get; set; }
}
public class Progress
{
    public string Text { get; set; }
    public string ProgressDate { get; set; }
}

XML:

 <PROCESSES>
      <Process>
        <Number>8754639647985</Number>
        <Progress>
            <Date>09/11/2013</Date>
            <Text>Lorem lalal asdf</Text>
            <Date>10/11/2015</Date>
            <Text>Lorem lal</Text>
        </Progress>
        <Progress>
            <Date>09/12/2016</Date>
            <Text>Lorem aqwq</Text>
            <Date>10/11/2017</Date>
            <Text>Lorem qw</Text>
         </Progress>
      </Process>
      <Process>
        <Number>1121321321321321</Number>
        <Progress>
            <Date>09/11/2013</Date>
            <Text>Lorem lalal asdf</Text>
            <Date>10/11/2015</Date>
            <Text>Lorem lal</Text>
        </Progress>
        <Progress>
            <Date>09/12/2016</Date>
            <Text>Lorem aqwq</Text>
            <Date>10/11/2017</Date>
            <Text>Lorem qw</Text>
        </Progress>
      </Process>
 </PROCESSES>

到现在为止,我有这个Linq:

var _procs =
    from proc in xml.Root.Elements("Process")
    select new Process()
    {
        Code = (string)proc.Element("Number"),
        Progresses = proc.Elements("Progress")
                           .Select(c => new Progress
                           {
                              Text = (string)c.Element("Text"),
                              ProgressDate = (string)c.Element("Date")
                           }).ToList()
    };

但是有了这个,我有一个注册到每个Progress标签,而不是一个进程列表!我最大的问题是,我可以读取XML并设置为类过程,我需要在PROCESS对象的List中包含所有PROGRESS标记。

更新:  有了这个Linq,我只获得了Progress嵌套节点的第一个元素。 我该怎么做(如果使用Lambda会更好)? 非常感谢!!!

1 个答案:

答案 0 :(得分:1)

正如我在问题compra_id的评论中所提到的,必须将类声明为Progress

另一个问题是:public不是Num类的成员!

<强> [编辑]

Progress

以上查询会返回var query = xdoc.Descendants("Process") .Select(x=> new Process { Code = x.Element("Number").Value, Progresses = x.Descendants("Progress") .SelectMany((ele, j)=> ele.Elements("Date").Select((a, i)=>new{Date = a.Value, Index = i+(j*10)})) .Join(x.Descendants("Progress").SelectMany((ele, j)=> ele.Elements("Text").Select((a, i)=>new{Text = a.Value, Index = i+(j*10)})), dat => dat.Index, tex => tex.Index, (dat, tex) => new {D = dat, T = tex}) .Select(jdata=> new Progress { //Index = jdata.D.Index, ProgressDate = jdata.D.Date, Text = jdata.T.Text }).ToList<Progress>() }); 列表IEnumerable<Process>

Progresses