📄 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.
*
*=================================================================*/
BOOL
ixmlNode_hasChildNodes( IXML_Node * nodeptr )
{
if( nodeptr == NULL ) {
return FALSE;
}
return ( nodeptr->firstChild != NULL );
}
/*================================================================
* ixmlNode_hasAttributes
* External function.
*
*=================================================================*/
BOOL
ixmlNode_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.
*
*=================================================================*/
void
ixmlNode_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.
*
*=================================================================*/
void
ixmlNode_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.
*
*
*=================================================================*/
void
ixmlNode_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.
*
*=================================================================*/
void
ixmlNode_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.
*
*=================================================================*/
int
ixmlNode_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.
*
*=================================================================*/
int
ixmlNode_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 + -