先来看看什么是xml.
XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
例如下面是一个xml格式的文件:
200001 zhangsan zhangsan@sina.cn zhangsan.chain.com 200002 lisi lisi@sina.cn lisi.sina.cn 200003 wangwu wangwu@sina.cn wangwu.sina.cn 200004 zhaoliu zhaoliu@sina.cn zhaoliu.sina.cn
第一行是 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#include#include#includeint 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文件没问题,再看看代码是否有问题,调试看看。