public virtual INode InsertBefore(INode newChild, INode refChild) { // TODO - handle newChild already in tree if (newChild == null) { return(null); } if (!(newChild is DomNodeImpl)) { throw new DomException(DomException.WRONG_DOCUMENT, "newChild not instanceof DomNodeImpl"); } var newCh = (DomNodeImpl)newChild; if (Adaptee.Type == Node.ROOT_NODE) { if (newCh.Adaptee.Type != Node.DOC_TYPE_TAG && newCh.Adaptee.Type != Node.PROC_INS_TAG) { throw new DomException(DomException.HIERARCHY_REQUEST, "newChild cannot be a child of this node"); } } else if (Adaptee.Type == Node.START_TAG) { if (newCh.Adaptee.Type != Node.START_TAG && newCh.Adaptee.Type != Node.START_END_TAG && newCh.Adaptee.Type != Node.COMMENT_TAG && newCh.Adaptee.Type != Node.TEXT_NODE && newCh.Adaptee.Type != Node.CDATA_TAG) { throw new DomException(DomException.HIERARCHY_REQUEST, "newChild cannot be a child of this node"); } } if (refChild == null) { Node.InsertNodeAtEnd(Adaptee, newCh.Adaptee); if (Adaptee.Type == Node.START_END_TAG) { Adaptee.Type = Node.START_TAG; } } else { Node refNode = Adaptee.Content; while (refNode != null) { if (refNode.Adapter == refChild) { break; } refNode = refNode.Next; } if (refNode == null) { throw new DomException(DomException.NOT_FOUND, "refChild not found"); } Node.InsertNodeBeforeElement(refNode, newCh.Adaptee); } return(newChild); }
public virtual INode AppendChild(INode newChild) { // TODO - handle newChild already in tree if (newChild == null) { return(null); } if (!(newChild is DomNodeImpl)) { throw new DomException(DomException.WRONG_DOCUMENT, "newChild not instanceof DomNodeImpl"); } var newCh = (DomNodeImpl)newChild; if (Adaptee.Type == Node.ROOT_NODE) { if (newCh.Adaptee.Type != Node.DOC_TYPE_TAG && newCh.Adaptee.Type != Node.PROC_INS_TAG) { throw new DomException(DomException.HIERARCHY_REQUEST, "newChild cannot be a child of this node"); } } else if (Adaptee.Type == Node.START_TAG) { if (newCh.Adaptee.Type != Node.START_TAG && newCh.Adaptee.Type != Node.START_END_TAG && newCh.Adaptee.Type != Node.COMMENT_TAG && newCh.Adaptee.Type != Node.TEXT_NODE && newCh.Adaptee.Type != Node.CDATA_TAG) { throw new DomException(DomException.HIERARCHY_REQUEST, "newChild cannot be a child of this node"); } } Node.InsertNodeAtEnd(Adaptee, newCh.Adaptee); if (Adaptee.Type == Node.START_END_TAG) { Adaptee.Type = Node.START_TAG; } return(newChild); }