📄 node.c
字号:
while( childNode != NULL ) { childNode->parentNode = ( IXML_Node * ) newElement; childNode = childNode->nextSibling; } newElement->n.nextSibling = NULL; } newNode = ( IXML_Node * ) newElement; break; case eATTRIBUTE_NODE: case eTEXT_NODE: case eCDATA_SECTION_NODE: case eDOCUMENT_NODE: newNode = ixmlNode_cloneNodeTreeRecursive( nodeptr, deep ); 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; } // by spec, the duplicate node has no parent newNode->parentNode = NULL; return newNode;}/*================================================================* ixmlNode_cloneNode* Clones a node, if deep==TRUE, clones subtree under nodeptr.* External function.* Returns:* the cloned node or NULL if error occurs.**=================================================================*/IXML_Node *ixmlNode_cloneNode( IN IXML_Node * nodeptr, IN BOOL deep ){ IXML_Node *newNode; IXML_Attr *newAttrNode; if( nodeptr == NULL ) { return NULL; } switch ( nodeptr->nodeType ) { case eATTRIBUTE_NODE: newAttrNode = ixmlNode_cloneAttrDirect( ( IXML_Attr * ) nodeptr ); return ( IXML_Node * ) newAttrNode; break; default: newNode = ixmlNode_cloneNodeTree( nodeptr, deep ); return newNode; break; }}/*================================================================* ixmlNode_getChildNodes* Returns a IXML_NodeList of all the child nodes of nodeptr.* External function.* *=================================================================*/IXML_NodeList *ixmlNode_getChildNodes( IN IXML_Node * nodeptr ){ IXML_Node *tempNode; IXML_NodeList *newNodeList; int rc; if( nodeptr == NULL ) { return NULL; } newNodeList = ( IXML_NodeList * ) malloc( sizeof( IXML_NodeList ) ); if( newNodeList == NULL ) { return NULL; } ixmlNodeList_init( newNodeList ); tempNode = nodeptr->firstChild; while( tempNode != NULL ) { rc = ixmlNodeList_addToNodeList( &newNodeList, tempNode ); if( rc != IXML_SUCCESS ) { ixmlNodeList_free( newNodeList ); return NULL; } tempNode = tempNode->nextSibling; } return newNodeList;}/*================================================================* ixmlNode_getAttributes* returns a namedNodeMap of attributes of nodeptr* External function.* Returns:**=================================================================*/IXML_NamedNodeMap *ixmlNode_getAttributes( IN IXML_Node * nodeptr ){ IXML_NamedNodeMap *returnNamedNodeMap = NULL; IXML_Node *tempNode; int rc; if( nodeptr == NULL ) { return NULL; } if( nodeptr->nodeType == eELEMENT_NODE ) { returnNamedNodeMap = ( IXML_NamedNodeMap * ) malloc( sizeof( IXML_NamedNodeMap ) ); if( returnNamedNodeMap == NULL ) { return NULL; } ixmlNamedNodeMap_init( returnNamedNodeMap ); tempNode = nodeptr->firstAttr; while( tempNode != NULL ) { rc = ixmlNamedNodeMap_addToNamedNodeMap( &returnNamedNodeMap, tempNode ); if( rc != IXML_SUCCESS ) { ixmlNamedNodeMap_free( returnNamedNodeMap ); return NULL; } tempNode = tempNode->nextSibling; } return returnNamedNodeMap; } else { // if not an ELEMENT_NODE return NULL; }}/*================================================================* ixmlNode_hasChildNodes* External function.**=================================================================*/BOOLixmlNode_hasChildNodes( IXML_Node * nodeptr ){ if( nodeptr == NULL ) { return FALSE; } return ( nodeptr->firstChild != NULL );}/*================================================================* ixmlNode_hasAttributes* External function.**=================================================================*/BOOLixmlNode_hasAttributes( IXML_Node * nodeptr ){ if( nodeptr != NULL ) { if( ( nodeptr->nodeType == eELEMENT_NODE ) && ( nodeptr->firstAttr != NULL ) ) { return TRUE; } } return FALSE;}/*================================================================* ixmlNode_getElementsByTagNameRecursive* Recursively traverse the whole tree, search for element* with the given tagname.* Internal to parser.**=================================================================*/voidixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n, IN char *tagname, OUT IXML_NodeList ** list ){ const char *name; if( n != NULL ) { if( ixmlNode_getNodeType( n ) == eELEMENT_NODE ) { name = ixmlNode_getNodeName( n ); if( strcmp( tagname, name ) == 0 || strcmp( tagname, "*" ) == 0 ) { ixmlNodeList_addToNodeList( list, n ); } } ixmlNode_getElementsByTagNameRecursive( ixmlNode_getFirstChild ( n ), tagname, list ); ixmlNode_getElementsByTagNameRecursive( ixmlNode_getNextSibling ( n ), tagname, list ); }}/*================================================================* ixmlNode_getElementsByTagName* Returns a nodeList of all descendant Elements with a given * tagName, in the order in which they are encountered in a* traversal of this element tree.* External function. **=================================================================*/voidixmlNode_getElementsByTagName( IN IXML_Node * n, IN char *tagname, OUT IXML_NodeList ** list ){ const char *name; assert( n != NULL && tagname != NULL ); if( ixmlNode_getNodeType( n ) == eELEMENT_NODE ) { name = ixmlNode_getNodeName( n ); if( strcmp( tagname, name ) == 0 || strcmp( tagname, "*" ) == 0 ) { ixmlNodeList_addToNodeList( list, n ); } } ixmlNode_getElementsByTagNameRecursive( ixmlNode_getFirstChild( n ), tagname, list );}/*================================================================* ixmlNode_getElementsByTagNameNSRecursive* Internal function to parser. * **=================================================================*/voidixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n, IN char *namespaceURI, IN char *localName, OUT IXML_NodeList ** list ){ const DOMString nsURI; const DOMString name; if( n != NULL ) { if( ixmlNode_getNodeType( n ) == eELEMENT_NODE ) { name = ixmlNode_getLocalName( n ); nsURI = ixmlNode_getNamespaceURI( n ); if( ( name != NULL ) && ( nsURI != NULL ) && ( strcmp( namespaceURI, nsURI ) == 0 || strcmp( namespaceURI, "*" ) == 0 ) && ( strcmp( name, localName ) == 0 || strcmp( localName, "*" ) == 0 ) ) { ixmlNodeList_addToNodeList( list, n ); } } ixmlNode_getElementsByTagNameNSRecursive( ixmlNode_getFirstChild ( n ), namespaceURI, localName, list ); ixmlNode_getElementsByTagNameNSRecursive( ixmlNode_getNextSibling ( n ), namespaceURI, localName, list ); }}/*================================================================* ixmlNode_getElementsByTagNameNS* Returns a nodeList of all the descendant Elements with a given* local name and namespace URI in the order in which they are* encountered in a preorder traversal of this Elememt tree. * External function.**=================================================================*/voidixmlNode_getElementsByTagNameNS( IN IXML_Node * n, IN char *namespaceURI, IN char *localName, OUT IXML_NodeList ** list ){ const DOMString nsURI; const DOMString name; assert( n != NULL && namespaceURI != NULL && localName != NULL ); if( ixmlNode_getNodeType( n ) == eELEMENT_NODE ) { name = ixmlNode_getLocalName( n ); nsURI = ixmlNode_getNamespaceURI( n ); if( ( name != NULL ) && ( nsURI != NULL ) && ( strcmp( namespaceURI, nsURI ) == 0 || strcmp( namespaceURI, "*" ) == 0 ) && ( strcmp( name, localName ) == 0 || strcmp( localName, "*" ) == 0 ) ) { ixmlNodeList_addToNodeList( list, n ); } } ixmlNode_getElementsByTagNameNSRecursive( ixmlNode_getFirstChild( n ), namespaceURI, localName, list );}/*================================================================* ixmlNode_setNodeName* Internal to parser only.**=================================================================*/intixmlNode_setNodeName( IN IXML_Node * node, IN DOMString qualifiedName ){ int rc = IXML_SUCCESS; assert( node != NULL ); if( node->nodeName != NULL ) { free( node->nodeName ); node->nodeName = NULL; } if( qualifiedName != NULL ) { // set the name part node->nodeName = strdup( qualifiedName ); if( node->nodeName == NULL ) { return IXML_INSUFFICIENT_MEMORY; } rc = Parser_setNodePrefixAndLocalName( node ); if( rc != IXML_SUCCESS ) { free( node->nodeName ); } } return rc;}/*================================================================* ixmlNode_setNodeProperties* Internal to parser only.**=================================================================*/intixmlNode_setNodeProperties( IN IXML_Node * destNode, IN IXML_Node * src ){ int rc; assert( destNode != NULL || src != NULL ); rc = ixmlNode_setNodeValue( destNode, src->nodeValue ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } rc = ixmlNode_setLocalName( destNode, src->localName ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } rc = ixmlNode_setPrefix( destNode, src->prefix ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } // set nodetype destNode->nodeType = src->nodeType; return IXML_SUCCESS; ErrorHandler: if( destNode->nodeName != NULL ) { free( destNode->nodeName ); destNode->nodeName = NULL; } if( destNode->nodeValue != NULL ) { free( destNode->nodeValue ); destNode->nodeValue = NULL; } if( destNode->localName != NULL ) { free( destNode->localName ); destNode->localName = NULL; } return IXML_INSUFFICIENT_MEMORY;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -