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); }
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); } }