- 论坛徽章:
- 0
|
- //
- // 对输入缓冲区 xmlStr 进行扫描,检索 xmlKey 对应标签定义数据。
- // 首尾标签检索错误时,xmlVal为空值,打印错误日志,返回 -1,
- // 成功时将 XML 报文中该标签数据保存在 xmlVal 中,返回 0.
- //
- // 注意本程序在处理时,已经对标签数据中的 space() 类信息进行删除。
- //
- // 程序中增加对简化标签 <tagName/> ====== 的支持
- //
- int getXmlKeyVal(char *xmlStr, char *xmlKey, char *xmlVal)
- {
- int len;
- char *ptr1 , // 开始标签检查指针
- *ptr2 , // 结束标签检查指针
- temp[XML_FIELDLEN]; // 保存 XML 标签的临时变量
- *xmlVal = 0x00;
- len = snprintf(temp, sizeof(temp)-1, "<%s/>", xmlKey);
- if( strstr(xmlStr, temp) ) return 0;
- // 检查到一个合法的空标签定义,根据规则,这时是没有定义数据的,程序返回。
-
- len = snprintf(temp, sizeof(temp)-1, "<%s>" , xmlKey); // xml 开始标志
- if ( (ptr1 = strstr(xmlStr, temp)) == NULL) {
- fprintf(stderr, "开始标签 [%s] 无法检索\n", temp);
- return -1;
- }
-
-
- ptr1 += len ;
- while( isspace( ptr1[0]) ) ptr1 ++;
- // 对开始标志后面的数据 前导空格 进行清理。
-
- len = snprintf(temp, sizeof(temp)-1, "</%s>" , xmlKey);
- // xml 结束标志,只需要在开始标志后面检索结束标志
-
- if ( (ptr2 = strstr(ptr1, temp)) == NULL) {
- fprintf(stderr, "结束标签 [%s] 无法检索\n", temp );
- return -1;
- }
-
- while( isspace(ptr2[-1]) && ptr2 > ptr1 ) ptr2 --;
- // 对结束标志前面的有效数据 后置空格 进行删除。
-
- if (ptr2 > ptr1){
- memcpy(xmlVal, ptr1, ptr2 - ptr1);
- xmlVal[ptr2 - ptr1] = 0x00;
- }
- return 0;
- }
复制代码
- //
- // 对 XML 报文中一个 tagName/keyName 域数据进行更新,只有原先存在该数据标签时,
- // 程序进行处理。
- //
- int updXmlTagKey(char *xmlStr, char *tagName, char *keyName, char *keyVal)
- {
- int len;
- char *ptr1,
- *ptr2,
- *bak ,
- temp[XML_FIELDLEN];
-
- len = sprintf(temp, "<%s>", tagName);
- if( (ptr1 = strstr(xmlStr, temp)) == NULL ) {
- fprintf(stderr, "检查 tagName 开始标签 %s 错误\n", temp);
- return -1;
- }
- ptr1 += len;
- // tagName 开始标签定位
-
- len = sprintf(temp, "</%s>", keyName);
- if( (ptr2 = strstr(ptr1, temp)) == NULL ) {
- fprintf(stderr, "检查 keyName 结束标签 %s 错误\n", temp);
- return -2;
- }
- // keyName 结束标签定位
-
- bak = strdup(ptr2);
- // 对结束标签以后的数据进行备份。
-
- len = sprintf(temp, "<%s>", keyName);
- if( (ptr1 = strstr(ptr1, temp)) == NULL ) {
- fprintf(stderr, "检查 keyName 开始标签 %s 错误\n", temp);
- return -3;
- }
-
- ptr1 += len;
- // keyName 开始标签定位
-
- *ptr1 = 0x00;
- sprintf(ptr1, "%s%s", keyVal ? keyVal : "", bak );
- // 将新的数据添加到XML 报文串中。
- free(bak);
-
- return 0;
- }
复制代码
以上就是从 xml 中读取数据和修改数据的例子。
[ 本帖最后由 ljmmail 于 2009-12-16 17:25 编辑 ] |
|