`

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-1.95.7.tar.gz

    总结来说,`expat-1.95.7.tar.gz` 是一个开源的XML解析库,提供了一种高效、跨平台的方式来处理XML数据。无论是为了学习XML解析的原理,还是为了在实际项目中使用,这个库都是一个非常有价值的工具。

    expat-2.2.5.tar.bz2

    总结起来,expat-2.2.5.tar.bz2是一个在Linux环境中用C语言编写的XML解析库,通过事件驱动的方式帮助开发者处理XML数据。了解并熟练使用expat库,对于在Linux系统中进行XML相关开发的程序员来说,是提高效率和保证...

    centos7 升级 expat2.5

    **正文** 在IT安全领域,定期更新和修补系统组件是至关...总结来说,升级CentOS 7中的Expat库至2.5版本是一项关键的安全措施,旨在修复潜在的漏洞,保护系统不受攻击。通过遵循上述步骤,您可以安全地完成这一过程。

    expat-2.4.1.tar.gz

    总结,expat-2.4.1是Linux环境中一个强大且高效的XML解析库,适用于对性能有较高要求的项目。通过理解其基本工作原理和使用方法,开发者可以轻松地在自己的应用中集成XML解析功能,实现数据的交换和处理。

    PHP XML Expat 解析器.md

    ### PHP XML Expat 解析...**总结**:Expat解析器作为一种高效的XML解析工具,适用于需要处理大量XML数据的应用场景。通过对回调函数的设置,开发者能够灵活地控制XML文档的解析过程,从而实现对数据的有效处理和利用。

    PHP XML Expat解析器知识点总结

    在处理XML时,使用Expat解析器的基本步骤通常包括初始化解析器、设置事件处理器、读取XML数据和释放解析器资源。以下是一个简单的例子,展示如何使用PHP的Expat解析器处理XML文件: 首先,需要创建一个XML解析器...

    PHP 和 XML: 使用expat函数(二)

    总结来说,这篇文章主要介绍了如何利用PHP的expat函数库,结合自定义的PHP类,解析XML文档并将内容转换成HTML格式。通过`newsboy`类的设计,我们可以看到XML解析的基本流程,包括创建解析器,设置事件处理函数,以及...

    expat.rar_Linux/Unix编程_Unix_Linux_

    总结来说,Expat是一个在Linux/Unix系统中广泛使用的XML解析库,通过其小巧高效的特性,为开发者提供了处理XML数据的强大工具。无论是简单的数据解析还是复杂的网络通信,Expat都能胜任。通过熟练掌握Expat,开发者...

    PHP 和 XML: 使用expat函数(三)

    总结一下,使用PHP和Expat解析XML的主要步骤包括: - 引入Expat函数或封装的类。 - 创建解析器实例并配置参数。 - 注册回调函数以处理XML事件。 - 启动解析过程。 - 处理解析结果。 - 清理资源。 通过这种方式,...

    expat:跨Elixir库的可重用,可组合模式

    **总结** "expat"库是Elixir社区的一个项目,旨在提供一套可重用且可组合的模式,以促进代码的模块化和库之间的协同工作。它利用了Elixir的模式匹配、宏、类型系统和守卫等特性,来实现高效且灵活的代码设计。通过...

    libexpat-20190313 XML处理库 最新源代码

    总结,libexpat是XML解析的利器,尤其在内存有限或需要高性能解析的环境中。20190313版本的源代码更新为开发者提供了最新的开发资源,便于他们根据自身需求进行定制和优化。了解并掌握libexpat的使用,将极大地提升...

    PythonMeccCCCD.doc

    ### 总结 以上分析揭示了Python标准库中不同模块间的代码相似性和潜在的代码重用现象。这对于理解Python内部模块的设计理念、代码复用策略以及提高代码质量具有重要意义。通过这些案例的学习,我们不仅可以了解...

    Linux(CentOS6.2)下安装SVN服务

    #### 四、总结 完成上述步骤后,SVN服务已经在Linux (CentOS 6.2) 上成功安装。需要注意的是,在安装过程中遇到的任何问题,都需要仔细排查解决。此外,安装完成后还需要进一步配置SVN仓库、权限等,才能真正投入...

    ganglia安装文档--亲自安装成功

    #### 六、总结 通过以上步骤,我们可以成功在CentOS 5系统上安装并配置好Ganglia监控系统。需要注意的是,实际操作时可能会遇到一些意料之外的情况,这时需要耐心排查问题,逐一解决。此外,对于生产环境,还应考虑...

    linux DBUS 实例讲解

    #### 五、总结 通过上述分析可以看出,D-Bus不仅提供了一种高效、简洁的方式来实现进程间通信,而且还具有灵活的命名机制和强大的路由功能。无论是对于系统级的开发还是桌面应用的开发,D-Bus都是一种非常有用的...

    oracle静默安装总结文档

    expat \ gcc \ gcc-c++ \ glibc \ glibc-common \ glibc-devel \ glibc-headers \ libaio \ libaio-devel \ libgcc \ libstdc++ \ libstdc++-devel \ make \ pdksh \ sysstat \ unixODBC \ unixODBC-devel ``` **...

    jingle-cross_compile

    ### 六、总结 通过上述步骤,不仅可以成功地在主机上安装和配置Libjingle,还可以将其部署到目标设备上,从而实现基于Google Talk服务器的P2P通信功能。在整个过程中,需要注意细节,特别是依赖关系的处理,以确保...

    腾讯云sdk使用流程.docx

    总结 腾讯云 SDK 的使用流程包括交叉编译所需的环境依赖、交叉编译 curl 库、交叉编译 apr 库、交叉编译 apr-util 库等步骤。每个步骤都需要正确安装依赖库,否则可能会出现错误。在使用腾讯云 SDK 之前,需要仔细...

    symbian XML解析工具(压缩包)

    总结一下,这个"Symbian XML解析工具(压缩包)"提供了一个名为SyExpat的XML解析库,它是Expat库的Symbian版本,适合用于在Symbian平台上进行XML数据的解析。通过事件驱动的机制,开发者可以高效地处理XML文档中的各种...

Global site tag (gtag.js) - Google Analytics