按属性排序XML文件但保留父结构[动态]

时间:2016-09-21 12:55:37

标签: c# xml linq sorting

代码如下所示:

<xx>
    <xy>
        <xz>
            <xx somestring="bbb" value= "0"...>
            <xx somestring="cad" value= "0"...>
            <xx somestring="axa" value= "0"...>
            <xx somestring="aaa" value= "0"...>
        <xz>
    <xy>
<xx>

这需要按&#34; somestring&#34;进行排序。按字母顺序排列,节点的部门是可变的,xx,xy,xz的名称也是可变的,唯一始终存在的是&#34; somestring&#34;需要以这种方式排序,但父母的顺序需要保持不变。只是

有人能帮到我吗?如果在LINQ中完成,那将是非常棒的。

提前致谢

1 个答案:

答案 0 :(得分:0)

以下是一个独立于元素名称排序的示例,只需根据Func<XElement, TKey>选择的值进行排序:

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load("../../XMLFile1.xml");
        doc.Root.Sort(el => (string)el.Attribute("bar"));
        doc.Save(Console.Out);
    }

}

public static class MyExt
{
    public static void Sort<TKey>(this XElement input, Func<XElement, TKey> selector)
    {
        input.Elements().ToList().ForEach(el => el.Sort(selector));
        input.ReplaceNodes(input.Elements().OrderBy(selector));
    }
}

输入

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <section>
    <foo bar="az">
      <baz bar="c"/>
      <baz bar="b"/>
      <baz bar="a"/>
    </foo>
    <foo bar="am"/>
  </section>
  <section>
    <div>
      <value bar="x"/>
      <value bar="d"/>
      <value bar="a"/>
    </div>
  </section>
</root>

输出

<root>
  <section>
    <foo bar="am" />
    <foo bar="az">
      <baz bar="a" />
      <baz bar="b" />
      <baz bar="c" />
    </foo>
  </section>
  <section>
    <div>
      <value bar="a" />
      <value bar="d" />
      <value bar="x" />
    </div>
  </section>
</root>

因此,对于您的示例,您将使用doc.Root.Sort(el => (string)el.Attribute("somestring"));