📄 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;
}
void
ixmlNode_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 + -