/// <summary> /// Removes the specified child. /// Throws if the child is not currently parented by this object. /// This is O(1). /// May be safely called during enumeration of the children. /// </summary> /// <remarks> /// This is actually safe to call during enumeration of children, because it /// doesn't bother to clear the child's NextSibling (or PreviousSibling) pointers. /// To determine whether a child is unattached, check whether its parent is null, /// or whether its NextSibling and PreviousSibling point back at it. /// DO NOT BREAK THIS VERY USEFUL SAFETY CONTRACT. /// </remarks> public void RemoveChild(ProjectElement child) { ErrorUtilities.VerifyThrowArgumentNull(child, nameof(child)); ErrorUtilities.VerifyThrowArgument(child.Parent == this, "OM_NodeNotAlreadyParentedByThis"); child.ClearParent(); if (child.PreviousSibling != null) { child.PreviousSibling.NextSibling = child.NextSibling; } if (child.NextSibling != null) { child.NextSibling.PreviousSibling = child.PreviousSibling; } if (ReferenceEquals(child, FirstChild)) { FirstChild = child.NextSibling; } if (ReferenceEquals(child, LastChild)) { LastChild = child.PreviousSibling; } RemoveFromXml(child); Count--; MarkDirty("Remove element {0}", child.ElementName); }
/// <summary> /// Removes the specified child. /// Throws if the child is not currently parented by this object. /// This is O(1). /// May be safely called during enumeration of the children. /// </summary> /// <remarks> /// This is actually safe to call during enumeration of children, because it /// doesn't bother to clear the child's NextSibling (or PreviousSibling) pointers. /// To determine whether a child is unattached, check whether its parent is null, /// or whether its NextSibling and PreviousSibling point back at it. /// DO NOT BREAK THIS VERY USEFUL SAFETY CONTRACT. /// </remarks> public void RemoveChild(ProjectElement child) { ErrorUtilities.VerifyThrowArgumentNull(child, "child"); ErrorUtilities.VerifyThrowArgument(child.Parent == this, "OM_NodeNotAlreadyParentedByThis"); child.ClearParent(); if (child.PreviousSibling != null) { child.PreviousSibling.NextSibling = child.NextSibling; } if (child.NextSibling != null) { child.NextSibling.PreviousSibling = child.PreviousSibling; } if (Object.ReferenceEquals(child, FirstChild)) { FirstChild = child.NextSibling; } if (Object.ReferenceEquals(child, LastChild)) { LastChild = child.PreviousSibling; } var previousSibling = child.XmlElement.PreviousSibling; XmlElement.RemoveChild(child.XmlElement); if (XmlDocument.PreserveWhitespace) { // If we are trying to preserve formatting of the file, then also remove any whitespace // that came before the node we removed. if (previousSibling != null && previousSibling.NodeType == XmlNodeType.Whitespace) { XmlElement.RemoveChild(previousSibling); } } _count--; MarkDirty("Remove element {0}", child.ElementName); }