/****************************************************************************** **函数名称: xml_add_child **功 能: 给指定节点添加孩子节点 **输入参数: ** node: 需要添加孩子节点的节点 ** name: 孩子节点名 ** value: 孩子节点值 **输出参数: **返 回: 新增节点的地址 **实现描述: **注意事项: ** 1. 新建孩子节点 ** 2. 将孩子加入子节点链表尾 **作 者: # Qifeng.zou # 2013.03.01 # ******************************************************************************/ xml_node_t *xml_add_child(xml_tree_t *xml, xml_node_t *node, const char *name, const char *value) { xml_node_t *child = NULL; if (xml_is_attr(node)) { log_error(xml->log, "Can't add child for attribute node![%s]", node->name.str); return NULL; } #if defined(__XML_EITHER_CHILD_OR_VALUE__) else if (xml_has_value(node)) { log_error(xml->log, "Can't add child for the node which has value![%s]", node->name.str); return NULL; } #endif /*__XML_EITHER_CHILD_OR_VALUE__*/ /* 1. 新建孩子节点 */ child = xml_node_creat_ext(xml, XML_NODE_CHILD, name, value); if (NULL == child) { log_error(xml->log, "Create node failed![%s]", name); return NULL; } child->parent = node; /* 2. 将孩子加入子节点链表尾 */ if (NULL == node->tail) { /* 没有孩子&属性节点 */ node->child = child; } else { node->tail->next = child; } node->tail = child; xml_set_child_flag(node); return child; }
/****************************************************************************** **函数名称: xml_mark_get_name **功 能: 提取标签名,并入栈 **输入参数: ** xml: XML树 ** stack: XML栈 ** parse: 解析文件缓存信息 **输出参数: **返 回: 0: 成功 !0: 失败 **实现描述: **注意事项: ** 1. 因新建节点已加入XML树中,因此在此不必去释放新节点的内存空间 ** 2. 此时tail用来记录孩子节点链表尾 **作 者: # Qifeng.zou # 2013.02.23 # ******************************************************************************/ static int xml_mark_get_name(xml_tree_t *xml, Stack_t *stack, xml_parse_t *parse) { int len; xml_node_t *node, *top; const char *ptr = parse->ptr; /* 1. 新建节点,并初始化 */ node = xml_node_creat(xml, XML_NODE_UNKNOWN); if (NULL == node) { log_error(xml->log, "Create xml node failed!"); return XML_ERR_CREAT_NODE; } /* 2. 将节点加入XML树中 */ if (stack_empty(stack)) { if (NULL == xml->root->tail) { xml->root->child = node; } else { xml->root->tail->next = node; } xml->root->tail = node; node->parent = xml->root; xml_set_type(node, XML_NODE_CHILD); xml_set_child_flag(xml->root); } else { xml_set_type(node, XML_NODE_CHILD); top = stack_gettop(stack); node->parent = top; if (NULL == top->tail) { top->child = node; } else { top->tail->next = node; } top->tail = node; xml_set_child_flag(top); } /* 3. 确定节点名长度 */ while (XmlIsMarkChar(*ptr)) { ++ptr; } /* 4.判断标签名边界是否合法 */ if (!XmlIsMarkBorder(*ptr)) { log_error(xml->log, "XML format is wrong!\n[%-32.32s]", parse->ptr); return XML_ERR_FORMAT; } len = ptr - parse->ptr; /* 5. 提取出节点名 */ node->name.str = (char *)xml->alloc(xml->pool, len + 1); if (NULL == node->name.str) { log_error(xml->log, "Calloc failed!"); return XML_ERR_CALLOC; } strncpy(node->name.str, parse->ptr, len); node->name.len = len; node->name.str[len] = '\0'; /* 6. 将节点入栈 */ if (stack_push(stack, (void*)node)) { log_error(xml->log, "Stack push failed!"); return XML_ERR_STACK; } parse->ptr = ptr; return XML_OK; }