2016-09-11 2 views
0

ich eine Liste von Studenten in einer XML-Datei (student.xml) als solche haben:Gruppierung Linq to XML mehrere Hierarchien

  <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> 

Ich möchte Gruppe alle Schüler von der gleichen Schule, die von der gleichen Klasse mit Linq und speichern Sie es in groupStudent.xml

Erwartetes Ergebnis (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> 

Antwort

0

Sie auf diese Weise vorgehen kann (wo PathOld der Pfad des vorhandenen xML und PathNew wo Sie den neuen speichern möchten)

 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);