用expat解析xml文件c++

本文介绍了如何使用expat库在C++中解析XML文件,详细阐述了XML_ParserCreate、XML_SetUserData、XML_SetElementHandler等关键步骤,并通过示例解释了StartElementHandler、EndElementHandler和CharacterDataHandler三个回调函数的用途。文章还提到了XML格式的基本结构以及expat解析XML的注意事项。
摘要由CSDN通过智能技术生成

expat就是用来解析XML格式的文件的库

XML格式如下

<name>
	<red>apple</red>
	<blue></blue>
	<green>tree</green>
	<pink>hello kitty</pink>
</name>

第一个<name>和最后一个</name>被称为一对键值对,相当于是一个标记。没有"\"的表示是起始标记,含有"\"的是结束标记。中间的所有数据就是<name>这一对键值对包含的内容。

同理<red>和</red>也是一对键值对,也是一个标记。<red>表示起始标记,</red>表示结束标记。"apple"则为<red>这一对键值对的内容。

所以,键值对中可以包含别的键值对。

在了解了XML格式的数据后,我们就可以来解析它了。

 

直接先给大家看一下主函数

int main()
{
	XML_Parser parser = XML_ParserCreate(NULL);         // 第一步
	XML_SetUserData(parser, elempt);                    // 第二步
	XML_SetElementHandler(parser,StartElementHandler,EndElementHandler);    // 第三步
	XML_SetCharacterDataHandler(parser,CharacterDataHandler);               // 第四步

	XML_Parse(parser, buf.c_str(), buf.length(), 1);    //第五步

	XML_ParserFree(parser);                            //第六步
	return 0;
}

主函数非常简单,只要前5步就可以解析xml格式的数据,从中得到我们想要的数据,最后释放句柄。

1.第一步。通过  XML_ParserCreate(NULL) ,函数建立一个XML_Parser格式的对象"parser",参数一般为NULL。后面这段话是自己编的(这个对象的概念本人不是非常理解。只能讲讲自己的理解。相当于建立"parser"这一个变量,而这个变量不是我们普通的变量,是XML_Parser类型的。就比如说,int和float类型,虽然占用的字节数一样,但是解析方式完全不一样,他们有各自的解析方式。而XML_Parser类型的也有自己的解析方式,我们必须以XML_Parser能识别的方式来存储数据。XML_ParserCreate函数就是能建立一个XML_Parser类型的数据。这个XML_Parser类型的数据格式是整个解析XML格式的基础。)

2.第二步。XML_SetUserData(parser, char *elempt),parser就是第一步中建立的对象。elempt是一个char *类型的字符串。这个字符串会在expat内部传递给其他函数。这个参数的作用会在下面的实际例子中展示。

3.第三步。XML_SetElementHandler(parser,StartElementHandler,EndElementHandler),parser就是第一步中建立的对象。StartElementHandler是一个回调函数。回调函数的具体概念不讲,可以自行百度。这个函数的作用就是在解析一个XML格式的文件时,每当遇到一个起始标记<name>、<red>、<green>时都会执行一次这个函数,有几个起始标签就会执行几次这个函数。同理。EndElementHandler也是一个回调函数,每当遇到结束标签</name>、</red>、</green>时都会执行一次这个函数,有几个结束标签就会执行几次这个函数。

4.第四步。XML_SetCharacterDataHandler(parser,CharacterDataHandler),parser就是第一步中建立的对象。CharacterDataHandler也是一个回调函数。每当遇到一对键值对中存在内容时,就会执行一次函数。结合第三步,我给大家讲一下整个过程。以本篇最开始的XML格式的数据为例。

4.1解析开始,遇到<name>起始标签,执行一次StartElementHandler。

4.2遇到<red>,因为这个<red>是起始标签,执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值