您的位置:首页 > 其它

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;

}

//当然 还可以使用正则表达式 更加的简便操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: