Ejemplo n.º 1
0
        public virtual XmlAttribute InsertBefore(XmlAttribute newNode, XmlAttribute refNode)
#endif
        {
            if (newNode.OwnerDocument != ownerDocument)
            {
                throw new ArgumentException("different document created this newNode.");
            }

            ownerDocument.onNodeInserting(newNode, null);

            int pos = Count;

            if (refNode != null)
            {
                for (int i = 0; i < Count; i++)
                {
                    XmlNode n = Nodes [i] as XmlNode;
                    if (n == refNode)
                    {
                        pos = i;
                        break;
                    }
                }
                if (pos == Count)
                {
                    throw new ArgumentException("refNode not found in this collection.");
                }
            }
            SetNamedItem(newNode, pos, false);

            ownerDocument.onNodeInserted(newNode, null);

            return(newNode);
        }
Ejemplo n.º 2
0
        internal XmlNode InsertBefore(XmlNode newChild, XmlNode refChild, bool checkNodeType, bool raiseEvent)
        {
            if (checkNodeType)
            {
                CheckNodeInsertion(newChild, refChild);
            }

            if (newChild == refChild)
            {
                return(newChild);
            }

            IHasXmlChildNode l = (IHasXmlChildNode)this;

            XmlDocument ownerDoc = (NodeType == XmlNodeType.Document) ? (XmlDocument)this : OwnerDocument;

            if (raiseEvent)
            {
                ownerDoc.onNodeInserting(newChild, this);
            }

            if (newChild.ParentNode != null)
            {
                newChild.ParentNode.RemoveChild(newChild, checkNodeType);
            }

            if (newChild.NodeType == XmlNodeType.DocumentFragment)
            {
                // This recursively invokes events. (It is compatible with MS implementation.)
                XmlNode ret = null;
                while (newChild.FirstChild != null)
                {
                    var c = this.InsertBefore(newChild.FirstChild, refChild);
                    ret = ret ?? c;
                }
                return(ret);
            }
            else
            {
                XmlLinkedNode newLinkedChild = (XmlLinkedNode)newChild;
                newLinkedChild.parentNode = this;

                if (refChild == null)
                {
                    // newChild is the last child:
                    // * set newChild as NextSibling of the existing lastchild
                    // * set LastChild = newChild
                    // * set NextSibling of newChild as FirstChild
                    if (l.LastLinkedChild != null)
                    {
                        XmlLinkedNode formerFirst = (XmlLinkedNode)FirstChild;
                        l.LastLinkedChild.NextLinkedSibling = newLinkedChild;
                        l.LastLinkedChild = newLinkedChild;
                        newLinkedChild.NextLinkedSibling = formerFirst;
                    }
                    else
                    {
                        l.LastLinkedChild = newLinkedChild;
                        l.LastLinkedChild.NextLinkedSibling = newLinkedChild;                           // FirstChild
                    }
                }
                else
                {
                    // newChild is not the last child:
                    // * if newchild is first, then set next of lastchild is newChild.
                    //   otherwise, set next of previous sibling to newChild
                    // * set next of newChild to refChild
                    XmlLinkedNode prev = refChild.PreviousSibling as XmlLinkedNode;
                    if (prev == null)
                    {
                        l.LastLinkedChild.NextLinkedSibling = newLinkedChild;
                    }
                    else
                    {
                        prev.NextLinkedSibling = newLinkedChild;
                    }
                    newLinkedChild.NextLinkedSibling = refChild as XmlLinkedNode;
                }
                switch (newChild.NodeType)
                {
                case XmlNodeType.EntityReference:
                    ((XmlEntityReference)newChild).SetReferencedEntityContent();
                    break;

                case XmlNodeType.Entity:
                    break;

                case XmlNodeType.DocumentType:
                    break;
                }

                if (raiseEvent)
                {
                    ownerDoc.onNodeInserted(newChild, newChild.ParentNode);
                }
                return(newChild);
            }
        }