开发工具-XML格式解析类

198 阅读2分钟

解析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);   // 调用者必须保证value的空间足够,否则这里会内存溢出。
  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;     // 场上位置是否是前锋,true-是;false-不是。
  int  age;         // 年龄
  double weight;    // 体重,kg。
  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);
  // 输出结果:name=messi,no=10,striker=1,age=30,weight=68.5,sal=21000000,club=Barcelona
}