Search code examples
c#xmllinqxml-parsingxmldocument

How to sort children of an element in XmlDocument in C#?


I've an XML document of type System.Xml.XmlDocument as following:

<root>

  <group>
    <dog order="1" />
    <cat order="4" />
    <cat order="3" />
    <dog order="7" />
    <dog order="5" />
    <cat order="6" />
    <dog order="2" />
  </group>

  <other/>

</root>

I want it to be like

<root>

  <group>
    <dog order="1" />
    <dog order="2" />
    <cat order="3" />
    <cat order="4" />
    <dog order="5" />
    <cat order="6" />
    <dog order="7" />
  </group>

  <other/>

</root>

I've tried various codes online but none of them is working for me. I've also converted my XmlDocument to XDocument to work with LINQ as follows:

var xDoc = XDocument.Parse(xdoc.OuterXml);

yet still no success.

I need to sort children inside group element XmlDocument


Solution

  • One option is to remove the elements and add them again after sorting.

    XDocument doc  = XDocument.Load(filename);
    var elements = doc.Root.Element("group").Elements().ToList();  // Copy the elements.
    
    doc.Root.Element("group").RemoveAll();                         // Remove the elements from the document.
    doc.Root.Element("group").Add(elements.OrderBy(x=>int.Parse(x.Attribute("order").Value)));
    //Add them again after sorting.
    

    Check this Demo

    Output

     <root>
      <group>
        <dog order="1" />
        <dog order="2" />
        <cat order="3" />
        <cat order="4" />
        <dog order="5" />
        <cat order="6" />
        <dog order="7" />
      </group>
    </root>