#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
expat-2.3.0.tar.gz
expat2.2.6安装包
expatexpat.dll
Expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被...
linux expat
使用expat解析器解析XML文件,并显示在树控件。
刚刚学习使用Expat,却发现Expat并不支持中文。后来查找相关资料,得知Expat不支持gb2312编码格式,主要支持UTF-8编码格式。然而我们在程序中传递数据时,往往是用的gb2312格式文本的,于是想找出办法解决之,想到两...
Expat是一个用C语言开发的、用来解析XML文档的开发库,它最初是开源的、Mozilla 项目下的一个XML解析器。
Expat XML 源码,版本:1.95.8
expat, 用于安装subversion软件时使用
expat是一个由C语言编写的XML解析库。 James Clark创建了这个库,现在是制定XML标准的W3组织的技术leader。 现在的版本是2.0。 2.0开始就由Clark Cooper领导的开发组在 sourceforge.net 负责开发。
改进expat解析器,使之支持中文,测试通过
Expat是一个用C语言开发的、用来解析XML文档的开发库,它最初是开源的、Mozilla 项目下的一个XML解析器,这是一个源码包,可以自己编译使用
刚学习Expat的时候,发现Expat并不支持中文XML的解析,因此对其进行了封装,内附编译好的可执行程序及测试用XML文件,命令行:ExpatSaxDemo demo.xml 详细信息参见:...
expat最新源码2.0.1
expat是一个由C语言编写的XML解析库。expat是一个基于SAX模型的、非验证(默认,v1.2开始提供验证接口,需要用户手动处理)的轻量级XML解释器。但除此之外,一个XML文档因其内容的不同还必须在语义上符合相应的标准,...
expatxml解析器.pdf
expat-1.95.7.tar.gz
expat xml解析(C语言),还没解决中文问题,希望有高手能帮忙做下UTF8转换的通用代码,不受操作系统的限制的!!