C#:使用属性值对 xml 个节点和子节点进行排序

C#: Sort xml nodes and childnodes using attribute value

引用两个问题here and here
我也想对子节点进行排序,但要为每个“外部”节点重置。
所以:

<Root>
    <I aa="1">
        <s aa="3"/>
        <s aa="1"/>
        <s aa="2"/>
    </I>
    <I aa="5">
        <s aa="3"/>
        <s aa="1"/>
        <s aa="2"/>
    </I>
    <I aa="3">
        <s aa="3"/>
        <s aa="1"/>
        <s aa="2"/>
    </I>
    <I aa="4">
        <s aa="3"/>
        <s aa="1"/>
        <s aa="2"/>
    </I>
</Root>

会变成:

<Root>
    <I aa="1">
        <s aa="1"/>
        <s aa="2"/>
        <s aa="3"/>
    </I>
    <I aa="3">
        <s aa="1"/>
        <s aa="2"/>
        <s aa="3"/>
    </I>
    <I aa="4">
        <s aa="1"/>
        <s aa="2"/>
        <s aa="3"/>
    </I>
    <I aa="5">
        <s aa="1"/>
        <s aa="2"/>
        <s aa="3"/>
    </I>
</Root>

我尝试了 XDocument 排序的不同变体,但语法不正确。
希望有人能帮忙,或者给我出出主意。

这里需要一些递归——每个元素都需要被克隆,其子元素按 aa 属性排序。执行此操作的方法可能如下所示:

private static XElement CopyAndSort(XElement e)
{
    var elements = e.Elements()
        .OrderBy(x => (string)x.Attribute("aa"))
        .Select(CopyAndSort);
    return new XElement(e.Name, e.Attributes(), elements);
}

如果您随后使用 Root 元素调用它,您将得到一个新的 Root 元素,其所有子元素都已排序(及其子元素已排序,依此类推)。

有关工作演示,请参阅 this fiddle