xml流提取
2015-12-31 22:20
253 查看
//这里的头标签 < ...>
//尾标签 形如 </ ...>
//==================================================================
//尾标签 形如 </ ...>
//==================================================================
</pre><pre class="objc" name="code">#include<stdio.h> #include<stdlib.h> #include<string.h> //函数功能:扫描字符串到指定位置处的头尾标签,进行比较 //传入参数: // xml:字符串首地址 // pos:查询结束位置 //传出返回值: // 头标签数-尾标签数 //实质:找当前位置之前未曾匹配的标签 int Scan2Current(char *xml,char *pos) { char *tmp=xml;//暂存指针 char *anchorPos;//定位指针 '<' int startno=0;//头标签数 int endno=0;//尾标签数 //循环扫描,计算标签数目 while(tmp<pos) { anchorPos=strchr(tmp,'<'); if(NULL == anchorPos) { printf("未寻找到标签\n"); break; } /*特殊情况: * < t1> <t2>...</t1> * pos[0]='t',t1前有空格 */ if(anchorPos > pos) break; if(anchorPos[1]=='/') endno++;//尾标签+1 else startno++;//头标签+1 tmp=anchorPos; tmp++; } //看当前标签是否是头标签,若是结果-1 //这里主要是计算前面未匹配的标签数 //例如:<a><b><b/><t1>... //pos指向t1... //此时t1为头标签,前面未曾匹配的还有a 1个 int ret=checkifstart(pos);//判断当前指向的标签是不是头标签 if(ret != 1) //尾标签 return startno-endno; else return startno-endno-1; } //检测当前指向的位置所在是不是头标签 int checkifstart(char *pos) { int flag=1;//头标签 while(pos != NULL && *pos != '<') { pos--; if(*pos == '/') flag--; } return flag; } void strtokTest(char *src,char dest[10][10]) { char *tmp=(char *)malloc(100); strcpy(tmp,src); char *saveptr; char *token; int i=0; token=strtok_r(tmp,"/",&saveptr); while(NULL != token) { strcpy(dest[i],token); i++; token=strtok_r(NULL,"/",&saveptr); } } //传出 pos指针数组 void getkeyPos(char *xml,char *token,char *pos[],int index) { int ret=0; pos[index]=strstr(xml,token); ret=Scan2Current(xml,pos[index]); //比较未曾匹配的标签数是不是等于位置数组中的下表index //若是,则位置正确 //root/a3 //这表明root之前没有未曾匹配的标签 //而a3之前只有root这一未曾匹配的标签 while(ret !=index) { pos[index]++; pos[index]=strstr(pos[index],token); //这里的定位还有待完善 比如 < q1 root > 的情况 还需要再进行两次检验 //一次检验前边除了空格只有< 或者 </ 还有检验后边除了空格只有> ret=Scan2Current(xml,pos[index]); }//找到正确的pos! } int main(void) { char keysrc[100]="root/a1/a1"; char keytoken[10][10]={0}; strtokTest(keysrc,keytoken); char xml[300]; strcpy(xml, "<root>\n\ <a1><a1>a1value1</a1></a1>\n\ <a2>value2\n\ <a3>value2-3</a3>\n\ </a2>\n\ <a3>value3</a3>\n\ <a4>value4</a4>\n\ </root>"); char * tokenPos[10]; int i=0; while(strcmp(keytoken[i],"")!=0) { getkeyPos(xml,keytoken[i],tokenPos,i); tokenPos[i]+=strlen(keytoken[i])+1; i++; }//找到头标签 i--; int ret=1; char* pos=tokenPos[i]; while(ret != -1 ) { pos=strstr(pos,keytoken[i]); ret=Scan2Current(tokenPos[i],pos); pos++; } while(*pos!='<') pos--;//找到尾标签 //打印 char *tmpPos=tokenPos[i]; while(tmpPos < pos) { printf("%c",*tmpPos); tmpPos++; } return 0; } //当然 还可以使用正则表达式 更加的简便操作
相关文章推荐
- ReactNativeiOS(三)开发零碎3 warning: Each child in ar array or integrator should have a unique "key" prop
- shell脚本编程<一>:变量及脚本中数学计算
- WCF初见
- Android编程实用代码合集
- Codeforces 611C New Year and Domino(dp)
- $_SERVER['REQUEST_URI']
- linux运维实战练习案例-2015年12月20日-12月31日(第一次)
- 动画
- 7.读取数据
- 安卓res资源混淆器
- <LeetCode OJ>Contains Duplicate【217】
- 查找第K小的数 BFPRT算法
- 高级IO
- ip/ifcfg/ss/nmcli/等命令及相关配置文件编辑
- Angularjs 开始之Hello world
- Android native splash for game
- 一个分布式服务器集群架构方案
- python中元组的常用方法
- rpm/yum/源码包编译等操作说明
- 写给2015