C++中使用Expat解析XML-基础电子_第1页
C++中使用Expat解析XML-基础电子_第2页
C++中使用Expat解析XML-基础电子_第3页
C++中使用Expat解析XML-基础电子_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑C++中使用Expat解析XML-基础电子使用expat的原因很多,主要还是因为expat更灵活。习惯了TinyXML,一开始不太习惯expat,分析一下,其实很容易上手的。

1.回调函数

以下解析xml文件中的elment,attribute和text。expat使用回调方式返回xml数据,解析器解析到一个element及其内部属性后,将调用事先设置好的函数,同样,当element结束和text结束后,也会分别调用对应的函数。

2.如何处理数据之间的包含关系

典型的方式是定义三个函数分别处理elment开始(含属性)、element结束和文本内容。回调函数的个参数是自定义的,通常用于存储XML文档的上下文信息,用XML_SetUserData可以设置这个参数,下例中传递一个整数指针,以便在每次回调时能知道该元素是第几层元素。

该参数也可以是一个栈对象的地址,开始一个元素时,将新元素对应的数据压入堆栈,处理下元素时,新元素是栈顶元素在子元素,然后处理完了继续把该元素压入堆栈,继续下新的子元素。当元素结束后,需要出栈,以便解析下个兄弟元素程时能取到父节点。

好啦,基本应用还是很简单的,实际上Expat的API函数不多。

3.如何处理属性

属性通过ElementHandler回调函数传入,这里有一个char**atts就是属性,这是一个字符指针数组,如果有N个属性,数组大小就是2*N+1,一个素组元素为空指针,奇数指针对应属性名称,偶数指针对应属性值(字符串格式)。可以在一个循环中处理多个属性,当遇到空指针时,表示没有更多属性了。

好啦,先看sample吧:

#includeSTdio.h

#include"expat.h"

#pragmawarning(disable:4996)

#defineXML_FMT_INT_MOD"l"

staticvoidXMLCALLstartElement(void*userData,constchar*name,constchar**atts)

{

inti;

int*depthPtr=(int*)userData;

for(i=0;i*depthPtr;i++)

printf("");

printf(name);

*depthPtr+=1;

for(i=0;atts[i]!=0;i+=2)

{

printf("%s=%s",atts[i],atts[i+1]);

}

printf("\n");

}

staticvoidXMLCALLendElement(void*userData,constchar*name)

{

int*depthPtr=(int*)userData;

*depthPtr-=1;

}

intmain(intargc,char*argv[])

{

charbuf[BUFSIZ];XML_Parserparser=XML_ParserCreate(NULL);

intdone;intdepth=0;

XML_SetUserData(parser,depth);

XML_SetElementHandler(parser,startElement,endElement);

FILE*pFile=argc2?stdin:fopen(argv[1],"rb");

do

{intlen=(int)fread(buf,1,sizeof(buf),pFile);

done=lensizeof(buf);

if(XML_Parse(parser,buf,len,done)==XML_STATUS_ERROR)

{

fprintf(stderr,"%satline%"XML_FMT_INT_MOD"u\n",

XML_ErrorString(XML_GetErrorCode(parser)),

XML_GetCurrentLineNumber(parser));

return1;

}

}

while(!done);

XML_ParserFree(parser);

fclose(pFile);

return0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论