工作中遇到把xml字符流中的数据写入数据库的情况,因为网上没有tinyxml处理字符流的用法,所以自己写了一个函数,解析后成员之间以回车符分隔,成员变量之间以逗号分隔。
我的xml文档结构是:Department 后面跟着Department所属员工Users,Department ...这样。思路比较线性,但是应该不会出bug。
#define DEPARTMENT_B "Depa"
#define DEPARTMENT_E "/Dep"
#define USER_B "User"
#define USER_E "/Use"
#define SKIPL while(('<'!=*from)&&('\0'!=*from))\
from++;\
from++;
#define SKIPR while(('>'!=*from)&&('\0'!=*from))\
from++;\
from++;
//convert XML string stream into string which sepetate Users and Departments with '\n'and seperate the member variables with ','.
void parse_file(char *from,char *to)
{
char temp[4];
while('\0'!=*from)
{
SKIPL
strncpy(temp,from,4);
if(0==strcmp(temp,DEPARTMENT_B))
{
while('\0'!=*from)
{
SKIPR
SKIPL
strncpy(temp,from,4);
if((0!=strcmp(temp,USER_B))&&(0!=strcmp(temp,DEPARTMENT_B)))
{
SKIPR
while('<'!=*from)
{
if('"'==*from) from++;
else *to++=*from++;
}
*to++=',';
}
else if(0==strcmp(temp,DEPARTMENT_B))
{
from--;
break;
}
else{
from--;
*to++='\n';
break;
}
}
}
else if(0==strcmp(temp,USER_B))
{
while('\0'!=*from)
{
SKIPR
SKIPL
strncpy(temp,from,4);
if((0!=strcmp(temp,USER_E))&&(0!=strcmp(temp,USER_B)))
{
SKIPR
while('<'!=*from)
{
if('"'==*from) from++;
else *to++=*from++;
}
*to++=',';
}
else
{
from--;
*to++='\n';
break;
}
}
}
else
{
SKIPR
}
}
*to='\0';
printf("%s\n",to);
return;
}