前段时间学习了C语言使用cJOSN去解析json文件,都是工作需要才去学习的,现在这一篇C/C++解析xml文件,也是因为工作需要,不得已去学。
本来就会使用QT去解析了,但是还不够,使用QT语言编写的代码,无法在其他项目中去运行,所以,现在带来一篇自学tinyxml解析xml的文件的博客,供大家学习研究!
首先看一下XML文件的组成部分:
xml主要是由两部分组成,头部信息 和 节点
细分下来,头部信息就是开头这一串东西:
节点是:根节点、子节点、属性三部分。
如下图:
一个完整的xml文件由图中部分组成!
头部信息:这个是xml文件必须要有的一段描述语句;
根节点:xml文件由只有一个根节点(仅有),它是所有子节点的父节点;
子节点:可有多个,必须在根节点内;
属性:存储数据的一种方式。
这里所讲的tinyxml使用的是DOM解析方式,优点是解析速度快,缺点是无法解析复杂的xml文件。
下载tinyxml
https://sourceforge.net/projects/tinyxml/
下载后解压出来会得到以下文件:
其实只需要将我用红色方框框中的那六个文件拷贝到自己的项目中去,在添加到项目中就可以使用了。当然,也可以使用vs编译成lib库去调用,这个我编译过了,我这边使用不了,不知道原因,所以只能将源文件都拷贝到项目中去使用了。
像我这样,把文件都添加到项目中去,最后在需要使用的地方添加头文件: 就可以去解析了!
在Linux系统中也是可以这样去使用的!
创建一个xml文件,并为其插入头部信息 和 跟、子节点
并插入到xml类中
就是这一行东西
如图:
首先创建一个子节点,然后新建一个文本,将文本添加到子节点中,最后将字节点添加到根节点中。
如图:
如图:
如果只是想在控制台打印而已,那么可以直接调用函数就可以实现在控制台上打印出来了!
当执行完成后,会在指定路径创建一个xml文件,内容如下图:
往xml文件中添加节点元素
例:在上面创建的xml文件基础上,添加两个Book1子节点。
这里有两种方式,有点奇怪,当使用第一种方式读取xml文件时,xml中有多个子节点Book1时,由于属性都有相同的id、name、price,导致会读取失败,不得已让我搞出了第二种方式去读取进行初始化,这样就没问题!
1). 方式1
读取失败显示:
2). 方式2
定义xml文档类对象时指定文件名,然后在使用这个对象去调用LoadFile传参TIXML_ENCODING_LEGACY即可,具体传参是什么意思,我也不清楚,自己摸索出来的,其中有三个枚举可以选择,其他两个都不行,就这个可以!
我一般都是,第一种方式用不了,就用第二种方式初始化!
3). 对已存在的数据进行初始化
4). 也可以获取头部信息中的版本号和编码
这个定义是需要指定参数根节点的名字,然后再通过RootElement方法获取。
假设创建好后,在xml文件中是这样显示的:
和上面创建的思路代码是一样的,创建好后在插入到Book1节点中就好了
假设创建好后,在xml文件中是这样显示的:
执行完如上代码,会在xml文件中添加指定的节点元素,如下图
可以看到,创建相同子节点的代码都是一样的,也就是说,当需要创建几十个这个的子节点时,可以使用for循环去处理,至于数据可以使用数组是事先存储即可!
删除子节点
和上面 三、添加 的第1步骤 一样…
这个定义是需要指定参数根节点的名字,然后再通过RootElement方法获取。
像这种只有自己本身的,没有其他子节点的节点,它有两种方式去删除
1). 方式一
获取到对应节点后调用Clear()方法去删除。
2). 方式二
获取到对应节点后,根节点调用RemoveChild去删除,传参时需要对变量转换一下
建议还是使用第二种方式
a. 当然,如果Book节点不止一个时,如果需要删除特定的几个,可以使用for循环去删除
判断文本,符合条件就删除
调用FirstChildElement方法,传入子节点名字,可以获得第一个相同名字的子节点
调用NextSiblingElement方法,传入节点名字,可以获得下一个相同名字的节点
调用RemoveChild方法,是父节点删除子节点的方法
用if判断,然后符合条件进行删除即可!
这里讲一下if里面的操作:
首先删除当前pItem1后,pItem1就变为NULL值了,如果在进行判断pItem1,它就是等于NULL的,那么就直接结束循环了,有时候不等于NULL,再去使用它去获取下一个节点会报错。
所以,在删除之前,先获取下一个节点保存着,然后进行删除,最后将赋值回来就可以了!
假设执行完,xml中将会是这样:
可以使用直接写全代码的方式去删除,如上面的方式二一样,也可以使用for循环,然后用符合条件后去删除,这里就是使用了for循环去删除属性。
删除属性直接删除即可,不需要做其他什么操作!
假设执行完,xml中将会是这样:
思路和上面删除Book节点一样
这里是删除ID属性为2的Book1节点
假设执行完,xml中将会是这样:
执行后xml文件如下图:
修改(更改)XML中节点的值
例:将ID属性为3的Book1节点的Price属性值修改为33.33;将ID属性为1的Book1节点的Description子节点值修改为108个没房住,Page修改为999页。
和上面 三、添加 的第1步骤 一样…
和上面 三、添加 的第2步骤 一样…
符合条件后使用SetAttribute方法即可进行重新修改属性
执行后xml文件如下图:
首先使用FirstChildElement获得对应节点后,在使用FirstChild获得需要修改的文本指针对象,最后在调用SetValue就可以进行修改了
执行后xml文件如下图:
其实修改属性和修改节点值可以放在同一个for循环中去操作的!
执行完如下效果:
解析指定节点中值
和上面 三、添加 的第1步骤 一样…
和上面 三、添加 的第2步骤 一样…
当然,前面已将Book节点删掉了,所以获取到的Book为NULL
所以如果是指针,在使用前最好先判断一下再去使用!
直接调用Attribute,传入属性名即可获得属性的值;
获得对应解析的节点后,调用GetText可以获得里面的值;
解析控制台输出如下
到此,使用tinyxml操作xml文件的教程已经完毕了,相信学到这里的童鞋们应该会如何使用了,那快做项目去吧!
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/12163.html