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

//这是一个能得到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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值