tcp接收xml数据解析

时间:2025-05-11 13:33:38

避免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);
}
}