Пример #1
0
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);
}
Пример #2
0
/******************************************************************************
 **函数名称: 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;
}