`

expat总结

 
阅读更多
#include<iostream>
#include <windows.h>
#include "expat.h"
using namespace std;

#ifdef XML_LARGE_SIZE
#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
#define  XML_FMT_INT_MOD "I64"
#else
#define XML_FMT_INT_MOD "ll"
#endif 
#else
#define XML_FMT_INT_MOD "l"
#endif

class CXMLNodeContent
{
private:
	char* m_pNodeText;
	int m_BufferSize;
	int m_CurBufferSize;
public:
	CXMLNodeContent()
	{
		m_pNodeText = NULL;
		m_BufferSize = 0;
		m_CurBufferSize = 0;
	}

	~CXMLNodeContent()
	{
		if( m_pNodeText != NULL )
		{
			delete []m_pNodeText;
			m_pNodeText - NULL;
		}

		m_BufferSize = 0;
		m_CurBufferSize = 0;
	}

	int getBufferSize()
	{
		return m_CurBufferSize;
	}

	char* getNodeContent(const wchar_t* pText)
	{
		if( pText == NULL )
		{
			m_CurBufferSize = 1;
			return NULL;
		}

		int index = 0;
		m_CurBufferSize = WideCharToMultiByte(CP_ACP,0,pText,-1,0,0,NULL,NULL);

		if( pText[0] == 10 )
		{ 
			//10为换行 32为空格
		   while( pText[index] == 10 || pText[index] ==32 && index < m_CurBufferSize ) 
		   {
			   index++;
		   }

		   if( index == m_CurBufferSize )
		   {
			   m_CurBufferSize = 1;
			   return NULL;
		   }
		}

		if( m_CurBufferSize > m_BufferSize )
		{
			if( m_pNodeText == NULL )
			{
				m_pNodeText = new char[m_CurBufferSize];
				m_BufferSize = m_CurBufferSize;
			}
			else
			{
				delete []m_pNodeText;
				m_pNodeText = new char[m_CurBufferSize];
				m_BufferSize = m_CurBufferSize;
			}
		}

		WideCharToMultiByte(CP_ACP,0,pText+index,-1,m_pNodeText,m_CurBufferSize,NULL,NULL);
		return m_pNodeText;
	}

	int printNodeContent(const wchar_t* pText)
	{
		getNodeContent(pText);
		if( m_CurBufferSize == 1 )
			return 0;
		else
		{
			printf("%s",m_pNodeText);
			return 1;
		}
	}
};

static void XMLCALL startElement(void* userData,const char* name,const char** atts)
{
	int i;
	int* depthPtr = (int*)userData;
	for(int i=0; i < *depthPtr; i++)
		putchar('\t');
	CXMLNodeContent nodeContent;
	int buf_length = MultiByteToWideChar(CP_UTF8,0,name,-1,NULL,0);
	wchar_t* buffer = new wchar_t[buf_length];
	MultiByteToWideChar(CP_UTF8,0,name,-1,buffer,buf_length);
	nodeContent.printNodeContent(buffer);
	putchar('\n');
	delete []buffer;
	*depthPtr +=1;

      //处理结点属性
      for(int i = 0; !attr[i]; i++)
      {
           string attr_name  = attr[i];
           string attr_value = attr[i+1];
      }
}

static void XMLCALL endElement(void* userData,const char* name)
{
	int *depthPtr = (int*)userData;
	*depthPtr -= 1;
}

int main()
{
  char buf[BUFSIZ];
  XML_Parser parser = XML_ParserCreate(NULL);
  FILE* p = fopen("sample.xml","rb");
  int done;
  int depth = 0;

  XML_SetUserData(parser,&depth);

  XML_SetElementHandler(parser,startElement,endElement);
  do 
  {
	  int len = (int)fread(buf,1,sizeof(buf),p);
	  done = len < sizeof(buf);
	  if( XML_Parse(parser,buf,len,done) == XML_STATUS_ERROR )
	  {
		  fprintf(stderr,
			  "%s at line %" XML_FMT_INT_MOD "u\n",
			  XML_ErrorString(XML_GetErrorCode(parser)),
			  XML_GetCurrentLineNumber(parser));
	  }
  } while (!done);
  fclose( p );
  XML_ParserFree(parser);
  system("pause");
  return 0;
}

 

    参考:

    http://blog.sina.com.cn/s/blog_55feec410100taoj.html

    http://www.cnblogs.com/LinuxHunter/archive/2010/11/29/1890710.html

   http://wenku.baidu.com/link?url=pXfTcz0Q2qjcVna6ByRePmANSVMQ4TD4RfTwweT0rVxffwZCpz6vW21oA_CUcnJW1eYS-cyuO3IT6GDy_HLHjhu8RDpw5gUAO7qzLRxjYhS

分享到:
评论

相关推荐

    expat-2.2.8

    expat

    expat-2.3.0.tar.gz

    expat-2.3.0.tar.gz

    expat2.2.6安装包

    expat2.2.6安装包

    expatexpat.dll

    expatexpat.dll

    expat-2.1.0 函数库 linux

    Expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被...

    expat-2.2.0

    linux expat

    expat解析XML文件

    使用expat解析器解析XML文件,并显示在树控件。

    如何让Expat支持中文XML

    刚刚学习使用Expat,却发现Expat并不支持中文。后来查找相关资料,得知Expat不支持gb2312编码格式,主要支持UTF-8编码格式。然而我们在程序中传递数据时,往往是用的gb2312格式文本的,于是想找出办法解决之,想到两...

    expat-2.1.1.tar.bz2

    Expat是一个用C语言开发的、用来解析XML文档的开发库,它最初是开源的、Mozilla 项目下的一个XML解析器。

    Expat-1.95.8

    Expat XML 源码,版本:1.95.8

    expat-2.0 tar

    expat, 用于安装subversion软件时使用

    VS2013编译的expat库(含32位和64位库)

    expat是一个由C语言编写的XML解析库。 James Clark创建了这个库,现在是制定XML标准的W3组织的技术leader。 现在的版本是2.0。 2.0开始就由Clark Cooper领导的开发组在 sourceforge.net 负责开发。

    支持中文的expat

    改进expat解析器,使之支持中文,测试通过

    expat-2.2.5.tar.bz2

    Expat是一个用C语言开发的、用来解析XML文档的开发库,它最初是开源的、Mozilla 项目下的一个XML解析器,这是一个源码包,可以自己编译使用

    让Expat支持中文XML示例代码

    刚学习Expat的时候,发现Expat并不支持中文XML的解析,因此对其进行了封装,内附编译好的可执行程序及测试用XML文件,命令行:ExpatSaxDemo demo.xml 详细信息参见:...

    expat2.0.1源码

    expat最新源码2.0.1

    expat-win32bin-2.0.1

    expat是一个由C语言编写的XML解析库。expat是一个基于SAX模型的、非验证(默认,v1.2开始提供验证接口,需要用户手动处理)的轻量级XML解释器。但除此之外,一个XML文档因其内容的不同还必须在语义上符合相应的标准,...

    expatxml解析器.pdf

    expatxml解析器.pdf

    expat-1.95.7.tar.gz

    expat-1.95.7.tar.gz

    expat xml解析(C语言)

    expat xml解析(C语言),还没解决中文问题,希望有高手能帮忙做下UTF8转换的通用代码,不受操作系统的限制的!!

Global site tag (gtag.js) - Google Analytics