void xml_node_free(xml_node_t *node) { xml_attr_t *attr; int i; if (node->name) free(node->name); if (node->text) free(node->text); for (i = 0; i < node->nattributes; i++) { attr = node->attributes[i]; xml_attr_free(attr); } if (node->attributes) free(node->attributes); free(node); }
/****************************************************************************** **函数名称: xml_node_free **功 能: 释放指定节点,及其所有属性节点、子节点的内存 **输入参数: ** xml: ** node: 被释放的节点 **输出参数: **返 回: 0: 成功 !0: 失败 **实现描述: ** 1. 将孩子从链表中剔除 ** 2. 释放孩子节点及其所有子节点 **注意事项: 除释放指定节点的内存外,还必须释放该节点所有子孙节点的内存 **作 者: # Qifeng.zou # 2013.02.27 # ******************************************************************************/ int xml_node_free(xml_tree_t *xml, xml_node_t *node) { Stack_t _stack, *stack = &_stack; xml_node_t *curr = node, *parent = node->parent, *child; /* 1. 将此节点从孩子链表剔除 */ if ((NULL != parent) && (NULL != curr)) { if (xml_delete_child(xml, parent, node)) { return XML_ERR; } } if (stack_init(stack, XML_MAX_DEPTH)) { log_error(xml->log, "Init stack failed!"); return XML_ERR_STACK; } do { /* 1. 节点入栈 */ curr->temp = curr->child; if (stack_push(stack, curr)) { stack_destroy(stack); log_error(xml->log, "Push stack failed!"); return XML_ERR_STACK; } /* 2. 释放属性节点: 让孩子指针指向真正的孩子节点 */ xml_attr_free(xml, curr, child); /* 3. 选择下一个处理的节点: 从父亲节点、兄弟节点、孩子节点中 */ curr = xml_free_next(xml, stack, curr); } while(NULL != curr); if (!stack_empty(stack)) { stack_destroy(stack); log_error(xml->log, "Stack is not empty!"); return XML_ERR_STACK; } stack_destroy(stack); return XML_OK; }