您的位置:首页 > 其它

一个解析xml的简单方法(记录)

2013-05-15 09:38 423 查看
//这是一个能得到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;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: