2014-03-12 47 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