解析xml格式字符串的函数族。
// xml格式的字符串的内容如下:
// <filename>/tmp/_public.h</filename><mtime>2020-01-01 12:20:35</mtime><size>18348</size>
// <filename>/tmp/_public.cpp</filename><mtime>2020-01-01 10:10:15</mtime><size>50945</size>
// xmlbuffer:待解析的xml格式字符串。
// fieldname:字段的标签名。
// value:传入变量的地址,用于存放字段内容,支持bool、int、insigned int、long、
// unsigned long、double和char[]。
// 注意,当value参数的数据类型为char []时,必须保证value数组的内存足够,否则可能发生
// 内存溢出的问题,也可以用ilen参数限定获取字段内容的长度,ilen的缺省值为0,表示不限长度。
// 返回值:true-成功;如果fieldname参数指定的标签名不存在,返回失败。
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,char *value,const int ilen=0);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,bool *value);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,int *value);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,unsigned int *value);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,long *value);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,unsigned long *value);
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,double *value);
----cpp
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,char *value,const int ilen)
{
if (value==0) return false;
if (ilen>0) memset(value,0,ilen+1);
char *start=0,*end=0;
char m_SFieldName[51],m_EFieldName[51];
int m_NameLen = strlen(fieldname);
SNPRINTF(m_SFieldName,sizeof(m_SFieldName),50,"<%s>",fieldname);
SNPRINTF(m_EFieldName,sizeof(m_EFieldName),50,"</%s>",fieldname);
start=0; end=0;
start = (char *)strstr(xmlbuffer,m_SFieldName);
if (start != 0)
{
end = (char *)strstr(start,m_EFieldName);
}
if ((start==0) || (end == 0))
{
return false;
}
int m_ValueLen = end - start - m_NameLen - 2 ;
if ( ((m_ValueLen) <= ilen) || (ilen == 0) )
{
strncpy(value,start+m_NameLen+2,m_ValueLen); value[m_ValueLen]=0;
}
else
{
strncpy(value,start+m_NameLen+2,ilen); value[ilen]=0;
}
DeleteLRChar(value,' ');
return true;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,bool *value)
{
if (value==0) return false;
(*value) = false;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,10) == true)
{
ToUpper(strTemp);
if (strcmp(strTemp,"TRUE")==0) { (*value)=true; return true; }
}
return false;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,int *value)
{
if (value==0) return false;
(*value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,50) == true)
{
(*value) = atoi(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,unsigned int *value)
{
if (value==0) return false;
(*value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,50) == true)
{
(*value) = (unsigned int)atoi(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,long *value)
{
if (value==0) return false;
(*value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,50) == true)
{
(*value) = atol(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,unsigned long *value)
{
if (value==0) return false;
(*value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,50) == true)
{
(*value) = (unsigned long)atol(strTemp); return true;
}
return false;
}
bool GetXMLBuffer(const char *xmlbuffer,const char *fieldname,double *value)
{
if (value==0) return false;
(*value) = 0;
char strTemp[51];
memset(strTemp,0,sizeof(strTemp));
if (GetXMLBuffer(xmlbuffer,fieldname,strTemp,50) == true)
{
(*value) = atof(strTemp); return true;
}
return false;
}
---测试
struct st_player
{
char name[51];
char no[6];
bool striker;
int age;
double weight;
long sal;
char club[51];
}stplayer;
int main()
{
memset(&stplayer,0,sizeof(struct st_player));
char buffer[301];
STRCPY(buffer,sizeof(buffer),"<name>西施</name><no>10</no><striker>true</striker><age>30</age><weight>68.5</weight><sal>21000000</sal><club>Barcelona</club>");
GetXMLBuffer(buffer,"name",stplayer.name,50);
GetXMLBuffer(buffer,"no",stplayer.no,5);
GetXMLBuffer(buffer,"striker",&stplayer.striker);
GetXMLBuffer(buffer,"age",&stplayer.age);
GetXMLBuffer(buffer,"weight",&stplayer.weight);
GetXMLBuffer(buffer,"sal",&stplayer.sal);
GetXMLBuffer(buffer,"club",stplayer.club,50);
printf("name=%s,no=%s,striker=%d,age=%d,weight=%.1f,sal=%ld,club=%s\n",\
stplayer.name,stplayer.no,stplayer.striker,stplayer.age,\
stplayer.weight,stplayer.sal,stplayer.club);
}