Inheritance: System.Xml.XmlWriter
        public override XmlWriter ReplaceRange(XPathNavigator nav)
        {
            if (nav == null)
            {
                throw new ArgumentNullException();
            }

            XmlNode start = ((IHasXmlNode)navigator).GetNode();
            XmlNode end   = null;

            if (nav is IHasXmlNode)
            {
                end = ((IHasXmlNode)nav).GetNode();
            }
            if (end == null || start.ParentNode != end.ParentNode)
            {
                throw new InvalidOperationException("Argument XPathNavigator has different parent node.");
            }

            XmlDocumentInsertionWriter w =
                (XmlDocumentInsertionWriter)InsertBefore();

            // local variables to anonymous delegate
            XPathNavigator prev = Clone();

            if (!prev.MoveToPrevious())
            {
                prev = null;
            }
            XPathNavigator parentNav = Clone();

            parentNav.MoveToParent();

            w.Closed += delegate(XmlWriter writer)
            {
                XmlNode parent = start.ParentNode;
                XmlNode next;
                bool    loop = true;
                for (XmlNode n = start; loop; n = next)
                {
                    loop = n != end;
                    next = n.NextSibling;
                    parent.RemoveChild(n);
                }
                if (prev != null)
                {
                    MoveTo(prev);
                    MoveToNext();
                }
                else
                {
                    MoveTo(parentNav);
                    MoveToFirstChild();
                }
            };

            return(w);
        }
        public override XmlWriter ReplaceRange(XPathNavigator nav)
        {
            if (nav == null)
            {
                throw new ArgumentNullException();
            }
            XmlNode start = ((IHasXmlNode)this.navigator).GetNode();
            XmlNode end   = null;

            if (nav is IHasXmlNode)
            {
                end = ((IHasXmlNode)nav).GetNode();
            }
            if (end == null || start.ParentNode != end.ParentNode)
            {
                throw new InvalidOperationException("Argument XPathNavigator has different parent node.");
            }
            XmlDocumentInsertionWriter xmlDocumentInsertionWriter = (XmlDocumentInsertionWriter)this.InsertBefore();
            XPathNavigator             prev = this.Clone();

            if (!prev.MoveToPrevious())
            {
                prev = null;
            }
            XPathNavigator parentNav = this.Clone();

            parentNav.MoveToParent();
            xmlDocumentInsertionWriter.Closed += delegate(XmlWriter writer)
            {
                XmlNode parentNode = start.ParentNode;
                bool    flag       = true;
                XmlNode xmlNode    = start;
                while (flag)
                {
                    flag = (xmlNode != end);
                    XmlNode nextSibling = xmlNode.NextSibling;
                    parentNode.RemoveChild(xmlNode);
                    xmlNode = nextSibling;
                }
                if (prev != null)
                {
                    this.MoveTo(prev);
                    this.MoveToNext();
                }
                else
                {
                    this.MoveTo(parentNav);
                    this.MoveToFirstChild();
                }
            };
            return(xmlDocumentInsertionWriter);
        }