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