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;

}

 
//当然 还可以使用正则表达式 更加的简便操作
 

posted @ 2015-12-31 22:21  cloudren2020  阅读(122)  评论(0编辑  收藏  举报