先来看看什么是xml.
XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
例如下面是一个xml格式的文件:
<?xml version="1.0" encoding="UTF-8"?>
<Msg>
<Data id="1">
<Number>200001</Number>
<Name>zhangsan</Name>
<email>zhangsan@sina.cn</email>
<website>zhangsan.chain.com</website>
</Data>
<Data id="2">
<Number>200002</Number>
<Name>lisi</Name>
<email>lisi@sina.cn</email>
<website>lisi.sina.cn</website>
</Data>
<Data id="3">
<Number>200003</Number>
<Name>wangwu</Name>
<email>wangwu@sina.cn</email>
<website>wangwu.sina.cn</website>
</Data>
<Data id="4">
<Number>200004</Number>
<Name>zhaoliu</Name>
<email>zhaoliu@sina.cn</email>
<website>zhaoliu.sina.cn</website>
</Data>
</Msg>
第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 UTF-8
下面的内容是xml的节点元素内容,节点可以有属性,例如Data节点有id的属性,可以进行区分不同的Data.
Msg是根元素,xml必须要包含根元素,Data是子元素(或者说节点,每个人的叫法不同),每个Data还可以包含子元素。
C++ 解析xml有很多种形式,例如tinyxml, boost xml等,都可以对xml内容进行解析,Qt也提供了xml的解析方法,下面用QXmlStreamReaer来解析 。
写代码前,需要先包含xml模块,如下图:
创建一个控制台项目,hello.xml的内容就用上面的xml
代码如下:
#include <QCoreApplication>
#include <QXmlStreamReader>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//将xml文件读取数据
QFile file("D:/QtCreator_Project/XmlParse_01/hello.xml");
bool isOk = file.open(QIODevice::ReadOnly | QIODevice::Text);
if(isOk)
{
QXmlStreamReader reader(&file);
//reader.setDevice(&file); 也可以使用这种形式
while(!reader.atEnd())
{
//判断是否是节点的开始
if(reader.isStartElement())
{
QXmlStreamAttributes attributes = reader.attributes();
//判断是否存在属性"id"
if(attributes.hasAttribute("id"))
{
qDebug() << attributes.value("id").toString();
}
//判断当前节点的名字是否为Number
if(reader.name() == "Number")
{
qDebug() << reader.readElementText();
}
else if(reader.name() == "Name") //判断当前节点的名字是否为Name
{
qDebug() << reader.readElementText();
}
else if(reader.name() == "email") //判断当前节点的名字是否为email
{
qDebug() << "email = " << reader.readElementText();
}
else if(reader.name() == "website") //判断当前节点的名字是否为website
{
qDebug() << "website " << reader.readElementText();
}
}
else if(reader.isEndElement() && reader.name() == "Data") //节点结束、并且节点名字为Data(含有子节点)
{
qDebug() << "---------------------------------";
}
reader.readNext();
}
file.close();
}
else
{
qDebug()<<"Open file hello.xml failure";
}
return a.exec();
}
运行结果如下:
有时在解析时会出错,先可以看看是否是xml格式有问题,如果能用浏览器打开,说明xml文件没问题,再看看代码是否有问题,调试看看。