/****************************************************************************** **函数名称: 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; }
/****************************************************************************** **函数名称: 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; }