//场景:解析大xml文件,得到<w:sectPr>元素,属性值,和它的子元素值。
//使用expat库
#include <string.h>
#include <stdio.h>
#include "expat.h"
#define BUFFSIZE 10240
char Buff[BUFFSIZE];
static bool sectPrStart = false;
void start(void *userData, const char *name, const char **atts) {
if(!strcmp("w:sectPr", name)){
sectPrStart = true;
}
if(sectPrStart){
printf("\n%s:\t", name);
for (int i = 0; atts[i]; i += 2){
printf(" %s = '%s' ", atts[i], atts[i + 1]);
}
}
}
void end(void *userData, const char *name) {
if(!strcmp("w:sectPr",name)){
sectPrStart = false;
}
}
int main(int argc, char **argv) {
argv[1] = "d:/document.xml";
XML_Parser p = XML_ParserCreate(NULL);
if (!p) {
fprintf(stderr, "error\n");
exit(-1);
}
int depth = 0;
XML_SetUserData(p, &depth);
XML_SetElementHandler(p, start, end);
const char* file_path = argv[1];
FILE* file = fopen(file_path,"r");
for (;;) {
int done;
int len;
len = fread(Buff, 1, BUFFSIZE, file);
if (ferror(file)) {
fprintf(file, "Read error\n");
exit(-1);
}
done = feof(file);
if (!XML_Parse(p, Buff, len, done)) {
fprintf(stderr, "Parse error at line %d:\n%s\n",
(int)XML_GetCurrentLineNumber(p),
XML_ErrorString(XML_GetErrorCode(p)));
exit(-1);
}
if (done){
break;
}
}
return 0;
}