示例#1
0
/******************************************************************************
 **函数名称: xml_set_value
 **功    能: 设置节点值
 **输入参数:
 **     xml: XML树
 **     node: XML节点
 **     value: 节点值
 **输出参数:
 **返    回: 0:成功 !0:失败
 **实现描述: 
 **注意事项: 
 **作    者: # Qifeng.zou # 2013.06.12 #
 ******************************************************************************/
int xml_set_value(xml_tree_t *xml, xml_node_t *node, const char *value)
{
    int size;
    
    if (NULL != node->value.str) {
        xml->dealloc(xml->pool, node->value.str);
        node->value.str = NULL;
        node->value.len = 0;
        xml_unset_value_flag(node);
    }

    if ((NULL == value) || ('\0' == value[0])) {
        if (xml_is_attr(node)) {
            /* 注意: 属性节点的值不能为NULL,应为“” - 防止计算XML树长度时,出现计算错误 */
            node->value.str = (char *)xml->alloc(xml->pool, sizeof(char));
            if (NULL == node->value.str) {
                return XML_ERR;
            }
            node->value.len = 0;
			
            xml_set_value_flag(node);
            return XML_OK;
        }

        xml_unset_value_flag(node);
        return XML_OK;
    }

    size = strlen(value) + 1;
    
    node->value.str = (char *)xml->alloc(xml->pool, size);
    if (NULL == node->value.str) {
        xml_unset_value_flag(node);
        return XML_ERR;
    }

    snprintf(node->value.str, size, "%s", value);
    node->value.len = size - 1;
    xml_set_value_flag(node);
    
    return XML_OK;
}
示例#2
0
/******************************************************************************
 **函数名称: xml_mark_get_value
 **功    能: 获取节点值
 **输入参数: 
 **     stack: XML栈
 **     parse: 解析文件缓存信息
 **输出参数:
 **返    回: 0: 成功  !0: 失败
 **实现描述: 
 **注意事项: 
 **作    者: # Qifeng.zou # 2013.02.23 #
 ******************************************************************************/
static int xml_mark_get_value(xml_tree_t *xml, Stack_t *stack, xml_parse_t *parse)
{
    char border = '<'; /* 取值边界 */
    int len, size = 0;
    const char *p1, *p2;
    xml_node_t *curr;
#if defined(__XML_ESC_PARSE__)
    const xml_esc_t *esc;
    xml_esc_split_t split;

    memset(&split, 0, sizeof(split));
#endif /*__XML_ESC_PARSE__*/

    curr = (xml_node_t*)stack_gettop(stack);
    if (NULL == curr) {
        return XML_ERR_STACK;
    }

    p1 = parse->ptr;

    while (XmlIsIgnoreChar(*p1)) { ++p1; }

    if (XmlIsQuotChar(*p1) || XmlIsSQuotChar(*p1)) {
        border = *p1; /* 记录取值边界 */
        ++p1;
    }

    parse->ptr = p1;
    
    /* 提取节点值: 允许节点值中出现空格和换行符 */    
    while (!XmlIsStrEndChar(*p1) && (border != *p1))
    {
    #if defined(__XML_ESC_PARSE__)
        if (XmlIsAndChar(*p1)) {
            esc = xml_esc_get(p1);

            if (xml_esc_split(esc, parse->ptr, p1-parse->ptr+1, &split)) {
                xml_esc_free(&split);
                log_error(xml->log, "Parse forwad string failed!");
                return XML_ERR;
            }

            p1 += esc->len;
            parse->ptr = p1;
        }
        else
    #endif /*__XML_ESC_PARSE__*/
        {
            p1++;
        }
    }

    if (XmlIsLPBrackChar(*p1)) {      /* 为尖括号时 */
        p2 = p1;
        p1--;
        while (XmlIsIgnoreChar(*p1)) { --p1; }
    }
    else if (XmlIsStrEndChar(*p1)) { /* 为结束符时 */
    #if defined(__XML_ESC_PARSE__)
        xml_esc_free(&split);
    #endif /*__XML_ESC_PARSE__*/
        log_error(xml->log, "XML format is wrong! MarkName:[%s]", curr->name.str);
        return XML_ERR_FORMAT;
    }
    else {                          /* 为单引号或双引号时 */
        p2 = p1 + 1;
        p1--;
        while (XmlIsIgnoreChar(*p2)) { ++p2; }

        if (!XmlIsLPBrackChar(*p2)) {
            log_error(xml->log, "XML format is wrong! [%s]", p2);
            return XML_ERR_FORMAT;
        }
    }

    len = p1 - parse->ptr + 1;
#if defined(__XML_ESC_PARSE__)
    size = xml_esc_size(&split);
#endif /*__XML_ESC_PARSE__*/
    size += len+1;

    curr->value.str = (char *)xml->alloc(xml->pool, size*sizeof(char));
    if (NULL == curr->value.str) {
    #if defined(__XML_ESC_PARSE__)
        xml_esc_free(&split);
    #endif /*__XML_ESC_PARSE__*/
        log_error(xml->log, "Calloc failed!");
        return XML_ERR_CALLOC;
    }

#if defined(__XML_ESC_PARSE__)
    if (NULL != split.head) {
        curr->value.str[0] = '\0';

        xml_esc_merge(&split, curr->value);

        strncat(curr->value.str, parse->ptr, len);
        curr->value.len = len;

        xml_esc_free(&split);
    }
    else
#endif /*__XML_ESC_PARSE__*/
    {
        strncpy(curr->value.str, parse->ptr, len);
        curr->value.len = len;
        curr->value.str[len] = '\0';
    }

    parse->ptr = p2;
    xml_set_value_flag(curr);

#if defined(__XML_EITHER_CHILD_OR_VALUE__)
    /* 判断:有数值的情况下,是否还有孩子节点 */
    if ((XML_BEGIN_FLAG == *p2) && (XML_END_FLAG == *(p2+1))) {
        return XML_OK;
    }

    log_error(xml->log, "XML format is wrong: Node have child and value at same time!");
    return XML_ERR_FORMAT;
#endif /*__XML_EITHER_CHILD_OR_VALUE__*/

    return XML_OK;
}