func (xmlNode *XmlNode) addPreviousSibling(node Node) (err error) { nodeType := node.NodeType() if nodeType == XML_DOCUMENT_NODE || nodeType == XML_HTML_DOCUMENT_NODE { err = ERR_CANNOT_MAKE_DUCMENT_AS_CHILD return } nodePtr := node.NodePtr() if xmlNode.NodePtr() == nodePtr { return } ret := xmlNode.isAccestor(nodePtr) if ret < 0 { return } else if ret == 0 { if !xmlNode.Document.RemoveUnlinkedNode(nodePtr) { C.xmlUnlinkNodeWithCheck((*C.xmlNode)(nodePtr)) } C.xmlAddPrevSibling(xmlNode.Ptr, (*C.xmlNode)(nodePtr)) } else if ret > 0 { node.Remove() } /* childPtr := C.xmlAddPrevSibling(xmlNode.Ptr, (*C.xmlNode)(nodePtr)) if nodeType == XML_TEXT_NODE && childPtr != (*C.xmlNode)(nodePtr) { //check the retured pointer //if it is not the text node just added, it means that the text node is freed because it has merged into other nodes //then we should invalid this node, because we do not want to have a dangling pointer //xmlNode.Document.AddUnlinkedNode(unsafe.Pointer(nodePtr)) } */ return }
// CreateElementNS Create an element with the given namespace func (xp *Xp) createElementNS(prefix, element string, context *C.xmlNode, before *C.xmlNode) (newcontext *C.xmlNode) { ns := C.xmlNewNs(nil, namespaces[prefix].ns_uri, namespaces[prefix].prefix) // candidate for cache ... if ns == nil { panic("ns is nil") } celement := unsafe.Pointer(C.CString(element)) newelement := C.xmlNewDocNode(xp.doc, ns, (*C.xmlChar)(celement), nil) C.free(celement) if before != nil { newcontext = C.xmlAddPrevSibling(before, newelement) } else { if context == nil { context = C.xmlDocGetRootElement(xp.doc) } newcontext = C.xmlAddChild(context, newelement) } return }
func (xmlNode *XmlNode) addPreviousSibling(node Node) (err error) { nodeType := node.NodeType() if nodeType == XML_DOCUMENT_NODE || nodeType == XML_HTML_DOCUMENT_NODE { err = ERR_CANNOT_MAKE_DUCMENT_AS_CHILD return } nodePtr := node.NodePtr() if xmlNode.NodePtr() == nodePtr { return } ret := xmlNode.isAccestor(nodePtr) if ret < 0 { return } else if ret == 0 { if !xmlNode.Document.RemoveUnlinkedNode(nodePtr) { C.xmlUnlinkNodeWithCheck((*C.xmlNode)(nodePtr)) } C.xmlAddPrevSibling(xmlNode.Ptr, (*C.xmlNode)(nodePtr)) } else if ret > 0 { node.Remove() } return }
// xmlAddPrevSibling func (cur *Node) AddPrevSibling(elem Node) *Node { return makeNode(C.xmlAddPrevSibling(cur.Ptr, elem.Ptr)) }