#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` 是一个开源的XML解析库,提供了一种高效、跨平台的方式来处理XML数据。无论是为了学习XML解析的原理,还是为了在实际项目中使用,这个库都是一个非常有价值的工具。
总结起来,expat-2.2.5.tar.bz2是一个在Linux环境中用C语言编写的XML解析库,通过事件驱动的方式帮助开发者处理XML数据。了解并熟练使用expat库,对于在Linux系统中进行XML相关开发的程序员来说,是提高效率和保证...
**正文** 在IT安全领域,定期更新和修补系统组件是至关...总结来说,升级CentOS 7中的Expat库至2.5版本是一项关键的安全措施,旨在修复潜在的漏洞,保护系统不受攻击。通过遵循上述步骤,您可以安全地完成这一过程。
总结,expat-2.4.1是Linux环境中一个强大且高效的XML解析库,适用于对性能有较高要求的项目。通过理解其基本工作原理和使用方法,开发者可以轻松地在自己的应用中集成XML解析功能,实现数据的交换和处理。
### PHP XML Expat 解析...**总结**:Expat解析器作为一种高效的XML解析工具,适用于需要处理大量XML数据的应用场景。通过对回调函数的设置,开发者能够灵活地控制XML文档的解析过程,从而实现对数据的有效处理和利用。
在处理XML时,使用Expat解析器的基本步骤通常包括初始化解析器、设置事件处理器、读取XML数据和释放解析器资源。以下是一个简单的例子,展示如何使用PHP的Expat解析器处理XML文件: 首先,需要创建一个XML解析器...
总结来说,这篇文章主要介绍了如何利用PHP的expat函数库,结合自定义的PHP类,解析XML文档并将内容转换成HTML格式。通过`newsboy`类的设计,我们可以看到XML解析的基本流程,包括创建解析器,设置事件处理函数,以及...
总结来说,Expat是一个在Linux/Unix系统中广泛使用的XML解析库,通过其小巧高效的特性,为开发者提供了处理XML数据的强大工具。无论是简单的数据解析还是复杂的网络通信,Expat都能胜任。通过熟练掌握Expat,开发者...
总结一下,使用PHP和Expat解析XML的主要步骤包括: - 引入Expat函数或封装的类。 - 创建解析器实例并配置参数。 - 注册回调函数以处理XML事件。 - 启动解析过程。 - 处理解析结果。 - 清理资源。 通过这种方式,...
**总结** "expat"库是Elixir社区的一个项目,旨在提供一套可重用且可组合的模式,以促进代码的模块化和库之间的协同工作。它利用了Elixir的模式匹配、宏、类型系统和守卫等特性,来实现高效且灵活的代码设计。通过...
总结,libexpat是XML解析的利器,尤其在内存有限或需要高性能解析的环境中。20190313版本的源代码更新为开发者提供了最新的开发资源,便于他们根据自身需求进行定制和优化。了解并掌握libexpat的使用,将极大地提升...
### 总结 以上分析揭示了Python标准库中不同模块间的代码相似性和潜在的代码重用现象。这对于理解Python内部模块的设计理念、代码复用策略以及提高代码质量具有重要意义。通过这些案例的学习,我们不仅可以了解...
#### 四、总结 完成上述步骤后,SVN服务已经在Linux (CentOS 6.2) 上成功安装。需要注意的是,在安装过程中遇到的任何问题,都需要仔细排查解决。此外,安装完成后还需要进一步配置SVN仓库、权限等,才能真正投入...
#### 六、总结 通过以上步骤,我们可以成功在CentOS 5系统上安装并配置好Ganglia监控系统。需要注意的是,实际操作时可能会遇到一些意料之外的情况,这时需要耐心排查问题,逐一解决。此外,对于生产环境,还应考虑...
#### 五、总结 通过上述分析可以看出,D-Bus不仅提供了一种高效、简洁的方式来实现进程间通信,而且还具有灵活的命名机制和强大的路由功能。无论是对于系统级的开发还是桌面应用的开发,D-Bus都是一种非常有用的...
expat \ gcc \ gcc-c++ \ glibc \ glibc-common \ glibc-devel \ glibc-headers \ libaio \ libaio-devel \ libgcc \ libstdc++ \ libstdc++-devel \ make \ pdksh \ sysstat \ unixODBC \ unixODBC-devel ``` **...
### 六、总结 通过上述步骤,不仅可以成功地在主机上安装和配置Libjingle,还可以将其部署到目标设备上,从而实现基于Google Talk服务器的P2P通信功能。在整个过程中,需要注意细节,特别是依赖关系的处理,以确保...
总结 腾讯云 SDK 的使用流程包括交叉编译所需的环境依赖、交叉编译 curl 库、交叉编译 apr 库、交叉编译 apr-util 库等步骤。每个步骤都需要正确安装依赖库,否则可能会出现错误。在使用腾讯云 SDK 之前,需要仔细...
总结一下,这个"Symbian XML解析工具(压缩包)"提供了一个名为SyExpat的XML解析库,它是Expat库的Symbian版本,适合用于在Symbian平台上进行XML数据的解析。通过事件驱动的机制,开发者可以高效地处理XML文档中的各种...