xml流提取
//这里的头标签 < ...>
//尾标签 形如 </ ...>
//==================================================================
</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;
}
//当然 还可以使用正则表达式 更加的简便操作