C++如何遍历xml文档

XML文档我想很多编程的小伙伴都知道吧,这个在json出来之前一直是数据交换领域的首选,只是随着时代的发展,xml逐渐不再流行了,但是xml还是在数据领域有十分庞大的占有率。小编就碰到在工厂中用xml形式存储机台加工参数。那么,如果我们想要针对这些xml数据进行开发,就必须要先会遍历它,将之所有数据取出来。

接下来我们就一起来看下C++如何遍历xml吧。其实这种标签型语言都存在遍历的思路都是一样的,只是用的语言不同而已,像html可能大部分用的就是js吧!

首先给大家看一下我自己写的简单的xml文档

下面是xml代码

<people>
 <man name="jordan">
 <child name="nike">i am a boy<child>
 <classMate>it nike'classMate<classMate>
 </man>
 <woman name="lily">
 <child name="lucy">a am a girl<child>
 <classMate>it lucy'classMate<classMate>
 </woman>
</people>

首先看下这个文档能不能用

#include <stdio.h>
#include <iostream>
#include "tinyxml2.h"//这里我用的是tinyxml2库,在网上下载的,有需要的可以私信我
using namespace std;
int main()
{
tinyxml2::XMLDocument doc ;
int result = doc.LoadFile("test.xml");
if(result == tinyxml2::XML_SUCCESS)
{
cout<<"load success"<<endl;
}
system("pause");
}

运行代码

OK,没问题,接下来开干,先貼截圖

下面是原代碼

#include <stdio.h>
#include <iostream>
#include "tinyxml2.h"
using namespace std;
void xmlReaderFunc(tinyxml2::XMLElement* node)
{
//这一行代码是没有用的,在这里是为了给大家输出节点名称让大家更清楚的知道他的逻辑
if (node != NULL)cout<<node->Name()<<endl;
//递归结束条件
if (node == NULL)
{
;//cout<<"node null"<<endl;
}
else if (node->FirstChildElement()==NULL)
{
xmlReaderFunc(NULL);
}
else if (node->FirstChildElement()!=NULL)
{
//获得当前节点的第一个子节点
tinyxml2::XMLElement* child_node = node->FirstChildElement();
xmlReaderFunc(child_node);
//获取当前节点的第一个子节点的下一个兄弟节点
child_node = child_node->NextSiblingElement();
while (child_node != NULL)
{
xmlReaderFunc(child_node);
child_node = child_node->NextSiblingElement();
}
xmlReaderFunc(NULL);
}
}
int main()
{
tinyxml2::XMLDocument doc ;
int result = doc.LoadFile("test.xml");
if(result == tinyxml2::XML_SUCCESS)
{
//cout<<"load success"<<endl;
}
//获取到根节点
tinyxml2::XMLElement* root_element = doc.RootElement();
//将根节点传入函数开始遍历
xmlReaderFunc(root_element);
system("pause");
}

然后看一下运行结果:

这个是用到了一个递归的思想,递归思想主要有两个点:1、前一个与后一个的关系。2、终结条件。

大家看输出的标签名再结合代码就能知道是怎么一个遍历过程了。

其实很简单,就是它在每次调用xmlReaderFunc方法的时候都会将这个节点的子第一个子节点先全部遍历完然后再去遍历跟他同级的兄弟节点,这样循环去调用,直至找到的节点为空就结束。

我再将xml更改一下,各位再看一下输出结果应该就更清楚了

<people>
 <man name="jordan">
 <child name="nike">i am a boy</child>
 <grandSon name="addidas">i am a grandSon</grandSon>
 <classMate>it nike'classMate</classMate>
 </man>
 <woman name="lily">
 <child name="lucy">a am a girl</child>
 <granddaughter name="kaka">i am a granddaughter</granddaughter>
 <classMate>it lucy'classMate</classMate>
 </woman>
</people>

我这边在child节点下面新增了grandSon 和granddaughter 两个节点,我们看一下输出结果:

这样是不是对整个遍历的过程更加清楚了呢?

如果大家有需要tinyxml2库的或者不懂得可以私信我,然后后期我会继续更新tinyxml2库的一些其他用法,还有更新的json库的用法,谢谢大家~~~~

举报
评论 0