Qt编程之Xml文件的读取 您所在的位置:网站首页 kml怎么读 Qt编程之Xml文件的读取

Qt编程之Xml文件的读取

2023-08-15 01:56| 来源: 网络整理| 查看: 265

目录

一、xml的格式说明

二、QT中读取xml的类与常用函数

三、代码思路

四、代码实现

五、结果展示

   XML最主要的功能是数据传输,有的时候可以当一个小型的数据库来使用,因为其定义标签高度自由,所以在一些软件需要经常修改的配置变量常常采用xml格式的文件来保存,在需要用到该变量时在事先写好的xml类型文件中进行修改。

  本篇博客给出的代码从如何完整读出一个xml文件的思路出发。

  逻辑难度不大,但需要读者耐心琢磨。方能写出一个属于自己的读取xml的通用函数。

  如果读者对xml格式已经如数家珍,请跳过xml的格式说明,直接进入思路分析

一、xml的格式说明

1.xml的头声明在语法上可有可无,但标准化的书写规范要求一定要有头声明

需要注意的是头声明的前后一定要有问号(?) ,否则在读取xml文件时会无法读取这条语句而造成读取失败。

2.xml有一个根节点,此处我们定义为root,需要强调的是任意节点都可以自定义,其标签定义是高度自由的。

章鱼 中国 18

根节点下的user和age称作子节点,user相对于homeland来说又是homeland的根节点。所以xml是一个树状结构,什么时候是根什么时候为子都是相对而言,但需要牢记xml文件只有唯一的一个根节点挂着所有的子节点。

图1.简单的树状结构 图1.简单的树状结构 二、QT中读取xml的类与常用函数

  QT中提供了一个读取xml的类QXmlStreamReader,该类在使用时就是创建一个读取xml文件的迭代器变量。

QXmlStreamReader xmlReader(&filename); //xmlReader就是一个迭代器

  常用的一些API函数如下:  1.通过readNextStartElement()挨个读入节点  2.通过isStartElement()和isEndElement()判断是节点的开始和结束  3.通过name()得到当前节点的名字  4.通过readElementText()访问当前节点的内容  5.通过attributes()获取还有属性节点的属性  6.通过atEnd()判断XML文件是否结束  7.通过hasError()判断XML文件是否出错

三、代码思路

  在了解xml的格式后,从人的角度出发,我们通常是看根节点,然后看根节点下的节点,读完一整个根节点的内容之后再去看下一个根节点。这样描述有些混乱,读者可以根据上述图1来进行理解。从根节点出发,然后读左一节点,读完左一节点后读中间节点,读完中间节点后读右一节点。

  那么转换到机器中(代码)我们需要怎么去做呢?既然是树状结构,且要一段一段的去读,应该只要设置一个迭代器,先找到根节点,然后去寻找根节点下的内容,节点中的内容进行再判定,符合条件执行代码,不符合条件跳过;读完一个节点的内容转到下一个节点去,就是读完左一节点,再到中间节点,直到将根节点遍历结束,也就是将xml文件遍历到文件结尾处。

  为此我想到要用if和while循环的结合,在找到某一个节点的条件下,用else if再判定节点中的条件,直到该条件结束之前,都要对该节点下的内容进行响应操作。

代码模式: if(xmlReader.name() == "根节点名字" && xmlReader.isStartElement()) { xmlReader.readNextStartElement(); while(!(xmlReader.name() == "根节点名字" && xmlReader.isEndElement()) { xmlReader.readNextStartElement(); if(xmlReader.name() == "节点名字1" && xmlreader.isStartElement()) { while(!(xmlReader.name() == "节点名字1" && xmlReader.isEndElement()) { ...... } } else if(xmlReader.name() == "节点名字2" && xmlreader.isStartElement()) { while(!(xmlReader.name() == "节点名字2" && xmlReader.isEndElement()) { ...... } } } } 四、代码实现

1.准备一个xml文档,名字为testconfig.xml,文档内容如下:

kingglore.xml zy 123456 孙悟空 孙悟空@qq.com 孙悟空.hello.cn 7891011 貂蝉 貂蝉@qq.com 貂蝉.hello.cn 1112131415 小乔 小乔@qq.com 小乔.hello.cn 1617181920 屠夫 屠夫@qq.com 屠夫.hello.cn

2.创建一个Qt工程,添加一个config类,用来实现xml文件的读取

config.h

#ifndef CONFIG_H #define CONFIG_H #include #include #include #include class Config { public: Config(); public: QString readConfig(); //读取xml文件的函数 }; #endif // CONFIG_H

config.cpp

函数实现中的file.setFileName(qApp->applicationDirPath()+"/Config/testconfig.xml");

Qt开发的程序猿都应该知道,在编译运行后会出现一个新生成的文件夹build-QT_XML-Desktop_Qt_5_12_4_MinGW_32_bit-Debug,小编将程序的保存路径设为D:/QT_code/

其中qApp是头文件QApplication中的指针,指代了该应用程序,在file.setFileName(qApp->applicationDirPath()+"/Config/testconfig.xml");处打断点进入调试

qApp->applicationDirPath()该语句的作用是找到应用程序的路径,获取的是D:/QT_code/build-QT_XML-Desktop_Qt_5_12_4_MinGW_32_bit-Debug

所以还需要在编译后手动在上述路径中手动添加Config文件夹,将testconfig.xml文件放在该文件夹下(也可以自己编写代码实现生成文件夹,读者不妨自己一试)

图2.文件路径 #include "config.h" #include Config::Config() { } QString Config::readConfig() { QFile file; //需要打开的文件 QString nodename; //节点的名字 QString OutPut; //最终输出的内容 file.setFileName(qApp->applicationDirPath()+"/Config/testconfig.xml"); //查找xml文件的路径 if (!file.exists()) { qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有