📄 node.c
字号:
} // if newChild is an ancestor of nodeptr if( ixmlNode_isAncestor( newChild, nodeptr ) == TRUE ) { return IXML_HIERARCHY_REQUEST_ERR; } // if nodeptr does not allow to have newChild as children if( ixmlNode_allowChildren( nodeptr, newChild ) == FALSE ) { return IXML_HIERARCHY_REQUEST_ERR; } if( ixmlNode_isParent( nodeptr, newChild ) == TRUE ) { ixmlNode_removeChild( nodeptr, newChild, NULL ); } // set the parent node pointer newChild->parentNode = nodeptr; newChild->ownerDocument = nodeptr->ownerDocument; //if the first child if( nodeptr->firstChild == NULL ) { nodeptr->firstChild = newChild; } else { prev = nodeptr->firstChild; next = prev->nextSibling; while( next != NULL ) { prev = next; next = prev->nextSibling; } prev->nextSibling = newChild; newChild->prevSibling = prev; } return IXML_SUCCESS;}/*================================================================* ixmlNode_cloneTextNode* Returns a clone of nodeptr* Internal to parser only.**=================================================================*/IXML_Node *ixmlNode_cloneTextNode( IN IXML_Node * nodeptr ){ IXML_Node *newNode = NULL; assert( nodeptr != NULL ); newNode = ( IXML_Node * ) malloc( sizeof( IXML_Node ) ); if( newNode == NULL ) { return NULL; } else { ixmlNode_init( newNode ); ixmlNode_setNodeName( newNode, nodeptr->nodeName ); ixmlNode_setNodeValue( newNode, nodeptr->nodeValue ); newNode->nodeType = eTEXT_NODE; } return newNode;}/*================================================================* ixmlNode_cloneCDATASect* Return a clone of CDATASection node.* Internal to parser only.**=================================================================*/IXML_CDATASection *ixmlNode_cloneCDATASect( IN IXML_CDATASection * nodeptr ){ IXML_CDATASection *newCDATA = NULL; IXML_Node *newNode; IXML_Node *srcNode; assert( nodeptr != NULL ); newCDATA = ( IXML_CDATASection * ) malloc( sizeof( IXML_CDATASection ) ); if( newCDATA != NULL ) { newNode = ( IXML_Node * ) newCDATA; ixmlNode_init( newNode ); srcNode = ( IXML_Node * ) nodeptr; ixmlNode_setNodeName( newNode, srcNode->nodeName ); ixmlNode_setNodeValue( newNode, srcNode->nodeValue ); newNode->nodeType = eCDATA_SECTION_NODE; } return newCDATA;}/*================================================================* ixmlNode_cloneElement* returns a clone of element node* Internal to parser only.**=================================================================*/IXML_Element *ixmlNode_cloneElement( IN IXML_Element * nodeptr ){ IXML_Element *newElement; IXML_Node *elementNode; IXML_Node *srcNode; int rc; assert( nodeptr != NULL ); newElement = ( IXML_Element * ) malloc( sizeof( IXML_Element ) ); if( newElement == NULL ) { return NULL; } ixmlElement_init( newElement ); rc = ixmlElement_setTagName( newElement, nodeptr->tagName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } elementNode = ( IXML_Node * ) newElement; srcNode = ( IXML_Node * ) nodeptr; rc = ixmlNode_setNodeName( elementNode, srcNode->nodeName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } rc = ixmlNode_setNodeValue( elementNode, srcNode->nodeValue ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } rc = ixmlNode_setNamespaceURI( elementNode, srcNode->namespaceURI ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } rc = ixmlNode_setPrefix( elementNode, srcNode->prefix ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } rc = ixmlNode_setLocalName( elementNode, srcNode->localName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); } elementNode->nodeType = eELEMENT_NODE; return newElement;}/*================================================================* ixmlNode_cloneDoc* Returns a clone of document node* Internal to parser only.**=================================================================*/IXML_Document *ixmlNode_cloneDoc( IN IXML_Document * nodeptr ){ IXML_Document *newDoc; IXML_Node *docNode; int rc; assert( nodeptr != NULL ); newDoc = ( IXML_Document * ) malloc( sizeof( IXML_Document ) ); if( newDoc == NULL ) { return NULL; } ixmlDocument_init( newDoc ); docNode = ( IXML_Node * ) newDoc; rc = ixmlNode_setNodeName( docNode, DOCUMENTNODENAME ); if( rc != IXML_SUCCESS ) { ixmlDocument_free( newDoc ); return NULL; } newDoc->n.nodeType = eDOCUMENT_NODE; return newDoc;}/*================================================================* ixmlNode_cloneAttr* Returns a clone of attribute node* Internal to parser only**=================================================================*/IXML_Attr *ixmlNode_cloneAttr( IN IXML_Attr * nodeptr ){ IXML_Attr *newAttr; IXML_Node *attrNode; IXML_Node *srcNode; int rc; assert( nodeptr != NULL ); newAttr = ( IXML_Attr * ) malloc( sizeof( IXML_Attr ) ); if( newAttr == NULL ) { return NULL; } ixmlAttr_init( newAttr ); attrNode = ( IXML_Node * ) newAttr; srcNode = ( IXML_Node * ) nodeptr; rc = ixmlNode_setNodeName( attrNode, srcNode->nodeName ); if( rc != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return NULL; } rc = ixmlNode_setNodeValue( attrNode, srcNode->nodeValue ); if( rc != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return NULL; } //check to see whether we need to split prefix and localname for attribute rc = ixmlNode_setNamespaceURI( attrNode, srcNode->namespaceURI ); if( rc != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return NULL; } rc = ixmlNode_setPrefix( attrNode, srcNode->prefix ); if( rc != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return NULL; } rc = ixmlNode_setLocalName( attrNode, srcNode->localName ); if( rc != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return NULL; } attrNode->nodeType = eATTRIBUTE_NODE; return newAttr;}/*================================================================* ixmlNode_cloneAttrDirect* Return a clone of attribute node, with specified field set* to TRUE.**=================================================================*/IXML_Attr *ixmlNode_cloneAttrDirect( IN IXML_Attr * nodeptr ){ IXML_Attr *newAttr; assert( nodeptr != NULL ); newAttr = ixmlNode_cloneAttr( nodeptr ); if( newAttr != NULL ) { newAttr->specified = TRUE; } return newAttr;}voidixmlNode_setSiblingNodesParent( IXML_Node * nodeptr ){ IXML_Node *parentNode = nodeptr->parentNode; IXML_Node *nextptr = nodeptr->nextSibling; while( nextptr != NULL ) { nextptr->parentNode = parentNode; nextptr = nextptr->nextSibling; }}/*================================================================* ixmlNode_cloneNodeTreeRecursive* recursive functions that clones node tree of nodeptr.* Internal to parser only.* *=================================================================*/IXML_Node *ixmlNode_cloneNodeTreeRecursive( IN IXML_Node * nodeptr, IN BOOL deep ){ IXML_Node *newNode = NULL; IXML_Element *newElement; IXML_Attr *newAttr = NULL; IXML_CDATASection *newCDATA = NULL; IXML_Document *newDoc; IXML_Node *nextSib; if( nodeptr != NULL ) { switch ( nodeptr->nodeType ) { case eELEMENT_NODE: newElement = ixmlNode_cloneElement( ( IXML_Element * ) nodeptr ); newElement->n.firstAttr = ixmlNode_cloneNodeTreeRecursive( nodeptr->firstAttr, deep ); if( deep ) { newElement->n.firstChild = ixmlNode_cloneNodeTreeRecursive( nodeptr-> firstChild, deep ); if( newElement->n.firstChild != NULL ) { ( newElement->n.firstChild )->parentNode = ( IXML_Node * ) newElement; ixmlNode_setSiblingNodesParent( newElement->n. firstChild ); } nextSib = ixmlNode_cloneNodeTreeRecursive( nodeptr-> nextSibling, deep ); newElement->n.nextSibling = nextSib; if( nextSib != NULL ) { nextSib->prevSibling = ( IXML_Node * ) newElement; } } newNode = ( IXML_Node * ) newElement; break; case eATTRIBUTE_NODE: newAttr = ixmlNode_cloneAttr( ( IXML_Attr * ) nodeptr ); nextSib = ixmlNode_cloneNodeTreeRecursive( nodeptr->nextSibling, deep ); newAttr->n.nextSibling = nextSib; if( nextSib != NULL ) { nextSib->prevSibling = ( IXML_Node * ) newAttr; } newNode = ( IXML_Node * ) newAttr; break; case eTEXT_NODE: newNode = ixmlNode_cloneTextNode( nodeptr ); break; case eCDATA_SECTION_NODE: newCDATA = ixmlNode_cloneCDATASect( ( IXML_CDATASection * ) nodeptr ); newNode = ( IXML_Node * ) newCDATA; break; case eDOCUMENT_NODE: newDoc = ixmlNode_cloneDoc( ( IXML_Document * ) nodeptr ); newNode = ( IXML_Node * ) newDoc; if( deep ) { newNode->firstChild = ixmlNode_cloneNodeTreeRecursive( nodeptr-> firstChild, deep ); if( newNode->firstChild != NULL ) { newNode->firstChild->parentNode = newNode; } } break; case eINVALID_NODE: case eENTITY_REFERENCE_NODE: case eENTITY_NODE: case ePROCESSING_INSTRUCTION_NODE: case eCOMMENT_NODE: case eDOCUMENT_TYPE_NODE: case eDOCUMENT_FRAGMENT_NODE: case eNOTATION_NODE: break; } } return newNode;}/*================================================================* ixmlNode_cloneNodeTree* clones a node tree.* Internal to parser only.**=================================================================*/IXML_Node *ixmlNode_cloneNodeTree( IN IXML_Node * nodeptr, IN BOOL deep ){ IXML_Node *newNode = NULL; IXML_Element *newElement; IXML_Node *childNode; assert( nodeptr != NULL ); switch ( nodeptr->nodeType ) { case eELEMENT_NODE: newElement = ixmlNode_cloneElement( ( IXML_Element * ) nodeptr ); newElement->n.firstAttr = ixmlNode_cloneNodeTreeRecursive( nodeptr->firstAttr, deep ); if( deep ) { newElement->n.firstChild = ixmlNode_cloneNodeTreeRecursive( nodeptr->firstChild, deep ); childNode = newElement->n.firstChild;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -