将linq分组为XML多层次结构

时间:2016-09-11 07:55:33

标签: c# xml linq

我有一个xml文件(student.xml)中的学生列表:

           <root>
             <row>
               <school>AAAA </school>
               <grade> G1</grade>
               <student_name>xxx</student_name>
             </row>
             <row>
               <school>AAAA </school>
               <grade> G1</grade>
               <student_name>yyy</student_name>
             </row>
            <row>
               <school>AAAA </school>
               <grade> G2</grade>
               <student_name>zzz</student_name>
            </row>
            <row>
               <school>BBB</school>
               <grade> Gr1</grade>
               <student_name>sss</student_name>
            </row>
            <row>
               <school>BBB</school>
               <grade> Gr1</grade>
               <student_name>ttt</student_name>
            </row>
         </root>

我想使用linq将同一年级的所有学生按同一年级分组,并将其保存在groupStudent.xml中

预期结果(groupStudent.xml)

               <root>
                  <row>
                     <school>AAAA </school>
                     <grade> G1</grade>
                     <students>
                       <student_name>xxx</student_name>
                       <student_name>yyy</student_name>
                     </students>
                   </row>
                   <row>
                      <school>AAAA </school>
                      <grade> G2</grade>
                      <students>
                         <student_name>zzz</student_name>
                      </students>
                   </row>
                   <row>
                      <school>BBBB</school>
                      <grade> Gr1</grade>
                      <students>
                        <student_name>sss</student_name>
                        <student_name>ttt</student_name>
                     </students>
                </row>
              </root>   

1 个答案:

答案 0 :(得分:0)

您可以这种方式继续(其中PathOld是您现有xml的路径,PathNew是您要保存新路径的路径。

        XDocument oldDoc = XDocument.Load(PathOld);

        var stGroup = oldDoc.Descendants("row").GroupBy(row =>
             new { s = row.Descendants("school").First().Value, g = row.Descendants("grade").First().Value },
             (key, gr) => new { key, list = gr}
             );


        XDocument newDoc = new XDocument();

        var root = new XElement("root");

        foreach (var item in stGroup)
        {
            var row = new XElement("row");
            row.Add(new XElement("school", item.key.s));
            row.Add(new XElement("grade", item.key.g));
            var stds = new XElement("students");
            foreach (var stud in item.list)
            {
                stds.Add(new XElement("student_name",
                    stud.Descendants("student_name").First().Value));
            }
            row.Add(stds);
            root.Add(row);
        }
        newDoc.Add(root);

        newDoc.Save(PathNew);