//这是一个能得到xml是否完整的例子程序,如果完整,则采用市面上长长用到的解析xml的库来解析xml:tinyxml 。或者还有一种开源库,暂时记不起来了。
// AnalysisXml.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <string.h> char szXmlRootName[64]; char szXmlRootEnd[64]; int xmlRootNameLen; int xmlRootSectionEndLen; char xmlBodyContent[128]; char* AnalysisXml(char* inBuf,int* inOffset,char* outBuf); int _tmain(int argc, _TCHAR* argv[]) { memset(xmlBodyContent,0,128); char* cXml = "<?xml version=\"1.0\"?> <body>11111</body> "; int len = strlen(cXml)+1; AnalysisXml(cXml,&len,xmlBodyContent); return 0; } char* AnalysisXml(char* inBuf,int* inOffset,char* outBuf) { char* cXml = inBuf; int len = *inOffset; if (NULL == inBuf) { return "error"; } if (len > 0) { int i = 0; memset(szXmlRootName,0,64); memset(szXmlRootEnd,0,64); memset(xmlBodyContent,0,128); //检查收到的数据中是否存在一个完整的xml文本 //一个完整的xml必须有如下格式: /** <?xml version="1.0"?> <body> …… </body> /**/ int start_pos = -1,end_pos = -1; int root_start = -1,root_end = -1; for (i=0;i<len-5;i++) { if (cXml[i] == '<' && cXml[i+1] == '?' && cXml[i+2] == 'x' || cXml[i+2] == 'X' && cXml[i+3] == 'm' || cXml[i+3] == 'M' && cXml[i+4] == 'l' || cXml[i+4] == 'L') { //找到xml的开头了 start_pos = i; break; } } if (start_pos == -1) { return "error"; } //找到第二个'<' ,从而找到xml根的名称 for(i=start_pos+1;i<len-5;i++) { if (cXml[i] == '<') { root_start = i; break; } } if (root_start == -1) { return "error"; } //找到根的'>'结束 for (i=root_start+1;i<len-5;i++) { if (cXml[i] == '>') { root_end = i; break; } } if (root_end == -1) { return "error"; } //得到xml的根名称 memcpy(szXmlRootName,cXml+root_start+1,root_end-root_start-1); xmlRootNameLen = strlen(szXmlRootName); xmlRootSectionEndLen = xmlRootNameLen + 3; _snprintf_s(szXmlRootEnd,xmlRootSectionEndLen+1,"</%s>",szXmlRootName); //查找结束 for (i=root_end+1;i<len-xmlRootSectionEndLen;i++) { if (memcmp(cXml+i,szXmlRootEnd,xmlRootSectionEndLen) == 0) { end_pos = i; break; } } memcpy(xmlBodyContent,cXml+root_end+1,end_pos-root_end-1); if (end_pos == -1) { return "error"; } end_pos += xmlRootSectionEndLen; //执行到这说明xml是完整的了 memcpy(outBuf,cXml+root_start,end_pos - start_pos); printf("%s\n",outBuf); } return outBuf; }
一个解析xml的简单方法(记录)
最新推荐文章于 2024-06-12 14:38:38 发布