[libexpat]_[XML处理]_[C/C++使用libexpat库以数据流(SAX模型)的方式读取(解析)大XML文件]
来源:互联网 发布:单机收银软件免费版 编辑:程序博客网 时间:2024/04/30 05:29
优点:
1.当处理大文件XML时,只读取特定的数据。
2.速度快。
3.内存占用少。
缺点:
1.只支持XML文件,HTML文件不支持。
2.需要自己实现特定的存储结构。
以下是编译的Makefile文件:
CP="cp -u".build-post: test.exe${CP} E:/software/Lib/file/xml-expat-2.0.1/win32/release/share/libexpat-1.dll .test.exe:test.og++ -o test.exe test.o -LE:/software/Lib/file/xml-expat-2.0.1/win32/release/share -lexpattest.o:test.cppg++ -IE:/software/Lib/file/xml-expat-2.0.1/win32/release/share/include -c test.cpp -o test.o
以下是源代码:
#include <stdio.h>#include <string>#include <iostream>#include <string.h>#include "expat.h"using namespace std;#define XML_FMT_INT_MOD "l"static bool sectPrStart = false;static void StartElementHandler(void *userData,const XML_Char *name, const XML_Char **atts){if(!strcmp("w:sectPr",name)){sectPrStart = true;for (int i = 0; atts[i] != 0; i += 2){cout << "name: " << atts[i] << endl;cout << "value: " << atts[i+1] << endl;}}}static void EndElementHandler(void *userData,const XML_Char *name){if(!strcmp("w:sectPr",name)){sectPrStart = false;cout << "End element name: " << name << endl;}}static void CharacterDataHandler(void *userData,const XML_Char *s, int len){if(sectPrStart && s){string str(s,len);cout << "inner Text: " << str << endl;}}int main(int argc, char *argv[]){cout << "Start............................." << endl;int i = 0;XML_Parser parser = XML_ParserCreate(NULL);XML_SetUserData(parser, &i);XML_SetElementHandler(parser, &StartElementHandler,&EndElementHandler);{XML_SetCharacterDataHandler(parser,&CharacterDataHandler);}int WRITEBUFFERSIZE = 5242880; // 5Mb bufferint size_buf = WRITEBUFFERSIZE;void* buf = malloc(size_buf);const char* file_path = argv[1];FILE* file = fopen(file_path,"r");int ret = 0;while(!feof(file)){ret = fread(buf,1,size_buf,file);cout << "ret: " << ret << endl;if (XML_Parse(parser, (char*) buf, ret, 0) == XML_STATUS_ERROR){fprintf(stderr, "%s at line %" XML_FMT_INT_MOD "u ->%s\n",XML_ErrorString(XML_GetErrorCode(parser)),XML_GetCurrentLineNumber(parser), file_path);break;}}//last callXML_Parse(parser, (char*) 0, 0, 1);free(buf);XML_ParserFree(parser);fclose(file);cout << "End............................." << endl;return 0;}
- [libexpat]_[XML处理]_[C/C++使用libexpat库以数据流(SAX模型)的方式读取(解析)大XML文件]
- [libxml2]_[C/C++]_[高效读取XML大文件]
- libexpat不能处理XML中非正常字符的问题
- [libxml2]_[C/C++]_[高效输出XML大文件]
- [libxml2]_[C/C++]_[使用libxml2读取分析xml文件]
- [libxml2]_[C/C++]_[使用libxml2读取内存的xml片段]
- android汇总_使用Pull解析器读取XML文件
- 使用SAX处理大XML文件
- 使用SAX方式解析XML文件
- SAX方式读取XML文件
- sax模型解析xml文件
- android解析xml文件的SAX方式
- 详解使用sax解析xml文件的DefaultHandler处理类
- 详解使用sax解析xml文件的DefaultHandler处理类
- 详解使用sax解析xml文件的DefaultHandler处理类
- SAX方式解析XML文件
- xml文件--SAX方式解析xml文件
- 使用SAX方式解析XML
- 函数封装时几个封装方法
- VC++2012编程演练数据结构《13》单链表
- Android学习笔记 - 数据库篇 (SQLite)
- 韩顺平_php从入门到精通_视频教程_第22讲_可爱屋首页面(浏览器兼容)评讲_学习笔记_源代码图解_PPT文档整理
- android:使用SQLite的Blob储存.mp3档案
- [libexpat]_[XML处理]_[C/C++使用libexpat库以数据流(SAX模型)的方式读取(解析)大XML文件]
- #vi编辑器01# 删除与保存
- ArcGIS API for Silverlight 实现轨迹回放
- 三角星号
- 【算法设计】背包问题2
- android 推送消息 php做推送服务端(参考与http://fanfq.iteye.com/blog/1405385)
- 关于nio的java.nio.channels.CancelledKeyException的解决方法
- sqlplus命令行登录方法 as sysdba
- 数据结构基础(C++版)(张力译版)校正 之二 .