I want to sort a XML file with LINQ. The XML is below and is only an example. Normally it is much bigger and more complex. The XML should be sorted by title, ascending. Not
The XML should be sorted by title, ascending. Not the whole XML at once, but every parentNode for itself. Leafs are always at the bottom. Folder or non-leafs are at the top.
This solution seems to fit your requirements:
public static void SortXml(XElement node)
{
node.ReplaceNodes(node.Elements("Node")
.OrderBy(x => (string)x.Attribute("leaf"))
.ThenBy(x => (string)x.Attribute("title")));
foreach (var childNode in node.Elements("Node"))
SortXml(childNode);
}
...
XDocument doc = XDocument.Load("test.xml");
SortXml(doc.Root);
All child nodes are sorted by the value of the leaf attribute first (uses the fact that "no" comes before "yes" in alphabetical order), and by title secondary. All first level child nodes are sorted in this fashion, then repeat recursively using each of those child nodes as input.
Output:
<Node title="text99" leaf="no">
<Node title="text80" leaf="no">
<Node title="text71" leaf="no">
<Node title="text67" leaf="no">
<Node title="text66" leaf="yes" />
</Node>
<Node title="text70" leaf="no">
<Node title="text68" leaf="yes" />
<Node title="text69" leaf="yes" />
</Node>
<Node title="text64" leaf="yes" />
<Node title="text65" leaf="yes" />
</Node>
<Node title="text79" leaf="no">
<Node title="text76" leaf="no">
<Node title="text74" leaf="yes" />
<Node title="text75" leaf="yes" />
</Node>
<Node title="text78" leaf="no">
<Node title="text77" leaf="yes" />
<Node title="text78" leaf="yes" />
</Node>
<Node title="text72" leaf="yes" />
<Node title="text73" leaf="yes" />
</Node>
<Node title="text62" leaf="yes" />
<Node title="text63" leaf="yes" />
</Node>
<Node title="text89" leaf="no">
<Node title="text85" leaf="no">
<Node title="text83" leaf="yes" />
<Node title="text84" leaf="yes" />
</Node>
<Node title="text88" leaf="no">
<Node title="text86" leaf="yes" />
<Node title="text87" leaf="yes" />
</Node>
<Node title="text81" leaf="yes" />
<Node title="text82" leaf="yes" />
</Node>
<Node title="text98" leaf="no">
<Node title="text94" leaf="no">
<Node title="text92" leaf="yes" />
<Node title="text93" leaf="yes" />
</Node>
<Node title="text97" leaf="no">
<Node title="text95" leaf="yes" />
<Node title="text96" leaf="yes" />
</Node>
<Node title="text90" leaf="yes" />
<Node title="text91" leaf="yes" />
</Node>
<Node title="text60" leaf="yes" />
<Node title="text61" leaf="yes" />
</Node>