2014-03-12 16 views
2

我有一个表示下面的XML一个的XElement:C#排序的XElement,有评论

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

我怎么能节点的孩子排序,以便将XElement.ToString()方法返回以下? 孩子背后的评论和文字必须一起移动。

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

回答

2

假设每个元件通过相应的注释成功时,尝试以下方法:

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)编辑,以允许任何的每个元素的评论数目;空白已经处理完毕。

+0

元素和注释之间可能存在空格。也有可能有多个评论。 – TWT

+0

@TWT - 更新我的答案允许多个(或0)评论,即使对于以前的版本,空白也不是问题。 – decPL

+1

谢谢,它完美的作品:d – TWT