zoukankan      html  css  js  c++  java
  • 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);
       }
     }
    


     

  • 相关阅读:
    Leetcode & CTCI ---Day 4
    Leetcode & CTCI ---Day 3
    Leetcode & CTCI ---Day 2
    Leetcode & CTCI ---Day 1
    编码格式坑之UTF-8
    15. 3Sum
    第十六周助教总结-第二组
    第十五周助教总结-第二组
    第十四周助教总结-第二组
    第十三周助教总结-第二组
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3146760.html
Copyright © 2011-2022 走看看