private void ProcessElement(ApplyElementSubNode applyElementSubNode, bool result) { if (result) { foreach (var child in new Queue <XNode>(applyElementSubNode.Element.Nodes())) { child.Remove(); applyElementSubNode.ParentApplyElement.AddBeforeSelf(child); } } else { switch (applyElementSubNode.OnNotAppliedAction) { case OnNotAppliedAction.Remove: applyElementSubNode.Element.Remove(); break; case OnNotAppliedAction.CommentOut: using (var ms = new MemoryStream()) using (var writer = new XmlTextWriter(ms, Encoding.UTF8)) using (var reader = new StreamReader(ms)) { foreach (var child in new Queue <XNode>(applyElementSubNode.Element.Nodes())) { child.WriteTo(writer); child.Remove(); } writer.Flush(); ms.Position = 0; var commentedOutNode = new XComment(reader.ReadToEnd().Trim()); applyElementSubNode.ParentApplyElement.AddBeforeSelf(commentedOutNode); if (!applyElementSubNode.OnCommentedOutComment.IsNullOrEmpty()) { var commentForCommentedOutNode = new XComment(" " + applyElementSubNode.OnCommentedOutComment + " "); commentedOutNode.AddBeforeSelf(commentForCommentedOutNode); commentForCommentedOutNode.AddAfterSelf(new XText(Environment.NewLine)); commentedOutNode.AddAfterSelf(new XText(Environment.NewLine)); commentedOutNode.AddAfterSelf(new XText(Environment.NewLine)); } } break; default: throw new NotSupportedException("OnNotAppliedAction not supported: " + applyElementSubNode.OnNotAppliedAction); } } }