Sorting XML using LINQ

后端 未结 1 684
感情败类
感情败类 2020-12-18 12:05

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

相关标签:
1条回答
  • 2020-12-18 12:12

    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>
    
    0 讨论(0)
提交回复
热议问题