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。
引用两个问题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。