tcp接收xml数据解析

避免tcp接收xml数据时加上xml数据长度,根据xml数据特点来解析recv到的xml数据

 int nPos1 = 0;
 int nPos2 = 0;
 int nTempPos = 0;
 int nXmlParseStep = 0;
 std::string strRequest;
 std::string strXmlNode;
 char szXmlData[1024] = {0};

strcpy(szXmlData, "<?xml version=\"1.0\"?><Alarmstatus Num=1><Item><DeviceID></DeviceID><DutyStatus>OFFDUTY</DutyStatus></Item></Alarmstatus>");

int nXmlLen = strlen(szXmlData);

 strRequest += std::string(szXmlData, nXmlLen);
 if(nXmlParseStep == 0)       //找到xml header <?xml version="1.0"?>
 {
   nPos1 = strRequest.find("<?", 0);
   if(nPos1 != std::string::npos)
   {
    nPos2 = strRequest.find("?>", nPos1+1);
    if(nPos2 != std::string::npos)
     nXmlParseStep = 1;
   }
 }
  
 if(nXmlParseStep == 1)
 {
   nPos1 = strRequest.find("<", nPos2+1);
   if(nPos1 != std::string::npos)
   {
    nPos2 = strRequest.find(">", nPos1+1);
    if(nPos2 != std::string::npos)
    {
     nXmlParseStep = 2;
     nTempPos = strRequest.find(" ", nPos1+1);      //避免有子属性,如<Alarmstatus Num=1>
     if(nTempPos  == std::string::npos)
      strXmlNode = strRequest.substr(nPos1+1, nPos2-nPos1-1);
     else
      strXmlNode = strRequest.substr(nPos1+1, nTempPos-nPos1-1);
    }
   }
 }
  
 if(nXmlParseStep == 2)
 {
   nPos1 = strRequest.find("</"+strXmlNode+">", nPos2+1);
   if(nPos1 != std::string::npos)
   {
    nXmlParseStep = 0;
    nPos1 = nPos2 = 0;
    strRequest.erase(0, std::string::npos);
   }
 }


 

 

posted @ 2013-06-20 18:49  jlins  阅读(746)  评论(0编辑  收藏  举报