c#排序XElement,带注释

本文关键字:注释 XElement 排序 | 更新日期: 2023-09-27 17:49:47

我有一个表示以下xml的XElement:

<Node>
 <Child id="1" /><!-- Comment 1 -->
 <Child id="3" /><!-- Comment 3 -->
 <Child id="2" /><!-- Comment 2 -->
</Node>

我如何对Node的子元素排序,使XElement.ToString()方法返回以下内容?子元素后面的注释和文本必须移动。

<Node>
 <Child id="1" /><!-- Comment 1 -->
 <Child id="2" /><!-- Comment 2 -->
 <Child id="3" /><!-- Comment 3 -->
</Node>

c#排序XElement,带注释

假设每个元素后面都有相应的注释,请尝试以下操作:

var xDoc = XDocument.Parse(/* your xml */);
var reordered = xDoc.Root
                    .Elements("Child")
                    .Select(el => new {
                                        Element = el,
                                        Comments = el.NodesAfterSelf()
                                                     .TakeWhile(n => n.NodeType == XmlNodeType.Comment)
                                      })
                    .OrderBy(pair => (int)pair.Element.Attribute("id"))
                    .SelectMany(pair => new [] { pair.Element }.Concat(pair.Comments));
xDoc.Root.ReplaceAll(reordered);

EDIT:允许任意数量的注释(包括0);空格已处理